Почему ткань не инициализирована? 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.