Android开发Android开发经验谈Android技术知识

关于 Service not registered: com.g

2020-04-23  本文已影响0人  周公在世

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() 都会在这里被捕获:

    override fun unbindService(conn: ServiceConnection) {
        try {
            super.unbindService(conn)
        } catch (e: IllegalArgumentException) {
            // do something, ignore or report...
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读