在我的设置中,Firebase的启动时间约为250毫秒(在Nexus 5上,冷启动时有无FirebaseInitProvider / CrashlyticsInitProvider
时,“到第一次显示的时间”中的差值)。这是一个问题,因为如果没有Firebase,我的应用程序仅需要350毫秒进行冷启动,而Firebase会使它翻倍。
我正在考虑禁用默认的FirebaseInitProvider
和CrashlyticsInitProvider
,它们在应用程序启动之前在主线程上运行,并在后台线程上手动进行初始化(例如,从{{1}开始) }。
问:在后台线程上调用Application.onCreate()
是否安全?如果是这样,我应该注意什么?我知道如果需要FirebaseApp.initializeApp()
当Firebase仍在后台启动时,我必须实现一些锁定,以便我的线程等待它准备就绪。我也不关心准确的屏幕时间报告,因此,如果Firebase Analyics延迟注册其活动生命周期回调,这不是问题。
P.S。 getUser()
中有一个synchronized
块,这意味着工程师假定有人会尝试从另一个线程中调用它。我更担心内部结构,这些内部结构不是开源的。
P.P.S。另外,我的应用程序是单进程应用程序,因此不太可能为我多次调用FirebaseApp.initializeApp()
(除非我在这里遗漏了一些东西)。
答案 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());