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

时间:2018-08-29 10:51:29

标签: android multithreading firebase

在我的设置中,Firebase的启动时间约为250毫秒(在Nexus 5上,冷启动时有无FirebaseInitProvider / CrashlyticsInitProvider时,“到第一次显示的时间”中的差值)。这是一个问题,因为如果没有Firebase,我的应用程序仅需要350毫秒进行冷启动,而Firebase会使它翻倍。

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

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

P.S。 getUser()中有一个synchronized块,这意味着工程师假定有人会尝试从另一个线程中调用它。我更担心内部结构,这些内部结构不是开源的。

P.P.S。另外,我的应用程序是单进程应用程序,因此不太可能为我多次调用FirebaseApp.initializeApp()(除非我在这里遗漏了一些东西)。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="your.package"
    >

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

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());