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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:27:02