更新到Android Gradle插件3.5后的Proguard问题

9

我在我的应用程序中将一些对象的json表示形式保存为缓存。在每次更新应用程序并将json对象正确转换为Java对象后,我没有任何问题。在更新为Android Gradle插件3.5(添加此行)后出现了问题:

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

当我创建发布版apk时,似乎无法将json字符串转换为Java对象,而且混淆后的名称已更改。当我将gradle插件恢复到3.4.2版本时,一切正常。那么问题在哪里,我该如何解决?

你能否在Proguard规则中添加那些JSON文件作为例外? - Manoj Perumarath
https://dev59.com/6bXna4cB1Zd3GeqPH0Ag#57156980 - Sumit Shukla
@ManojPerumarath,问题在于混淆的对象已经被保存为缓存,如果我现在将它们排除在外,保存的JSON对象就无法转换为Java对象。 - Misagh Emamverdi
2
是Android R8禁用了Progaurd,因为它有不同的算法,即使您的对象已经混淆,它们也无法再进行反序列化。我认为Android没有考虑到这种情况。请参见Bhaven Shah的答案以获取解决方法。 - MG Developer
2个回答

6

我也遇到了同样的错误。

然后我发现这是启用R8(一种用于减小应用程序大小的工具)时出现的错误。

它是预定义的,因此通过设置值为false,可以解决这个错误。


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

android.enableR8=false


1
这个回答很有道理,谢谢。基本上,R8是压缩、缩小和混淆代码的新方法,因此它会自动禁用progaurd规则。这导致我所有的序列化数据都无法读取。感谢您的快速回答。 - MG Developer
@MGDeveloper 谷歌很快就会放弃 useProguard 属性,这种情况下我们需要启用 R8。不确定这可以持续多久。 - user2234

5

我应该在混淆时排除缓存对象,但是暂时我禁用了 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之间切换。” - user2234
@user12865,问题仍然存在,但正如你所说,“useProguard”将被移除,临时解决方案将不再起作用。 - Misagh Emamverdi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接