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...
}
}
网友评论