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

Release模式下Kotlin反射崩溃求助:ProGuard配置后仍异常

Kotlin反射在Release模式崩溃的解决方案

从错误栈来看,核心问题是Kotlin反射的内置元数据(Protobuf格式)被ProGuard/R8破坏,导致解析内置库信息时抛出InvalidProtocolBufferException。你之前的规则只覆盖了自定义数据类和枚举,但没保护Kotlin反射的底层实现和元数据结构。

修正ProGuard规则

添加以下规则到你的proguard-rules.pro文件:

# 保护Kotlin反射底层实现类,禁止混淆和移除
-keep class kotlin.reflect.jvm.internal.** { *; }

# 保留Kotlin类的元数据标记,反射依赖此识别类结构
-keep class kotlin.Metadata { *; }
-keepclassmembers class ** {
    @kotlin.Metadata <fields>;
}

# 确保自定义数据类、枚举类的名称和成员不被混淆(根据你的包路径调整)
-keepnames class com.ebcom.ewano.model.** { *; }
-keepnames enum com.ebcom.ewano.enums.** { *; }

# 保留用到反射的工具类(比如你的AppUtils)及其方法
-keep class com.ebcom.ewano.util.AppUtils {
    public static <methods>;
}

额外排查点

  1. 如果使用R8优化,需补充规则:
    -keepattributes RuntimeVisibleAnnotations,AnnotationDefault
    
  2. 确认build.gradle中已正确引入kotlin-reflect依赖,且Release模式下未被移除:
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    

原因说明

错误栈中的InvalidProtocolBufferException是因为ProGuard破坏了Kotlin内置库的元数据文件结构,Kotlin反射初始化时需要解析这些元数据获取内置类型信息,结构被破坏后直接触发初始化异常。上述规则通过保护反射核心实现、元数据标记和自定义反射目标类,彻底解决该问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:43:13