R8混淆后Kotlin静态方法无法识别?伴生对象调用异常
解决R8混淆后Kotlin伴生对象@JvmStatic方法无法通过类直接调用的问题
你的问题核心是R8混淆破坏了Kotlin元数据中主类与伴生对象静态方法的关联映射——虽然你已经标注了@JvmStatic且静态方法实际存在,但Kotlin编译器无法通过元数据识别到这种关联,只能让你显式调用Companion。
修正后的ProGuard规则
你需要调整规则,确保Kotlin用来识别类结构的Metadata属性不被移除,同时保留主类与伴生对象的元数据绑定:
-keep @interface kotlin.Metadata { *; } # 必须保留Metadata属性,这是Kotlin识别静态方法映射的关键 -keepattributes RuntimeVisibleAnnotations, Metadata # 保留MyClass的所有public方法、静态方法,以及它的Kotlin元数据 -keep public class com.example.MyClass { public <methods>; public static <methods>; @kotlin.Metadata *; } # 保留Companion类的public方法,确保静态方法的委托目标存在 -keep public class com.example.MyClass$Companion { public <methods>; }
规则说明
- 添加
Metadata到keepattributes:Kotlin的类结构信息(包括@JvmStatic方法的映射关系)都存在Metadata属性里,R8默认会优化移除这类属性,导致编译器无法识别类级别的静态调用。 - 保留主类的
@kotlin.Metadata注解:确保MyClass的元数据不被混淆或删除,让Kotlin能正确关联主类与伴生对象的静态方法。 - 原有的
Companion类keep规则可以保留,因为静态方法最终还是委托给它实现。
如果问题仍存在,可以额外添加以下规则,确保类名不被混淆(避免元数据中的类名映射失效):
-keepnames class com.example.MyClass -keepnames class com.example.MyClass$Companion
内容的提问来源于stack exchange,提问作者David Liu
相关产品推荐
相关产品推荐

