开启代码混淆后App崩溃,如何适配minSdkVersion 21?
解决方案:低版本SDK开启混淆后Lifecycle相关崩溃问题
问题根源
开启minifyEnabled true和shrinkResources true后,R8/ProGuard会移除仅在API 28(Android 9)及以上存在的android.app.Application$ActivityLifecycleCallbacks$-CC合成类,但AndroidX Lifecycle组件的ReportFragment在低版本设备(API21)上会尝试调用该类,导致NoClassDefFoundError崩溃。
可行解决方案
方案1:添加ProGuard保留规则
在项目的proguard-rules.pro文件中添加以下规则,阻止混淆工具移除相关类和方法:
# 保留ActivityLifecycleCallbacks的默认方法合成类 -keep class android.app.Application$ActivityLifecycleCallbacks$-CC { *; } # 或者更精准地保留新增的默认方法 -keepclassmembers class android.app.Application$ActivityLifecycleCallbacks { public default void onActivityPreStarted(android.app.Activity); public default void onActivityPostStopped(android.app.Activity); }
添加后重新编译打包即可解决崩溃,同时保持minSdkVersion=21和混淆开启的状态。
方案2:升级AndroidX Lifecycle库
将项目中Lifecycle相关依赖升级到2.6.0及以上版本,例如在build.gradle(Module级别)中更新:
dependencies { implementation 'androidx.lifecycle:lifecycle-runtime:2.6.2' }
更高版本的Lifecycle库已经修复了低版本设备上的这个兼容性问题,无需额外添加ProGuard规则即可正常运行。
内容的提问来源于stack exchange,提问作者张乘铭
相关产品推荐
相关产品推荐

