firebase / firebase/quickstart-android
Critical Startup ANRs during FirebaseApp.initializeApp on Android
- Dominant language
- Kotlin
- Stars
- 9.3k
- Forks
- 7.4k
- Avg merge
- 2d 19h
- Merged PRs (30d)
- 8
Description
* Android device: oppo,xiaomi,Transsion,vivo
* Android OS version: 13,14,15,16
* Google Play Services version: Unable to determine the GMS version on the user's phone
* Firebase/Play Services SDK version: com.google.firebase:firebase-bom:33.9.0
### Step 2: Describe the problem:
We are experiencing a high volume of startup ANRs (Application Not Responding) on our production Android app, specifically during the Firebase initialization process.
History of Attempts to Fix:
1. Initial State: We used the default automatic initialization via FirebaseInitProvider . This resulted in significant startup ANRs as reported by Google Play Console and Firebase Crashlytics.
2. Current Implementation: To optimize startup performance, we disabled the automatic initialization in AndroidManifest.xml and moved the initialization to a manual call within the Application.onCreate() method.
3. Outcome: Unfortunately, the ANR rate has not improved. The main thread still gets blocked during the manual call to FirebaseApp.initializeApp
#### Steps to reproduce:
Clicking the icon to launch the application may reproduce this issue on low- to mid-range devices. The screen remains black and unresponsive upon launch.The ANR tracker consistently shows that the main thread is stuck at `FirebaseApp.initializeApp`. It appears that internal components (such as Analytics or Crashlytics) are performing time-consuming synchronous I/O or lock contention during initialization.
#### Relevant Code:
// In Application.kt
override fun onCreate() {
super.onCreate()
// Manual initialization to avoid ContentProvider blocking
FirebaseUtil.initFirebase(this)
}
fun initFirebase(context: Application) {
runCatching {
val option = FirebaseOptions.Builder().apply {
setApplicationId(AppConstants.APP_ID_RESOURCE_NAME)
setApiKey(AppConstants.API_KEY_RESOURCE_NAME)
setProjectId(AppConstants.PROJECT_ID_RESOURCE_NAME)
setGcmSenderId(AppConstants.GCM_SENDER_ID_RESOURCE_NAME)
setStorageBucket(AppConstants.STORAGE_BUCKET_RESOURCE_NAME)
}.build()
// This call is identified as the main thread blocker in ANR traces
firebaseApp = FirebaseApp.initializeApp(context, option)?.apply {
setAutomaticResourceManagementEnabled(true)
}
}
}
In AndroidManfiest.xml
ANR traces::
main (runnable):tid=1 systid=5624
at com.google.firebase.crashlytics.internal.common.CrashlyticsReportDataCapture.(CrashlyticsReportDataCapture.java:14)
at com.google.firebase.crashlytics.internal.common.SessionReportingCoordinator.create(SessionReportingCoordinator.java:75)
at com.google.firebase.crashlytics.internal.common.CrashlyticsCore.onPreExecute(CrashlyticsCore.java:163)
at com.google.firebase.crashlytics.FirebaseCrashlytics.init(FirebaseCrashlytics.java:168)
at com.google.firebase.crashlytics.CrashlyticsRegistrar.buildCrashlytics(CrashlyticsRegistrar.java:79)
at com.google.firebase.tracing.ComponentMonitor.lambda$processRegistrar$0(ComponentMonitor.java:38)
at com.google.firebase.components.ComponentRuntime.lambda$discoverComponents$0(ComponentRuntime.java:160)
at com.google.firebase.components.Lazy.get(Lazy.java:53)
at com.google.firebase.components.ComponentRuntime.doInitializeEagerComponents(ComponentRuntime.java:322)
at com.google.firebase.components.ComponentRuntime.initializeEagerComponents(ComponentRuntime.java:312)
at com.google.firebase.FirebaseApp.initializeAllApis(FirebaseApp.java:607)
at com.google.firebase.FirebaseApp.initializeApp(FirebaseApp.java:300)
at com.google.firebase.FirebaseApp.initializeApp(FirebaseApp.java:264)
at com.xxx.xxx.FirebaseUtil.initFirebase(FirebaseUtil.java:63)
at com.xxx.xxx.Application.onCreate(Application.kt:138)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1386)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7648)
at android.app.ActivityThread.-$$Nest$mhandleBindApplication(unavailable)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2477)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loopOnce(Looper.java:232)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8886)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:681)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:915)
Contributor guide
Research direction
Start with Application.kt and FirebaseUtil.initFirebase, then inspect the FirebaseInitProvider removal in AndroidManifest.xml and the reported FirebaseApp.initializeApp stack trace. Reproduce startup on the listed low- to mid-range Android devices if possible and identify whether initialization or an eager component blocks the main thread; done means the startup ANR is resolved and the result is verified in traces.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, kotlin
- Domain
- mobile, performance
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100