更新到 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?
Gradle与Android Gradle插件的版本对应关系