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>; }
额外排查点
- 如果使用R8优化,需补充规则:
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault - 确认
build.gradle中已正确引入kotlin-reflect依赖,且Release模式下未被移除:implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
原因说明
错误栈中的InvalidProtocolBufferException是因为ProGuard破坏了Kotlin内置库的元数据文件结构,Kotlin反射初始化时需要解析这些元数据获取内置类型信息,结构被破坏后直接触发初始化异常。上述规则通过保护反射核心实现、元数据标记和自定义反射目标类,彻底解决该问题。
内容的提问来源于stack exchange,提问作者MohammadReza Berenji
相关产品推荐
相关产品推荐

