我可以在不使用google-services.json的情况下初始化Firebase吗?

编辑:我应该强调,我有口味,我不想使用任何这些Google服务,并试图在这种情况下应用谷歌服务插件,没有适用的谷歌服务.json导致构build失败。

我希望能够初始化Firebase SDK,特别是使用远程configuration,而不使用google-services.json。

我看到FirebaseApp有一个初始化方法,它接收一个FirebaseOptions对象。

我已经使用google-services.json中提供的值构build了FirebaseOptions,在使用这些选项调用FirebaseApp.initialize之后,我总是得到

FirebaseInitProvider: FirebaseApp initialization unsuccessful 

我知道这是使用google-services.json文件的推荐方式,但是我需要能够根据debugging/发布版本使应用程序调用不同的Firebase项目,同时保持包名称相同。

我希望这样做的方法是为所有初始化Firebase所需的值设置debugging/释放对,然后dynamic执行初始化。

  FirebaseOptions options = new FirebaseOptions.Builder() .setApplicationId(appId) .setApiKey(apiKey) .setGcmSenderId(appContext.getString( isDebug ? R.string.firebase_testing_gcm_sender_id : R.string.firebase_production_gcm_sender_id)) .setDatabaseUrl(appContext.getString( isDebug ? R.string.firebase_testing_database_url : R.string.firebase_production_database_url)) .setStorageBucket( appContext.getString( isDebug ? R.string.firebase_testing_storage_bucket : R.string.firebase_production_storage_bucket)) .build(); FirebaseApp.initializeApp(appContext, options); 

到目前为止,它似乎没有工作。

所有的帮助非常感谢!

Solutions Collecting From Web of "我可以在不使用google-services.json的情况下初始化Firebase吗?"

以下是关于如何在同一个Android项目Firebase Blog和New Config Docs中使用多个Firebase应用程序/数据库的几个指针

然而,这些讨论除了使用默认应用程序之外,还使用辅助应用程序 – 仍然使用google-services.json。 我做了一些研究,并在他们的Slack频道中探索。 Firebase使用名为FirebaseInitProvider的ContentProvider。 这使用google-services.json在启动时初始化DEFAULT应用程序。 它barf如果json文件不存在。 我做了以下步骤:

  • 删除了google-services.json
  • 删除了com.google.gms.google服务插件。 这个插件总是寻找json文件。
  • FirebaseInitProvider是通过清单合并添加的。 但是,在顶级清单中,您可以指定一个node = remove标记,以将其从最终清单中删除。

     <provider android:authorities="${applicationId}.firebaseinitprovider" android:name="com.google.firebase.provider.FirebaseInitProvider" android:exported="false" tools:node="remove"/> 

但是,即使在这之后,我仍然看到一个例外:

 java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process myfirebasedemo.net. Make sure to call FirebaseApp.initializeApp(Context) first. at com.google.firebase.FirebaseApp.getInstance(Unknown Source) at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source) at com.google.firebase.iid.FirebaseInstanceIdService.zza(Unknown Source) at com.google.firebase.iid.FirebaseInstanceIdService.zzm(Unknown Source) at com.google.firebase.iid.zzb$2.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) 

看起来像FirebaseInstanceIdService仍然在寻找实例应用程序。 如果您禁用该服务,则使用相同的清除节点清除技术,则此exception消失。 但是我认为这个服务做重要的同步/消息传递的东西。 所以不知道是否明智地删除这个。 长话短说 – 我仍然在寻找禁用默认应用程序的完美解决scheme/不使用google-services.json。 任何进一步的指针将深受赞赏。

更新:

看起来像这个解决scheme毕竟 – 没有禁用FirebaseInstanceIdService,只是删除FirebaseInitProvider,如上所述。 只需要确保Firebase.initializeApp在Application :: onCreate方法中调用了第一个东西。

 FirebaseApp.initializeApp(context, new FirebaseOptions.Builder().setApiKey("<VAL>"). setApplicationId("<VAL>"). setDatabaseUrl("<VAL>"). setGcmSenderId("<VAL>"). setStorageBucket("<VAL>").build()); 

我发现有趣的解决方法。 请尝试以下操作:将google-services.json放到Google 提供的Firebase集成示例应用程序中。 编译它。

看一下pathapp/build/generated/res/google-services/debug/values/里面应该有生成的values.xml文件,用你提到的错误中提到的一串string。 将这些string复制到项目的value.xml文件中。 而已。

我也使用构build变体来为不同的环境应用不同的configuration。 我有同样的问题,因为一些变种没有在google-services.json文件上适当的条目。 导致一些构build在生成未在Firebase中configuration的应用程序包时失败。

我的解决方法是在相关的firebase项目上,在firebase仪表板上添加虚拟应用程序条目,然后从中获取更新的google-services.json文件。

可能不是最好的做法,但在我的情况做了这项工作。