无Google服务设备Firebase Perf空指针异常问题求助
我刚好碰到过一模一样的问题,根源就是你的设备没有Google Play服务,但集成的Firebase Performance SDK依赖GMS才能正常初始化,导致抛出空指针异常。下面是详细的分析和可行的解决办法:
环境信息
- Android设备:
MI 5、MI 6 - Android系统版本:
8.0.0 - Google Play服务版本:无Google服务
- Firebase/Play服务SDK版本:
com.google.firebase:firebase-plugins:1.1.0、com.google.firebase:firebase-perf:15.1.0 - TargetSdkVersion:26
问题详情
抛出的空指针异常栈信息:
java.lang.NullPointerException Attempt to invoke virtual method 'void com.google.android.gms.internal.firebase-perf.zzq.zzb(boolean)' on a null object reference com.google.android.gms.internal.firebase-perf.zzg.zzc(Unknown Source:2) com.google.android.gms.internal.firebase-perf.zzk.run(Unknown Source:4) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) java.lang.Thread.run(Thread.java:764)
相关初始化日志
Firebase初始化失败的完整日志:
FirebaseApp: Firebase API初始化失败。java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at com.google.firebase.FirebaseApp.zza(Unknown Source:72) at com.google.firebase.FirebaseApp.zzc(Unknown Source:49) at com.google.firebase.FirebaseApp.initializeApp(Unknown Source:119) at com.google.firebase.FirebaseApp.initializeApp(Unknown Source:2) at com.google.firebase.FirebaseApp.initializeApp(Unknown Source:28) at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source:4) at android.content.ContentProvider.attachInfo(ContentProvider.java:1927) at android.content.ContentProvider.attachInfo(ContentProvider.java:1902) at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source:23) at android.app.ActivityThread.installProvider(ActivityThread.java:6425) at android.app.ActivityThread.installContentProviders(ActivityThread.java:5939) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5851) at android.app.ActivityThread.-wrap1(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1689) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6683) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782) Caused by: java.lang.SecurityException: 未找到用户0的com.google.android.gms.phenotype提供者;期望找到该权限对应的有效ContentProvider at android.os.Parcel.readException(Parcel.java:1942) at android.os.Parcel.readException(Parcel.java:1888) at android.content.IContentService$Stub$Proxy.registerContentObserver(IContentService.java:768) at android.content.ContentResolver.registerContentObserver(ContentResolver.java:1940) at android.content.ContentResolver.registerContentObserver(ContentResolver.java:1929) at com.google.android.gms.internal.measurement.zzwp.zza(Unknown Source:32) at com.google.android.gms.internal.measurement.zzws.zzry(Unknown Source:33) at com.google.android.gms.internal.measurement.zzws.get(Unknown Source:14) at com.google.android.gms.internal.measurement.zzex.get(Unknown Source:2) at com.google.android.gms.internal.measurement.zzfg.zziu(Unknown Source:7) at com.google.android.gms.internal.measurement.zzfg.isLoggable(Unknown Source:0) at com.google.android.gms.internal.measurement.zzfg.zza(Unknown Source:3) at com.google.android.gms.internal.measurement.zzfi.log(Unknown Source:12) at com.google.android.gms.internal.measurement.zzgl.<init>(Unknown Source:226) at com.google.android.gms.internal.measurement.zzgl.zzg(Unknown Source:28) at com.google.android.gms.measurement.AppMeasurement.getInstance(Unknown Source:0) at java.lang.reflect.Method.invoke(Native Method)
解决方案
方案1:移除Firebase Performance SDK(如果不需要该功能)
如果你的应用不需要Firebase性能监控功能,最简单的办法就是直接移除相关依赖:
在你的app/build.gradle中删除以下内容:
// 删除这两行 implementation 'com.google.firebase:firebase-perf:15.1.0' apply plugin: 'com.google.firebase.firebase-perf'
同时在项目根目录的build.gradle中删除firebase-plugins的依赖:
classpath 'com.google.firebase:firebase-plugins:1.1.0' // 删除这一行
方案2:兼容无GMS设备的初始化逻辑
如果需要保留Firebase Performance功能,要调整初始化逻辑,避免在无GMS的设备上触发初始化:
- 在自定义Application类中先检查Google Play服务是否可用:
import android.app.Application; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.firebase.FirebaseApp; import com.google.firebase.perf.FirebasePerformance; public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // 仅在GMS可用时初始化Firebase if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS) { FirebaseApp.initializeApp(this); // 手动开启性能采集 FirebasePerformance.getInstance().setPerformanceCollectionEnabled(true); } } }
- 在
AndroidManifest.xml中添加meta-data禁用自动初始化:
<meta-data android:name="firebase_performance_auto_collection_enabled" android:value="false" />
方案3:升级Firebase SDK版本
你当前使用的SDK版本15.1.0比较老旧,新版本的Firebase SDK对无GMS设备的兼容性有很大提升。建议升级到稳定的新版本,比如:
在项目根目录build.gradle中:
classpath 'com.google.firebase:firebase-plugins:2.0.0'
在app/build.gradle中:
implementation 'com.google.firebase:firebase-perf:20.0.0' apply plugin: 'com.google.firebase.firebase-perf'
升级后SDK会自动处理无GMS设备的情况,无需额外修改代码。
内容的提问来源于stack exchange,提问作者da que
相关产品推荐
相关产品推荐

