Firestore(0.6.6-dev)中的内部错误是由于GRPC和R8引起的。

4

更新Firebase依赖后,我的应用程序停止工作。 崩溃报告显示了以下日志:

java.lang.RuntimeException: Internal error in Firestore (0.6.6-dev).
at com.google.firebase.firestore.g.b.a(com.google.firebase:firebase-firestore@@17.0.5:324)
at com.google.firebase.firestore.g.d.run(com.google.firebase:firebase-firestore@@17.0.5)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6165)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
 Caused by: java.lang.AbstractMethodError: abstract method "b.d.g.z$d b.d.g.z$d.a(int)"
at b.d.g.u.a(GeneratedMessageLite.java:1319)
at b.d.c.a.y.a(com.google.firebase:firebase-firestore@@17.0.5:8440)
at b.d.c.a.y$a.a(com.google.firebase:firebase-firestore@@17.0.5:6589)
at com.google.firebase.firestore.f.n.b(com.google.firebase:firebase-firestore@@17.0.5:689)
at com.google.firebase.firestore.c.N.a(com.google.firebase:firebase-firestore@@17.0.5:152)
at com.google.firebase.firestore.c.w.b(com.google.firebase:firebase-firestore@@17.0.5:82)
at com.google.firebase.firestore.c.O.a(com.google.firebase:firebase-firestore@@17.0.5:479)
at com.google.firebase.firestore.c.V.run(com.google.firebase:firebase-firestore@@17.0.5)
at com.google.firebase.firestore.c.u.a(com.google.firebase:firebase-firestore@@17.0.5:117)
at com.google.firebase.firestore.c.O.a(com.google.firebase:firebase-firestore@@17.0.5:474)
at com.google.firebase.firestore.b.f.a(com.google.firebase:firebase-firestore@@17.0.5:165)
at com.google.firebase.firestore.b.o.a(com.google.firebase:firebase-firestore@@17.0.5:79)
at com.google.firebase.firestore.b.r.c(com.google.firebase:firebase-firestore@@17.0.5:132)
at com.google.firebase.firestore.b.w.run(com.google.firebase:firebase-firestore@@17.0.5)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at com.google.firebase.firestore.g.b$a.run(com.google.firebase:firebase-firestore@@17.0.5:190)
at java.lang.Thread.run(Thread.java:761)

由于日志没有任何类参考我的源代码,我试图弄清楚依赖关系。
最后明白了,这个问题是由R8缩小器和GRPC引起的。
以下是上述问题的解决方案:
1. android.enableR8=false 2. -keep class io.grpc.** { *; }
以上两种解决方案都不太适合我。
我不想采用第一种解决方案,因为禁用R8会使我的APK大小增加200 KB。而第二种解决方案对我来说看起来像是一个黑客方法。当单个类引起问题时,我不支持保留整个库。
现在问题是如何使我的应用程序在启用了R8的情况下正常工作,并且不将grpc库远离混淆?

gRPC并不直接依赖GeneratedMessageLite,可能是protobuf生成的文件没有被正确地减少吗? - Carl Mastrangelo
看起来protobuf运行良好。但是如果我使用R8,它就开始出现问题了。 - Chandra Sekhar
1个回答

0

我使用 R8 和 gRPC 浏览了 Firestore 的 快速入门示例应用程序,并没有遇到任何问题,即使是 com.google.firebase:firebase-firestore:17.0.5 版本(这似乎是您从堆栈跟踪中使用的版本)。我认为您可能遇到了 https://github.com/firebase/FirebaseUI-Android/issues/1175,这个问题应该在最近的 firestore 发布版本中得到解决,例如 17.1.2。(根据他们的 发布说明,17.0.5 包含一个错误,不应该使用)。如果升级不是一个选项,您应该能够像在 Firestore 快速入门示例 中所做的那样,手动添加以下内容到您的 proguard 规则中:

-dontwarn okio.**

(我无法重现您描述的错误,但这似乎是快速入门示例中唯一适用于gRPC依赖项的Proguard规则)


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