You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ProGuard移除构造函数变量注解致@CatalogSync反射识别失效问题

问题解决方案

混淆后反射遍历memberProperties失效的核心原因是Kotlin元数据丢失和注解关联的成员被混淆/移除,以下是修正后的ProGuard规则及说明:

修正后的ProGuard规则

# 保留Kotlin元数据(必须,否则无法通过反射获取memberProperties)
-keep class kotlin.Metadata { *; }

# 保留注解相关属性,确保注解信息不丢失
-keepattributes *Annotation*, Signature, InnerClasses

# 完整保留@CatalogSync注解本身,包括其所有元素
-keep @interface com.company.test.CatalogSync { *; }

# 保留所有类中带有@CatalogSync注解的字段和方法(覆盖Kotlin属性对应的字段与访问器)
-keepclassmembers class * {
    @com.company.test.CatalogSync <fields>;
    @com.company.test.CatalogSync <methods>;
}

# (可选)明确保留你的Repository类构造函数与带注解的属性,避免被过度优化
-keep class com.company.test.YourRepositoryClass {
    <init>(...);
    @com.company.test.CatalogSync <fields>;
}

规则说明

  1. kotlin.Metadata必须保留:Kotlin类的memberProperties反射依赖该注解存储的类结构信息,混淆时默认会移除或混淆它,导致无法遍历属性。
  2. 注解相关属性保留:*Annotation*确保注解本身不被移除,Signature和InnerClasses辅助Kotlin反射处理泛型与内部类结构。
  3. 修正注解保留规则:原规则中-keep,allowobfuscation @interface ...允许混淆注解名称,会导致反射时无法匹配;替换为-keep @interface ... { *; }完整保留注解的所有定义。
  4. 保留带注解的成员:原规则中-keep @com.company.test.CatalogSync class *针对的是类级注解,而你的注解用于属性,因此需要明确保留带有该注解的字段和方法(Kotlin属性编译后对应字段+访问器方法)。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:17:45