升级Gradle插件后ProGuard行为改变,类被从构建的APK中剔除问题
问题解答
1. dontwarn/dontnote是否有保留类的作用?
完全没有。-dontwarn的作用仅为屏蔽ProGuard处理对应类时输出的警告日志,-dontnote的作用仅为屏蔽对应类的提示日志,两个配置都不会干预ProGuard的代码收缩逻辑,也从来没有告知ProGuard保留对应库的作用。
旧版本AGP下这部分类没有被剔除,是因为旧版本构建流程的代码收缩逻辑更宽松,未被静态引用的三方依赖类也会默认纳入APK,和这两个配置无关。
2. 是否需要给所有仅配置了dontwarn/dontnote的库加-keep规则?
不需要。
ProGuard的代码收缩本身就是为了剔除未被使用的类以减少包体积,盲目给所有库加-keep反而会导致包体积不必要的增大。你只需要给两类内容加-keep规则即可:
- 运行时会通过反射调用的类、方法、字段
- 实际用到、但构建收缩时被误删,已经确认确实缺失的类
你可以通过release构建输出的缺失类日志,或者运行App测试功能时的类找不到报错,针对性加规则即可。
3. 本次Gradle插件升级是否是行为变化的原因?
是。
AGP 3.6及以上版本对代码收缩逻辑做了大幅调整,默认启用更严格的收缩规则,只会保留被应用代码静态引用到的类,无引用的类哪怕加了-dontwarn也会被剔除。另外AGP 4.2版本已经默认切换R8作为默认的混淆收缩工具,即使你配置了useProguard=true也会走R8兼容模式,R8本身的收缩逻辑比旧版ProGuard严格很多,也是触发该问题的直接原因。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

