运行时初始化Firebase后Analytics logEvents上报失效问题求解
问题原因
你遇到的报错是因为Firebase Analytics默认会在应用启动阶段自动初始化,此时会优先读取res/values目录下由com.google.gms.google-services插件自动生成的配置资源,你移除了google-services.json并关闭了gms插件,没有生成对应的资源文件,就触发了缺失google_app_id的报错。
解决方案
步骤1:关闭Analytics自动初始化
在你的AndroidManifest.xml的<application>节点下添加以下meta-data配置,禁止Analytics提前自动初始化:
<!-- 禁用Firebase Analytics自动初始化 --> <meta-data android:name="firebase_analytics_collection_deactivated" android:value="true" /> <!-- 禁用应用测量自动初始化 --> <meta-data android:name="google_analytics_adid_collection_enabled" android:value="false" />
步骤2:按业务需要动态初始化多套Firebase实例
不要两个项目都使用[DEFAULT]作为实例名,避免冲突,为两个Firebase项目配置不同的实例名,在用户选择对应登录方式后再初始化对应项目:
// 项目1配置示例,参数从对应项目的google-services.json提取 val project1Options = FirebaseOptions.Builder() .setApplicationId("项目1的mobilesdk_app_id") .setApiKey("项目1的current_key") .setDatabaseUrl("项目1的firebase_url") .setGcmSenderId("项目1的project_number") .setStorageBucket("项目1的storage_bucket") .setProjectId("项目1的project_id") .build() // 初始化项目1实例,指定唯一实例名 FirebaseApp.initializeApp(context, project1Options, "FIREBASE_PROJECT_1") // 项目2配置同理 val project2Options = FirebaseOptions.Builder() .setApplicationId("项目2的mobilesdk_app_id") .setApiKey("项目2的current_key") .setDatabaseUrl("项目2的firebase_url") .setGcmSenderId("项目2的project_number") .setStorageBucket("项目2的storage_bucket") .setProjectId("项目2的project_id") .build() FirebaseApp.initializeApp(context, project2Options, "FIREBASE_PROJECT_2")
步骤3:手动初始化对应项目的Analytics并开启采集
初始化完对应Firebase实例后,再获取对应实例的Analytics对象,开启数据采集即可正常上报事件:
// 比如用户选择了登录方式1,获取项目1的Analytics实例 val targetApp = FirebaseApp.getInstance("FIREBASE_PROJECT_1") val analytics = FirebaseAnalytics.getInstance(targetApp) // 开启数据采集 analytics.setAnalyticsCollectionEnabled(true) // 上报事件正常调用即可 val bundle = Bundle() bundle.putString("test_param", "test_value") analytics.logEvent("test_event", bundle)
注意事项
- 不要恢复
apply plugin: 'com.google.gms.google-services'配置,也不要放回google-services.json文件,避免插件自动生成的资源和手动配置冲突 - 确保Firebase实例初始化完成后,再获取Analytics对象上报事件
- 如果需要切换上报的项目,直接获取对应实例的Analytics对象上报即可,无需重复初始化FirebaseApp
内容的提问来源于stack exchange,提问作者Pascal Okyere Adomako
相关产品推荐
相关产品推荐

