开启minifyEnabled后引用混淆AAR的Android App出现ExceptionInInitializerError崩溃
问题根因
你引入的CSRMesh库本身已经完成混淆,你的项目开启minifyEnabled=true后,ProGuard/R8对CSRMesh库的代码进行了二次混淆、成员删除或代码优化,导致库内部静态初始化逻辑执行失败,抛出java.lang.ExceptionInInitializerError异常。
可行解决方案
1. 配置CSRMesh专属混淆规则
在你的项目proguard-rules.pro文件中添加以下规则,完全保留CSRMesh库的所有代码不被二次处理:
# 保留CSRMesh库所有类和成员不被混淆、删除 -keep class com.csr.** { *; } # 禁止打印CSRMesh库相关的编译警告 -dontwarn com.csr.** # 若库内部使用了Parcelable序列化,额外添加以下规则避免序列化失败 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # 若库内部使用了枚举,额外添加以下规则保留枚举方法 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }
2. 额外检查项
- 如果你自己实现了CSRMesh库提供的接口(例如自定义Bearer回调、事件监听等),需要额外为你自己的实现类添加keep规则,避免库调用你的实现方法时找不到对应方法:
-keep class 你自己的实现类全路径 { *; } - 若使用高版本AGP默认开启R8全量压缩,可以在
gradle.properties中添加临时配置验证是否是R8优化过度导致:android.enableR8.fullMode=false
3. 验证规则生效
打包Release包后,打开项目路径下build/outputs/mapping/release/seeds.txt文件,搜索MeshService、BluetoothBearer等库核心类,确认这些类存在于文件中,即代表规则生效,库代码不会被混淆处理。
内容的提问来源于stack exchange,提问作者Yash Joshi
相关产品推荐
相关产品推荐

