Default FirebaseApp is not initialized in this process appName:Metrica
Delphian2015 opened this issue · 4 comments
Добрый день.
Инициализирую метрику в Application.onCreate
private void initYandexMetrica() {
YandexMetricaConfig.Builder configBuilder;
try {
configBuilder = YandexMetricaConfig.newConfigBuilder(getString(R.string.yandexmetrika_key));
} catch (Exception e) {
return;
}
if (Constants.IS_DEBUG) {
configBuilder.withLogs();
configBuilder.withCrashReporting(false);
configBuilder.withLocationTracking(false);
configBuilder.withNativeCrashReporting(false);
}
YandexMetrica.activate(getApplicationContext(), configBuilder.build());
YandexMetrica.enableActivityAutoTracking(this);
}
В одном из классов инициализирую Firebase:
FirebaseApp.initializeApp(this);
Получаю следующую ошибку:
E/AndroidRuntime: FATAL EXCEPTION: YMM-NC[appName_null]-18
Process: appName:Metrica, PID: 28196
java.lang.NoClassDefFoundError: com.google.android.gms.internal.firebase-perf.zzw
at com.google.android.gms.internal.firebase-perf.zzw.zzae(Unknown Source:1)
at com.google.android.gms.internal.firebase-perf.zzc.zzf(Unknown Source:79)
at com.google.firebase.perf.network.zze.disconnect(Unknown Source:20)
at com.google.firebase.perf.network.zzd.disconnect(Unknown Source:7)
at com.yandex.metrica.impl.bv.a(SourceFile:157)
at com.yandex.metrica.impl.as.a(SourceFile:82)
at com.yandex.metrica.impl.an.c(SourceFile:152)
at com.yandex.metrica.impl.an$a.run(SourceFile:217)
at com.yandex.metrica.impl.ob.ik.execute(SourceFile:18)
at com.yandex.metrica.impl.ob.il.execute(SourceFile:15)
at com.yandex.metrica.impl.an.run(SourceFile:91)
Caused by: java.lang.ExceptionInInitializerError
at com.google.android.gms.internal.firebase-perf.zzw.zzae(Unknown Source:1)
at com.google.android.gms.internal.firebase-perf.zzc.zzc(Unknown Source:54)
at com.google.firebase.perf.network.zze.zzap(Unknown Source:192)
at com.google.firebase.perf.network.zze.getResponseCode(Unknown Source:77)
at com.google.firebase.perf.network.zzd.getResponseCode(Unknown Source:15)
at com.yandex.metrica.impl.as.a(SourceFile:57)
at com.yandex.metrica.impl.an.c(SourceFile:152)
at com.yandex.metrica.impl.an$a.run(SourceFile:217)
at com.yandex.metrica.impl.ob.ik.execute(SourceFile:18)
at com.yandex.metrica.impl.ob.il.execute(SourceFile:15)
at com.yandex.metrica.impl.an.run(SourceFile:91)
Caused by: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process appName:Metrica. Make sure to call FirebaseApp.initializeApp(Context) first.
at com.google.firebase.FirebaseApp.getInstance(com.google.firebase:firebase-common@@16.0.1:219)
at com.google.android.gms.internal.firebase-perf.zzw.<init>(Unknown Source:14)
at com.google.android.gms.internal.firebase-perf.zzw.<clinit>(Unknown Source:17)
Привет.
Все выглядит так, что вы в процессе AppMetrica активируете какие-то классы, которые используют Firebase.
Для понимания, что делать с проблемой, нужно понять, как и для чего вы используете Firebase.
Тут есть несколько вариантов решения проблемы:
- активировать
FirebaseApp.initializeApp(this);
и для процесса AppMetrica. Для этого указанной код нужно перенести в точку, которая общая для всех процессов, то есть вApplication#onCreate()
. - не использовать функциональность FirebaseApp из процесса AppMetrica. Пока выглядит так, что вы с помощью Firebase пытаетесь снять какие-то perfomance-характеристики (похоже на работу с сетью). Можно от этого отказаться или воспользоваться предыдущим пунктом.
Также дополнительно укажите, пожалуйста, версию AppMetrica SDK, которую вы используете.
alexklints, спасибо за внимание к проблеме. Ситуация следующая: как только мы подключили AppMetrica начали появляться проблемы в Crashlytics:
`
Fatal Exception: java.lang.OutOfMemoryError pthread_create (1040KB stack) failed: Try again Raw Text
| java.lang.Thread.nativeCreate (Thread.java)
| java.lang.Thread.start (Thread.java:1063)
| java.util.concurrent.ThreadPoolExecutor.addWorker (ThreadPoolExecutor.java:920)
| java.util.concurrent.ThreadPoolExecutor.processWorkerExit (ThreadPoolExecutor.java:988)
| java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1130)
| java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)
| java.lang.Thread.run (Thread.java:818)
DatabaseWorker [appName] Raw Text
| java.lang.Object.wait (Object.java)
| com.yandex.metrica.impl.ob.fo$a.run (SourceFile:603)
`
Также значительно увеличилось количество ANR ошибок в Google Play, связанных с метрикой.
Но после того, как мы подключили Firebase Perfomance, мы начали беспрерывно получать ошибку, описанную в самому начале (FirebaseApp is not initialized).
Версия метрики 3.2.2. Firebase мы используем для разных целей, но работы с базами данных у нас нет, есть Crashlytics, Events, Properties и тд
Если я активирую FirebaseApp.initializeApp(this) в Application#onCreate() на что это может повлиять?
Давайте по порядку.
java.lang.NoClassDefFoundError: com.google.android.gms.internal.firebase-perf.zzw
Подключение AppMetrica привнесло в ваше приложение одно существенное изменение. У вас добавился дополнительный процесс. AppMetrica проводит всю обработку данных в своем процессе, так как мы стремимся минимально влиять на работу приложения (ресурсы, память, т.д.). Кроме того, только работа в отдельном процессе гарантирует, что AppMetrica сможет обработать все отправленные события, креши и т.д. даже в том случае, если приложение упадет.
Проблема возникает из-за того, что вы пытаетесь использовать Firebase Perfomance для замеров кода, который исполняется в процессе :Metrica
. Вероятнее всего речь идет о коде, который вызвается из Application#onCreate()
. Firebase Perfomance умеет собирать характиристики производительности только с главного процесса:
https://firebase.google.com/docs/perf-mon/get-started-android
Performance Monitoring only supports the main process in multi-process Android apps.
Существуют следующие решения проблем:
- перестать замерять код, который исполняется в процессе
:Metrica
; - можно принудительно заставить AppMetrica работать в главном процессе, но это приведет к тому, что в случае падения приложения вы будете терять аналитические данные, а сама AppMetrica будет сильнее влиять на производительность приложения.
Fatal Exception: java.lang.OutOfMemoryError pthread_create
Мы расследовали несколько таких случаев. Проблема характерна только для устройств Samsung и только на базе Android < 7.0. Анализ дампов памяти, которые попали в наше распоряжение показал, что иногда почему-то происходит сбой в работе Garbage collector, который по какой-то причине перестает собирать те объекты, на которые не осталось ссылок и которые доступны для очистки. В итоге, память перестает освобождаться и банальное пересоздание сервиса ведет к росту потребляемой памяти.
Почему проблема появилась или стала появляться чаще с AppMetrica? Тут все достаточно просто. Система часто не утилизирует процессы, в которых запускаются только сервисы. Чем чаще создаются/пересоздаются сервисы, тем дольше процесс не удаляется. Как правило, в этом случае, приложение видно в списке запущенных и якобы работает в фоне. Эта логика изменялась в 3 последних релизах Android.
Соответственно, приложение отправило несколько событий, сервис запустился, чтобы их обработать, после этого завершился. На этом этапе GC должен освободить память, но в некоторых случаях на Samsung он этого не делает. При этом, если процесс не был завершен системой, то память остается занятой и дальше.
Через какое-то время приложение опять отправляет события. Запускается новый сервис (так как старый был остановлен, чтобы не потреблять ресурсы), под который выделяется новая память. Через какое-то время достигается лимит доступной памяти и вылетает ошибка.
К сожалению, у нас сейчас нет идей, как легко можно такое починить.
ANR
Для понимания ситуации нужен полный дамп потоков. Из того, что вы привели видно только то, что во время возникновения ANR какой-то из потоков AppMetrica был в wait, что ни о чем не говорит.
Привет.
В свежей версии было исправление, направленное на устранение Fatal Exception: java.lang.OutOfMemoryError pthread_create. Пробуйте обновиться. Ситуация должна исправиться.