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

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>;
}

规则说明

  1. 添加Metadata到keepattributes:Kotlin的类结构信息(包括@JvmStatic方法的映射关系)都存在Metadata属性里,R8默认会优化移除这类属性,导致编译器无法识别类级别的静态调用。
  2. 保留主类的@kotlin.Metadata注解:确保MyClass的元数据不被混淆或删除,让Kotlin能正确关联主类与伴生对象的静态方法。
  3. 原有的Companion类keep规则可以保留,因为静态方法最终还是委托给它实现。

如果问题仍存在,可以额外添加以下规则,确保类名不被混淆(避免元数据中的类名映射失效):

-keepnames class com.example.MyClass
-keepnames class com.example.MyClass$Companion

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:23:15