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

