升级 gradle 后 Proguard 行为发生变化,从构建的 apk 中省略类
Posted
技术标签:
【中文标题】升级 gradle 后 Proguard 行为发生变化,从构建的 apk 中省略类【英文标题】:Proguard behavior change after upgrading gradle, omits classes from built apk 【发布时间】:2021-11-27 22:39:19 【问题描述】:几天前,我在我的 android Studio 项目中升级了 Gradle 插件, 已从 3.3.2 升级到 4.2.1
从那一刻起,ProGuard 的行为发生了一些变化,发布版 apk 中包含的库现在被省略了,
ProGuard 中唯一提到的缺失类如下(显示一个示例):
-dontwarn org.apache.log4j.**
-dontnote org.apache.log4j.**
当然,如果我要添加的话
-keep org.apache.log4j.**
或
-keep public class org.apache.log4j.xx
它将解决问题并将库添加到发布apk中,
似乎 dontwarn
或 '-dontnote' 曾经告诉 ProGuard 将这些库包含在发布 apk 中?
我是否需要将 -keep
添加到我的 ProGuard 配置文件中曾经有 -dontwarn
和“-dontnote”的所有库/类中?
升级 gradle 会导致这种行为变化吗?
先谢谢了
【问题讨论】:
【参考方案1】:似乎 dontwarn 或 '-dontnote' 用于告诉 ProGuard 将这些库包含在发布 apk 中?
不,他们只是告诉 Proguard 不要向您抱怨与 org.apache.log4j.**
相关的问题。否则它们不会影响 Proguard 的工作。
如果您有一个将警告视为错误的构建系统,这主要是有用的,因此外部依赖项的问题不会影响您的项目。
我是否需要在我的 ProGuard 配置文件中曾经有 -dontwarn 和 '-dontnote' 的所有库/类中添加 -keep?
嗯,这是一种做事方式,但不是最好的。通常,Proguard/R8(Android Gradle 插件中 proguard 的新替代品)足够聪明,可以确定您的依赖项的哪些部分正在被使用,而不是删除它们。此处不会发生这种情况,最好找出原因,这样您就不会扩大应用程序的大小。
一个大罪魁祸首是使用反射,在这种情况下,您应该使用注释来帮助告诉 proguard 保留这些。 https://www.guardsquare.com/manual/configuration/examples#annotated
升级 gradle 会导致这种行为变化吗?
有时,是的。 Proguard 和 R8 与许多工具一样,随着时间的推移在功能上有所改进。这会导致行为改变,有时会导致发展困难。虽然您的应用程序不再能够很好地编译是不好的,但这些工具试图更积极地进行剥离可能是件好事。
【讨论】:
以上是关于升级 gradle 后 Proguard 行为发生变化,从构建的 apk 中省略类的主要内容,如果未能解决你的问题,请参考以下文章
升级Android Studio 3.1.2后,ProGuard配置解析器出错?
在 gradle 中启用 Proguard 后 FCM 不起作用
Android Studio - Gradle 更新升级到2.1.0后,发生Duplicate files copied in APK META-INF
AndroidStudio 2.2 构建 gradle 错误(自定义 proguard 文件的路径)