升级 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 文件的路径)

更新到 android gradle 插件 3.5 后的 proguard 问题

Android Studio apk体积突然变大(升级gradle后)