Google Play上架应用偶发Firebase相关IllegalArgumentException如何排查
错误分析
你给出的崩溃堆栈如下:
java.lang.RuntimeException: at android.app.ActivityThread.installProvider (ActivityThread.java:7251) at android.app.ActivityThread.installContentProviders (ActivityThread.java:6787) at android.app.ActivityThread.handleBindApplication (ActivityThread.java:6704) at android.app.ActivityThread.access$1300 (ActivityThread.java:237) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1913) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loop (Looper.java:223) at android.app.ActivityThread.main (ActivityThread.java:7664) at java.lang.reflect.Method.invoke (Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:947) Caused by: java.lang.IllegalArgumentException: at com.google.android.gms.common.internal.Preconditions.checkNotEmpty (Preconditions.java:8) at com.google.firebase.iid.FirebaseInstanceId.checkRequiredFirebaseOptions (FirebaseInstanceId.java:52) at com.google.firebase.iid.FirebaseInstanceId.getInstance (FirebaseInstanceId.java:2) at com.google.firebase.iid.FirebaseInstanceId.getInstance (FirebaseInstanceId.java:1) at com.google.firebase.iid.Store.checkForRestore (Store.java:15) at com.google.firebase.iid.Store.<init> (Store.java:5) at com.google.firebase.iid.FirebaseInstanceId.<init> (FirebaseInstanceId.java:16) at com.google.firebase.iid.FirebaseInstanceId.<init> (FirebaseInstanceId.java:8) at com.google.firebase.iid.Registrar.lambda$getComponents$0$Registrar (Registrar.java:26) at com.google.firebase.iid.Registrar$$Lambda$0.create (Registrar.java) at com.google.firebase.components.ComponentRuntime.lambda$new$0 (ComponentRuntime.java:69) at com.google.firebase.components.ComponentRuntime$$Lambda$1.get (ComponentRuntime.java:4) at com.google.firebase.components.Lazy.get (Lazy.java:53) at com.google.firebase.components.AbstractComponentContainer.get (AbstractComponentContainer.java:27) at com.google.firebase.components.RestrictedComponentContainer.get (RestrictedComponentContainer.java:83) at com.google.firebase.messaging.FirebaseMessagingRegistrar.lambda$getComponents$0$FirebaseMessagingRegistrar (FirebaseMessagingRegistrar.java:21) at com.google.firebase.messaging.FirebaseMessagingRegistrar$$Lambda$0.create (FirebaseMessagingRegistrar.java) at com.google.firebase.components.ComponentRuntime.lambda$new$0 (ComponentRuntime.java:69) at com.google.firebase.components.ComponentRuntime$$Lambda$1.get (ComponentRuntime.java:4) at com.google.firebase.components.Lazy.get (Lazy.java:53) at com.google.firebase.components.ComponentRuntime.initializeEagerComponents (ComponentRuntime.java:158) at com.google.firebase.FirebaseApp.initializeAllApis (FirebaseApp.java:563) at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:304) at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:268) at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:253) at com.google.firebase.provider.FirebaseInitProvider.onCreate (FirebaseInitProvider.java:51) at android.content.ContentProvider.attachInfo (ContentProvider.java:2388) at android.content.ContentProvider.attachInfo (ContentProvider.java:2358) at com.google.firebase.provider.FirebaseInitProvider.attachInfo (FirebaseInitProvider.java:45) at android.app.ActivityThread.installProvider (ActivityThread.java:7246) ... 10 more
该异常是Firebase初始化校验必填参数时触发的,checkRequiredFirebaseOptions方法校验到核心配置项为空,才抛出IllegalArgumentException。偶发不复现的情况多和特殊用户场景有关,可按以下步骤排查:
排查解决步骤
1. 确认配置文件正确性
- 核对打包所用的
google-services.json和Firebase控制台对应应用的配置完全一致,确认project_id、api_key、mobilesdk_app_id三个核心字段无缺失 - 如果存在多构建变体/多渠道包,确认每个变体对应的
google-services.json放置在正确的资源目录下,没有混用不同应用的配置
2. 检查自定义初始化逻辑
- 若你手动调用了
FirebaseApp.initializeApp()进行初始化,确认你构造FirebaseOptions时所有必填参数都不为空,排除动态获取参数时偶发空值的情况 - 若你没有做自定义初始化,确认没有通过Manifest配置禁用默认
FirebaseInitProvider后遗漏了手动初始化逻辑
3. 排查备份还原场景触发问题
- 绝大多数偶发无法复现的该类错误,都是用户触发了系统应用备份还原功能导致的:老设备备份了应用本地缓存的Firebase标识数据,还原到新设备时数据损坏/丢失,触发初始化校验失败
- 可在AndroidManifest中配置
FirebaseInitProvider的android:allowBackup="false",或关闭应用全局的备份功能,避免备份Firebase相关的本地缓存数据
4. 添加兜底逻辑避免崩溃
- 禁用Firebase默认自动初始化,在应用启动阶段异步执行Firebase初始化逻辑,添加try-catch捕获异常,出现初始化失败时可延迟重试,避免应用直接崩溃
- 可在崩溃上报组件中添加自定义日志,打印初始化时用到的Firebase配置参数,后续出现崩溃时可直接定位到具体缺失的参数项
内容的提问来源于stack exchange,提问作者Kaepxer
相关产品推荐
相关产品推荐

