android-How to resolve Service not registered: com.google.firebase.iid when using firebase in android app ?
How to resolve Service not registered exception when using firebase in android app?
Environment
The android project’s build.gradle
buildscript {
repositories {
google()
jcenter()
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.google.gms:google-services:4.3.3'
classpath 'io.fabric.tools:gradle:1.31.2' // Crashlytics plugin
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.0.0-beta04'
}
}
The android app module’s build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'
...
dependencies {
...
implementation 'com.google.firebase:firebase-analytics:17.3.0'
implementation 'com.google.firebase:firebase-crashlytics:17.0.0-beta04'
implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
}
Problem
Fatal Exception: java.lang.IllegalArgumentException: Service not registered: com.google.firebase.iid.z0@c2fc4cd
at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1832)
at android.app.ContextImpl.unbindService(ContextImpl.java:1880)
at android.content.ContextWrapper.unbindService(ContextWrapper.java:741)
at com.google.android.gms.common.stats.a.a()
at com.google.firebase.iid.z0.b(:50)
at com.google.firebase.iid.z0.a(:78)
at com.google.firebase.iid.c1.handleMessage(:2)
at android.os.Handler.dispatchMessage(Handler.java:106)
at c.a.a.a.b.c.e.dispatchMessage()
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8347)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
Solution
Solution 1: Override the code by your self
Check the source code of firebase and you would find that it is caused by com.google.android.gms:play-services-basement:17.0.0.
The com.google.android.gms.common.stats.ConnectionTracker#unbindService() in the library tries to unbind the unregistered Service, the latest ConnectionTracker in 17.2.1 adds an unbindServiceSafe(), which tries-catch the unbindService , But the strange thing is that other classes of Firebase have not called this method.
Firebase uses FirebaseInitProvider to obtain Context without intrusion, and this Context is an instance of Application, so we can rewrite Application#unbindService(), and the final unbindService() called will be captured here:
override fun unbindService(conn: ServiceConnection) {
try {
super.unbindService(conn)
} catch (e: IllegalArgumentException) {
// do something, ignore or report...
}
}
Solution 2: Upgrade the firebase crashlytics library version
You can upgrade the firebase SDK versions to get the latest update of the SDK:
In the project’s build.gradle
buildscript {
repositories {
google()
jcenter()
maven {
url 'https://maven.fabric.io/public'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.google.gms:google-services:4.3.3'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0'
classpath 'io.fabric.tools:gradle:1.31.2'
}
}
And in the app module’s build.gradle:
dependencies {
implementation 'com.google.firebase:firebase-analytics:17.4.4'
implementation 'com.google.firebase:firebase-crashlytics:17.1.1'
implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
}