![](/img/trans.png)
[英]Firebase crashlytics without google-services.json and google play services
[英]Can I initialize Firebase without using google-services.json?
編輯:我應該強調,我有口味,我不想使用任何這些谷歌服務,並嘗試在這種情況下應用谷歌服務插件,沒有適用的google-services.json,將導致構建失敗。
我希望能夠初始化Firebase SDK,特別是使用遠程配置,不使用google-services.json。
我看到FirebaseApp有一個初始化方法,它接收一個FirebaseOptions對象。
我使用google-services.json中提供的值構建了FirebaseOptions,在使用這些選項調用FirebaseApp.initialize之后,我總是得到
FirebaseInitProvider: FirebaseApp initialization unsuccessful
我知道這是使用google-services.json文件的推薦方法,但我需要能夠讓應用程序調用不同的Firebase項目,具體取決於調試/發布版本,同時保持包名稱相同。
我想這樣做的方法是為初始化Firebase所需的所有值設置調試/釋放對,然后動態地進行初始化。
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);
到目前為止它似乎沒有用。
非常感謝所有幫助!
以下是關於如何在同一個Android項目Firebase博客和新配置文檔中使用多個firebase應用程序/數據庫的幾點建議
然而,除了默認應用程序之外,這些還討論了使用輔助應用程序 - 它仍然使用google-services.json。 我做了一些研究,並在他們的Slack頻道中探討。 Firebase使用名為FirebaseInitProvider的ContentProvider。 這使用google-services.json在啟動時初始化DEFAULT應用。 如果json文件不存在則barfs。 我做了以下步驟:
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看起來仍然在尋找實例應用。 如果禁用該服務,使用相同的清單節點刪除技術,則此異常將消失。 但我認為該服務可以執行重要的同步/消息傳遞。 所以不確定是否明智地刪除它。 長話短說 - 我仍在尋找禁用默認應用程序/不使用google-services.json的完美解決方案。 任何進一步的指示將深表贊賞。
更新:
看起來這個解決方案畢竟有用 - 沒有禁用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
放入任何示例應用谷歌提供的Firebase集成。 編譯它。
看一下路徑app/build/generated/res/google-services/debug/values/
應該生成帶有你所描述的錯誤中提到的一串字符串的values.xml
文件。 將這些字符串復制到項目的value.xml文件中。 而已。
我也在使用構建變體來為不同的環境應用不同的配置。 我遇到了同樣的問題,因為有些變種在google-services.json
文件中沒有相應的條目。 這導致我的一些構建在生成未在firebase中配置的應用程序包時失敗。
我的解決方法是在firebase儀表板上為相關的firebase項目中的缺失包添加虛擬應用程序條目 - 然后從中獲取更新的google-services.json
文件。
可能不是最好的做法,但在我的情況下完成了工作。
google-services.json
是完全可選的,意味着方便。 因此,如果您覺得不方便,那么一定不要使用它。
您可能已經注意到, json
文件僅在構建時使用。 google-services
插件將JSON文件轉換為包含一些特定字符串的資源xml
文件。 它看起來像這樣:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<! -- Present in all applications -->
<string name="google_app_id" translatable="false">1:1035469437089:android:73a4fb8297b2cd4f</string>
<! -- Present in applications with the appropriate services configured -->
<string name="gcm_defaultSenderId" translatable="false">1035469437089</string>
<string name="default_web_client_id" translatable="false">337894902146-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com</string>
<string name="ga_trackingId" translatable="false">UA-65557217-3</string>
<string name="firebase_database_url" translatable="false">https://example-url.firebaseio.com</string>
<string name="google_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
<string name="google_crash_reporting_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
<string name="project_id" translatable="false">mydemoapp</string>
</resources>
您可以在自己的strings.xml
文件中創建這些條目,然后FirebaseApp.initializeApp()
將在運行時找到它們。 並非所有密鑰都是必需的,這取決於您使用的是哪種服務。 例如,幾乎所有服務都需要google_app_id
密鑰。 Firestore只需要它和project_id
,而Firebase Auth也需要google_api_key
。 試驗並找出你需要的東西應該不難。
一些鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.