Почему ткань не инициализирована? java.lang.IllegalStateException: необходимо инициализировать ткань перед использованием singleton()
Я установил Firebase Crashlytics в соответствии с началом работы с Firebase Crashlytics для моего Android-приложения (с использованием Android-студии 3.1.3). На моем собственном устройстве, а также на эмуляторе все работает отлично, и мои сбои отображаются правильно в Firebase Console. Все идет нормально.
Однако произошел сбой для одного из моих пользователей приложений, который был неожиданным:
java.lang.IllegalStateException: необходимо инициализировать ткань перед использованием singleton()
Исключение было выбрано в другой Activity, чем MainActivity.
Я знаю, что вы могли бы вручную выполнить инициализацию, как описано здесь, вызывая Fabric.with(this, new Crashlytics());
Однако ничего не сказано о том, что нужно вручную инициализировать Crashlytics в статье "Начало работы", упомянутой выше. Я ожидал, что это будет сделано автоматически, так как все мои собственные тесты проходят нормально. Так почему же для некоторых пользователей Crashlytics настроена правильно, а для некоторых нет?
Ответы
Ответ 1
Вам необходимо инициализировать Crashlytics в вашем приложении onCreate
import android.app.Application;
import com.crashlytics.android.Crashlytics;
import io.fabric.sdk.android.Fabric;
public class TestApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Fabric.with(this, new Crashlytics());
}
}
Ответ 2
В моем случае, приведенные ниже проверки помогли избавиться от ошибки.
Если вы найдете код, подобный приведенному ниже, в своем манифесте, установите для него значение true или удалите его, поскольку по умолчанию он имеет значение true.
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
Также, если значение извлекается из вашего build.gradle, проверьте, какой buildType его использует, и рассмотрите возможность не вызывать какие-либо функции Crashlytics в этом buildType.
Пример: build.gradle
android{
...
buildTypes {
debug{
manifestPlaceholders = [enableCrashReporting:"false"]
}
release {
manifestPlaceholders = [enableCrashReporting:"true"]
}
}
}
В этом случае ваши вызовы Crashlytics должны быть упакованы так:
if(!BuildConfig.DEBUG){
...
Crashlytics.setUserIdentifier(...)
...
}
Ответ 3
Когда вы используете Firebase Crashlytics, вам не нужно выполнять какую-либо инициализацию Fabric. Все делается автоматически.
Но если вы хотите выполнить произвольное ведение журнала, используя (например) Crashlytics.log("Custom log")
, вы должны включить FirebaseCrashlytics в манифест. Проверьте манифест, если у вас есть что-то вроде этого:
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="${crashlyticsEnabled}" />
${crashlyticsEnabled}
может быть установлено в true
или false
или через ваш уровень сборки build.gradle. Обычно это используется для отключения Firebase Crashlytics при отладке приложения.
Ответ 4
Если вы использовали android:process
, то автоматическая инициализация не будет работать, потому что она работает с использованием поставщика контента в вашем манифесте. В этом случае вам придется вручную инициализировать Crashlytics.
Ответ 5
Если вы мигрировали из Fabric.io в Firebase, должны быть строки, которые нужно УДАЛИТЬ из AndroidManifest.xml
<!-- Fabric.io Analytics key -->
<meta-data
android:name="io.fabric.ApiKey"
android:value="49yy995568140ee22uio128e00450bd99603fd43" />
С этими строками плагин Crashlytics НЕ может быть правильно инициализирован Firebase.