Lcom/google/android/gms/common/internal/Preconditions 类中没有静态方法 checkHandlerThread(Landroid/os/Handle

Posted

技术标签:

【中文标题】Lcom/google/android/gms/common/internal/Preconditions 类中没有静态方法 checkHandlerThread(Landroid/os/Handler;Ljava/lang/String;)V【英文标题】:No static method checkHandlerThread(Landroid/os/Handler;Ljava/lang/String;)V in class Lcom/google/android/gms/common/internal/Preconditions 【发布时间】:2021-02-11 20:19:04 【问题描述】:

在我的 app/build.gradle 中设置 minifyEnabled true 后,我面临崩溃。

implementation ('com.google.android.gms:play-services-location:17.0.0') 
    exclude group:'com.android.support', module: 'support-v4'

implementation 'com.google.firebase:firebase-messaging:18.0.0'
implementation 'com.google.firebase:firebase-analytics:16.5.0'
implementation 'com.google.android.gms:play-services-maps:17.0.0'

这些是我使用的 Firebase 库。仅当设置为minifyEnabled true 时才会发生此崩溃。

我也尝试过启用 Multidex,但仍然无法解决问题。

崩溃日志:

Process: proto.inventa.cct.com.inventaapp, PID: 30410
java.lang.NoSuchMethodError: No static method checkHandlerThread(Landroid/os/Handler;Ljava/lang/String;)V in class Lcom/google/android/gms/common/internal/Preconditions; or its super classes (declaration of 'com.google.android.gms.common.internal.Preconditions' appears in /data/app/proto.inventa.cct.com.inventaapp-hunIIikgxzy10RXjTw7TYA==/base.apk!classes4.dex)
    at com.google.android.gms.common.internal.GmsClientEventManager.onConnectionSuccess(Unknown Source:20)
    at com.google.android.gms.common.api.internal.zaaw.zab(Unknown Source:292)
    at com.google.android.gms.common.api.internal.zaak.zaaq(Unknown Source:125)
    at com.google.android.gms.common.api.internal.zaak.onConnected(Unknown Source:105)
    at com.google.android.gms.common.api.internal.zabe.onConnected(Unknown Source:101)
    at com.google.android.gms.common.api.internal.zaq.onConnected(Unknown Source:6)
    at com.google.android.gms.common.internal.zaf.onConnected(Unknown Source:2)
    at com.google.android.gms.common.internal.BaseGmsClient$PostInitCallback.handleServiceSuccess(Unknown Source:130)
    at com.google.android.gms.common.internal.BaseGmsClient$zza.deliverCallback(Unknown Source:60)
    at com.google.android.gms.common.internal.BaseGmsClient$zza.deliverCallback(Unknown Source:2)
    at com.google.android.gms.common.internal.BaseGmsClient$CallbackProxy.deliverCallback(Unknown Source:51)
    at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source:270)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:6977)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:528)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:910)

【问题讨论】:

【参考方案1】:

您需要保留这些类(可能还有更多):

-verbose
-keep,includedescriptorclasses class com.google.android.gms.**  *; 
-keep,includedescriptorclasses class com.google.android.gms.internal.**  *; 
-keep class com.google.android.gms.internal.** com.google.android.gms.internal.** initialize(android.content.Context);
-keep class com.google.android.gms.iid.** com.google.android.gms.iid.** get(java.lang.String);
-keep,includedescriptorclasses class com.google.android.**  *; 

【讨论】:

好的。因此,如果我再次遇到这样的崩溃,我应该将这些类添加到我的 proguard 规则中,对吗? 我添加了上述规则。它仍然给我同样的崩溃。 使用-verbose 开关,它应该会告诉你该做什么。【参考方案2】:

您似乎有依赖冲突。 play-services-location:17.0.0 取决于 play-services-basement:17.0.0play-services-base:17.0.0firebase-messaging:18.0.0 依赖于 play-services-basement:16.0.1

可能是您有play-services-base:17.0.0play-services-basement:16.0.1,如果play-services-base:17.0.0 尝试使用play-services-basement:17.0.0 中引入的API,这将不起作用。

尝试将您的firebase-messaging dep 更新到至少版本19.0.0,这确实取决于play-services-basement:17.0.0。 同样,尝试将firebase-analytics 更新到至少版本17.0.0

还可以考虑检查严格的版本匹配器插件,如果检测到冲突,它将给你一个错误消息,而不是 Gradle 的默认策略,它只会选择一个,如果它做出错误的选择,可能会给出类似这样的奇怪错误消息。 https://developers.google.com/android/guides/versioning#strict_version_matching.

我也强烈鼓励反对 -keeping 所有com.google.android 包。这将保留 SDK 中的所有代码,甚至包括您不使用的部分,从而大大减少收缩带来的好处。

【讨论】:

以上是关于Lcom/google/android/gms/common/internal/Preconditions 类中没有静态方法 checkHandlerThread(Landroid/os/Handle的主要内容,如果未能解决你的问题,请参考以下文章