文章

GMS

GMS

Service not registered: com.google.android.gms.common.internal.zze@fa44f77

错误堆栈

  • 错误 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
java.lang.IllegalArgumentException: Service not registered: com.google.android.gms.common.internal.zze@63b2f00
        at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1759)
        at android.app.ContextImpl.unbindService(ContextImpl.java:1786)
        at android.content.ContextWrapper.unbindService(ContextWrapper.java:751)
        at com.google.android.gms.common.stats.ConnectionTracker.unbindService(com.google.android.gms:play-services-basement@@17.2.1:25)
        at com.google.android.gms.common.internal.zze.zzf(com.google.android.gms:play-services-basement@@17.2.1:41)
        at com.google.android.gms.common.internal.zzf.handleMessage(com.google.android.gms:play-services-basement@@17.2.1:48)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at com.google.android.gms.internal.common.zzi.dispatchMessage(com.google.android.gms:play-services-basement@@17.2.1:8)
        at android.os.Looper.loop(Looper.java:227)
        at android.app.ActivityThread.main(ActivityThread.java:7582)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:953)
  • 错误 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2020-10-14 17:29:20.551 31215-31215/club.jinmei.mgvoice E/AndroidRuntime: FATAL EXCEPTION: main
Process: club.jinmei.mgvoice, PID: 31215
java.lang.IllegalArgumentException: Service not registered: bl@8a9b7b0
    at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1759)
    at android.app.ContextImpl.unbindService(ContextImpl.java:1786)
    at android.content.ContextWrapper.unbindService(ContextWrapper.java:751)
    at android.content.ContextWrapper.unbindService(ContextWrapper.java:751)
    at cl.handleMessage(chromium-TrichromeWebViewGoogle.aab-stable-1:26)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at sm.dispatchMessage(chromium-TrichromeWebViewGoogle.aab-stable-1:1)
    at android.os.Looper.loop(Looper.java:227)
    at android.app.ActivityThread.main(ActivityThread.java:7582)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:953)

分析&解决

  • 分析

Firebase 使用过程中可能会出现 Service not registered: com.google.firebase.iid.zzw 这样的 Crash, 导致应用崩溃. 查看源码发现是 com.google.android.gms:play-services-basement:17.0.0 这个库中的 com.google.android.gms.common.stats.ConnectionTracker#unbindService() 尝试 unbind 没有注册的 Service, 最新的 17.2.1 中的 ConnectionTracker 添加了一个 unbindServiceSafe(), 它对 unbindService 进行了 try-catch, 但是奇怪的是 Firebase 的其他类并没有调用过这个方法, 估计可能后续版本会修复这个问题, 但是目前的只能靠我们开发者自己修复了.

之前尝试过修复一次, 使用反射替换了内部的 Executor, 但是后面还是出现了这样的崩溃. 猜测是其他的地方调用了 unbindService(). 后续尝试了其他的方法,但都以失败告终. 最终发现了一个应该能完美解决的方法. Firebase 采用 FirebaseInitProvider 来无侵入的获取 Context, 而这个 Context 就是 Application 的实例, 所以我们重写 Application#unbindService() 即可, 最终调用的 unbindService() 都会在这里被捕获:

  • 解决
1
2
3
4
5
6
7
8
9
@Override
public void unbindService(ServiceConnection conn) {
    try {
        super.unbindService(conn); // GMS  Service not registered: com.google.android.gms.common.internal.zze@63b2f00
    } catch (Exception e) {
        e.printStackTrace();
        // do something, ignore or report...
    }
}

Ref

本文由作者按照 CC BY 4.0 进行授权