在 Android 的后台线程上初始化 Firebase 是否安全?需要注意什么?

Act*_*ine 6 multithreading android firebase

在我的设置中,Firebase 需要大约 250 毫秒进行初始化(在 Nexus 5 上测量,作为有和没有冷启动的“首次显示时间”的差异FirebaseInitProvider / CrashlyticsInitProvider)。这是一个问题,因为如果没有 Firebase,我的应用程序冷启动只需 350 毫秒,而 Firebase 会使这个时间增加一倍。

我正在考虑禁用默认的FirebaseInitProviderCrashlyticsInitProvider,它在应用程序启动之前在主线程上运行,并在后台线程上手动进行初始化(例如从 启动它Application.onCreate())。

FirebaseApp.initializeApp()问:调用后台线程安全吗?如果是这样,我应该注意什么?我知道,如果需要,例如getUser()当 Firebase 仍在后台启动时,我必须实现一些锁定,以便我的线程等待它准备好。我也不关心准确的屏幕时间报告,因此如果 Firebase Analytics 延迟注册其活动生命周期回调,这不是问题。

PS 中有一个synchronizedFirebaseApp.initializeApp(),这意味着工程师假设有人会尝试从另一个线程调用它。我更担心内部结构,这些内部结构没有开源可供检查。

PPS 另外,我的应用程序是一个单进程应用程序,所以它不太可能Application.onStart()被多次调用(除非我在这里遗漏了一些东西)。

小智 0

来自https://firebase.googleblog.com/2017/03/take-control-of-your-firebase-init-on.html

您可以从项目中的 google-services.json 获取初始化信息,或者在 firebase init 中设置断点并查看上下文中的内容。

在清单中禁用自动初始化...

<provider
    android:name="com.google.firebase.provider.FirebaseInitProvider"
    android:authorities="${applicationId}.firebaseinitprovider"
    tools:node="remove"
    />
Run Code Online (Sandbox Code Playgroud)

如果您没有将“tools”命名空间添加到清单根标记中,则还必须添加它:

<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="your.package"
    >
Run Code Online (Sandbox Code Playgroud)

像这样在代码中显式初始化...可以从这里的后台线程调用...

FirebaseOptions.Builder builder = new FirebaseOptions.Builder()
    .setApplicationId("1:0123456789012:android:0123456789abcdef")
    .setApiKey("your_api_key")
    .setDatabaseUrl("https://your-app.firebaseio.com")
    .setStorageBucket("your-app.appspot.com");
FirebaseApp.initializeApp(this, builder.build());
Run Code Online (Sandbox Code Playgroud)