Proguard和Preference DataStore

11

我在使用Android DataStore的项目中使用了Proguard。在没有使用Proguard的情况下,一切正常。但是当使用Proguard进行混淆时,出现了以下错误:

java.lang.RuntimeException: Field preferences_ for f.k.k.h not found. Known fields are [public f.k.k.l.k0 f.k.k.h.i, public static final f.k.k.h f.k.k.h.j, public static volatile f.k.k.l.x0 f.k.k.h.k]
        at f.k.k.l.s0.K(Unknown Source:62)
        at f.k.k.l.s0.y(:6)
        at f.k.k.l.s0.x(Unknown Source:12)
        at f.k.k.l.a1.a(:32)
        at f.k.k.l.a1.b(Unknown Source:4)
        at f.k.k.l.x.r(:4)
        at f.k.k.h.s(:2)
        at f.k.k.k.b(:2)
        at f.k.i.e(Unknown Source:48)
        at f.k.i.f(:2)
        at f.k.i.d(:4)
        at f.k.i$b.e(:4)
        at i.n.j.a.a.l(:2)
        at d.a.p0.run(:4)
        at d.a.f2.a.u(Unknown Source:0)
        at d.a.f2.a$a.run(:7)

在官方文档中没有提到任何Proguard规则。我应该向我的项目添加一些规则来防止DataStore被混淆吗?

官方文档中没有提到任何Proguard规则,因此您需要自己添加规则以防止DataStore被混淆。

3个回答

9
当我在我的项目中添加了以下规则时,问题得到了解决:
-keep class androidx.datastore.*.** {*;}

我已向Google报告此事,您可以在以下链接中查看详细信息: https://issuetracker.google.com/issues/168580258

4
在我的情况下,我在实现存储对象的数据存储协议时遇到了问题。解决方法如下:
我的 build.gradle(Module) 如下所示。
 //  DataStore Proto
implementation  "androidx.datastore:datastore-core:1.0.0"
implementation  "com.google.protobuf:protobuf-javalite:3.14.0"
implementation "androidx.datastore:datastore-preferences:1.0.0"

proguard-rules.pro

-keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite* {
   <fields>;
}
 

0
添加这个是因为我最近遇到了类似的问题,也许对其他人有帮助,直到问题得到修复。
如果上面提供的proto-datastore的解决方案不起作用,可以将新的proguard规则放在模块的consumer-rules.pro中。

你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好的回答的更多信息。 - undefined
这并没有回答问题。一旦你拥有足够的声望,你就能够评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自评论 - undefined

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