修改FirebaseApp初始化后配置报FirebaseApp was deleted错误如何解决
问题修复方案
报错原因
- 原有逻辑删除默认FirebaseApp实例后,重新初始化的新实例没有同步到后续依赖FirebaseApp的组件,FirebasePushNotificationManager仍然持有已删除的旧实例引用,触发
java.lang.IllegalStateException: FirebaseApp was deleted异常 - 原代码中
FirstOrDefault()没有做空判断,当不存在匹配的默认App时直接调用Delete()会触发空引用异常,属于潜在崩溃点
修复代码
优化原有逻辑,补全空校验,删除旧实例前先停止依赖服务,重新初始化App后将新实例传入推送管理器:
var apps = FirebaseApp.GetApps(Context); // 先停止旧推送服务对FirebaseApp的依赖 FirebasePushNotificationManager.Disable(); if (apps.Count != 0) { var defaultApp = apps.Where(i => i.Name == FirebaseApp.DefaultAppName).FirstOrDefault(); // 补全空和状态判断,避免无效调用 if (defaultApp != null && !defaultApp.IsDeleted) { defaultApp.Delete(); } } var options = new FirebaseOptions.Builder() .SetApiKey(config["API_KEY"]) .SetApplicationId(config["GOOGLE_APP_ID"]) .SetGcmSenderId(config["GCM_SENDER_ID"]) .SetProjectId(config["PROJECT_ID"]) .SetStorageBucket(config["STORAGE_BUCKET"]) .Build(); // 接收新初始化的FirebaseApp实例 var newDefaultApp = FirebaseApp.InitializeApp(Context, options); if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O) { FirebasePushNotificationManager.DefaultNotificationChannelId = "FirebasePushNotificationChannel"; FirebasePushNotificationManager.DefaultNotificationChannelName = "General"; FirebasePushNotificationManager.DefaultNotificationChannelImportance = NotificationImportance.Max; } // 传入新的App实例初始化推送,第三个参数为true重置旧配置 FirebasePushNotificationManager.Initialize(newDefaultApp, Context, true);
额外注意事项
- 该配置修改操作仅推荐放在Application的
OnCreate生命周期中执行,不要在App运行过程中频繁切换Firebase配置,避免组件状态混乱 - 如果你同时使用了FirebaseAuth、FirebaseStorage等其他Firebase组件,删除旧App实例前需要先释放这些组件的旧实例,避免后续调用触发同类异常
- 确保所有Firebase相关SDK版本保持一致,版本不兼容也可能导致实例同步失败
内容的提问来源于stack exchange,提问作者Denys Tsurkanovski
相关产品推荐
相关产品推荐

