FirebaseApp.initializeApp(this)触发NullPointerException崩溃咨询
Firebase初始化空指针崩溃问题解答
问题定性
该问题不属于你方集成配置的写法错误,是旧版Firebase SDK存在的已知兼容缺陷,结合未覆盖直接启动测试场景导致的大范围崩溃。
崩溃触发逻辑
从堆栈信息可以定位到空指针触发链路:
- 崩溃发生在应用的
Application.onCreate生命周期,触发点是UserManagerCompat.isUserUnlocked调用时的空值异常 - 该场景仅出现在Android 7.0及以上版本的直接启动模式下:设备重启后用户尚未输入锁屏凭证解锁系统前,系统允许部分具备直接启动权限的组件、后台进程运行,此时系统用户存储处于锁定状态,部分系统服务获取可能返回空值
- 你当前使用的
com.google.gms:google-services:4.3.3为2020年发布的旧版本,其拉取的对应版本Firebase核心SDK在调用用户解锁状态判断时,没有做系统服务空值防护,直接触发空指针 - 本地测试未复现的原因是测试流程均在设备解锁后手动启动应用,不会触发直接启动场景;用户设备上存在开机自启、厂商系统推送唤起、后台任务拉起等情况,会在设备未解锁时就执行Application初始化逻辑,因此出现大量线上崩溃。
修复步骤
- 升级项目级
build.gradle中的Google服务相关依赖版本到修复了该缺陷的稳定版:
dependencies { // 原有其他依赖保持不变 classpath "com.google.gms:google-services:4.3.15" classpath "com.google.firebase:firebase-crashlytics-gradle:2.9.2" classpath "com.google.firebase:firebase-appdistribution-gradle:3.1.0" }
如果app模块使用Firebase BOM管理组件版本,确保BOM版本不低于30.3.0即可。
- 增加直接启动场景的初始化时机判断,避免在用户未解锁时初始化Firebase:
override fun onCreate() { super.onCreate() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !UserManagerCompat.isUserUnlocked(this)) { // 注册用户解锁广播,解锁后再初始化Firebase val unlockFilter = IntentFilter(Intent.ACTION_USER_UNLOCKED) registerReceiver(object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { initFirebase() unregisterReceiver(this) } }, unlockFilter) } else { initFirebase() } } private fun initFirebase() { FirebaseApp.initializeApp(this) FirebaseCrashlytics.getInstance() }
补充说明:如果移除手动调用的
FirebaseApp.initializeApp(this),Firebase默认会通过ContentProvider自动初始化,同样可能触发该崩溃。如果采用自动初始化方案,需要先通过manifest配置禁用Firebase的自动初始化,再按上述逻辑手动控制初始化时机。
内容的提问来源于stack exchange,提问作者Egemen Hamutçu
相关产品推荐
相关产品推荐

