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

Posted

技术标签:

【中文标题】更新到 android gradle 插件 3.5 后的 proguard 问题【英文标题】:proguard problem after updating to android gradle plugin 3.5 【发布时间】:2020-01-04 06:15:59 【问题描述】:

我将一些对象的json 表示保存为我的应用程序中的缓存。更新应用程序的每个版本后我都没有问题,json 对象已正确转换为 java 对象。更新到android gradle plugin 3.5后(添加这一行):

classpath 'com.android.tools.build:gradle:3.5.0'

当我创建发布 apk 时,它似乎无法将 json 字符串转换为 java 对象,并且似乎混淆的名称已更改。当我将其恢复为 gradle plugin 3.4.2 时,一切正常。那么问题出在哪里,我该如何解决呢?

【问题讨论】:

你不能在proguard规则中添加那个json文件作为例外 ***.com/a/57156980/7254873 @ManojPerumarath,问题是混淆对象已保存为缓存,如果我现在排除它们,保存的 jason 对象无法转换为 java 对象。 它的 Anroid R8 禁用了 progaurd,因为它具有不同的算法,即使您的对象被混淆,它们也不再可反序列化。我假设 Android 没有考虑这个用例。请参阅以下 Bhaven Shah 的答案以获取解决方法。 【参考方案1】:

我也遇到了同样的错误。

我发现这是用于减小应用程序大小的 enabledR8 的错误。

而且它是真正的预定义。所以通过设置值,一个错误的错误就消失了。


在 gradle.properties 文件中设置 r8 的值为 false。

android.enableR8=false

【讨论】:

这个答案很有道理,谢谢。所以基本上 R8 是压缩、缩小和混淆代码的新方法,因此它会自动禁用 progaurd 规则。这对我的所有序列化数据造成了严重破坏,不再可读。唷。非常感谢您的快速回答。 @MGDeveloper Google 将很快摆脱 useProguard 属性,在这种情况下我们需要启用 R8。不知道这能做多久【参考方案2】:

我应该从混淆中排除缓存的对象,但我暂时禁用了 R8 并启用了 proguard,方法是将此行添加到 gradle.properties 文件:

android.enableR8=false

并将这一行添加到应用程序build.gradle 文件中:

useProguard true
minifyEnabled true

问题解决了。

【讨论】:

由于 Google 将删除 useProguard 并仅使用 android.enableR8 ,此问题是否仍然存在。 "警告:DSL 元素 'useProguard' 已过时,将很快被删除。使用 gradle.properties 中的 'android.enableR8' 在 R8 和 Proguard 之间切换" @user12865,问题依然存在,但正如你所说,useProguard 将被删除,临时解决方案将不再起作用。

以上是关于更新到 android gradle 插件 3.5 后的 proguard 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在AGP 3.5和Gradle Wrapper 5.4.1中生成多个aar?

AGP 3.5 与 Gradle 6 兼容吗?

AGP 3.5是否与Gradle 6兼容?

Gradle与Android Gradle插件的版本对应关系

android studio 升级到3.5版本报错gradle无法获取pom文件

配置文件或调试 APK:生成签名的 Bundle 需要您将 Android Gradle 插件更新到版本 3.2.0