启用 ProGuard 会导致签名 APK 生成失败?

Posted

技术标签:

【中文标题】启用 ProGuard 会导致签名 APK 生成失败?【英文标题】:Enabling ProGuard causes failing signed APK generation? 【发布时间】:2016-02-12 04:53:26 【问题描述】:

我在我的 gradle 文件中启用了 minifyEnabled 以使用 ProGuard 的功能来混淆代码,结果它会引发一些错误。

注意:动态创建的类实例有 1 个类转换。 您可能会考虑明确保留提到的类和/或 他们的实现(使用'-keep')。 警告:有 309 个未解析的类或接口引用。 您可能需要添加缺少的库 jar 或更新它们的版本。 如果您的代码在没有丢失类的情况下工作正常,您可以抑制 带有“-dontwarn”选项的警告。 (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)

还有更多。

我已经浏览了ProGuard 文档。我猜this 发生了什么错误。我正在使用第三方库和 jars。它令人困惑,因为我有更多数量的库和 jars。我该如何决定哪一个应该保留在我的proguard-rules.pro 中,哪个不保留?为了成功有效地使用 ProGuard,还需要做什么?

【问题讨论】:

【参考方案1】:

ProGuard 会分析您应用程序中的所有代码(包括库),并在发现 未解决的引用(或其他问题,但未解决的引用在这里很重要)时生成警告。库引用项目中不存在的系统或库代码是很常见的。

例如:Picasso 可选地与 OkHttp 集成,并且有引用该库的代码。但是如果你没有包含 OkHttp ProGuard 会警告未解析的引用。

成功的构建不能有来自 ProGuard 的任何警告。 ProGuard 还会检查反射,如果在 reflection 中发现未解析的引用,ProGuard 将生成注释而不是警告。警告和注释都可能指向类路径的问题。您可以自己检查代码以查看是否存在实际问题,或者相信他们的代码可以在 android(以及您的目标平台版本)上运行的库。

Kevin Schultz 公开了一组 ProGuard 配置文件。他的博文应该可以帮助您开始使用配置文件。 http://www.kevinrschultz.com/blog/2014/02/15/proguard-with-gradle/

请仔细检查您复制的配置。他们有时会有点咄咄逼人。如果可能,您想避免-dontwarn/dontnote entire-package,而是缩小实际问题的范围。

【讨论】:

【参考方案2】:

您需要添加特定于您使用的库的 proguard 规则。此类规则的汇编可在https://github.com/StarWar/android-proguard-snippets/tree/master/libraries

获得

您也可以尝试为引起问题的软件包添加 dontwarn 指令。这方面的一个例子是 -dontwarn org.codehaus.jackson.**

【讨论】:

以上是关于启用 ProGuard 会导致签名 APK 生成失败?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 proguard 生成签名的 apk

由于 proguard 规则,生成签名 APK 时出错

在 Android Studio 3 中激活 proguard 生成签名 Apk 时出错

Android - 使用 Proguard 创建签名的 APK

Android Studio 无法在 proguard 错误配置中生成签名的 APK

启用 proguard 的 Android 单元测试