web-dev-qa-db-fra.com

Pourquoi Fabric n'est-il pas initialisé? Java.lang.IllegalStateException: Doit initialiser la structure avant d'utiliser singleton ()

J'ai configuré Firebase Crashlytics selon Commencez avec Firebase Crashlytics pour mon application Android (à l'aide du studio Android 3.1.3). Sur mon propre appareil ainsi que sur l’émulateur, tout fonctionne correctement et mes accidents apparaissent correctement dans la console Firebase. Jusqu'ici tout va bien.

Cependant, l'un des utilisateurs de mon application a rencontré un problème inattendu:

Java.lang.IllegalStateException: Doit initialiser la structure avant d'utiliser singleton ()

L'exception a été levée dans une autre activité que MainActivity.

Je suis conscient que vous pouvez exécuter manuellement l’initialisation comme décrit ici en appelant Fabric.with(this, new Crashlytics());. Cependant, rien n’indique à propos de l’initialisation manuelle de Crashlytics dans l’article Getting Started mentionné ci-dessus. Je m'attendais à ce que cela se fasse automatiquement car tous mes tests fonctionnent correctement. Alors, pourquoi Crashlytics est-il configuré correctement pour certains utilisateurs et d'autres non?

18
John Threepwood

Vous devez initialiser Crashlytics dans onCreate de votre application.

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());
    }
}
11
Gil Goldzweig

Dans mon cas, les vérifications ci-dessous ont permis de supprimer l’erreur.

Si vous trouvez un code comme ci-dessous dans votre manifest , définissez-le sur true ou supprimez-le car il est vrai par défaut.

   <meta-data
      Android:name="firebase_crashlytics_collection_enabled"
      Android:value="false" /> 

En outre, si la valeur est extraite de votre build.gradle, vérifiez quel buildType est dedans et envisagez de ne pas appeler de fonction Crashlytics sous ce buildType.

Exemple: build.gradle

Android{

    ...

   buildTypes {
        debug{
            manifestPlaceholders = [enableCrashReporting:"false"]
        }
        release {
            manifestPlaceholders = [enableCrashReporting:"true"]
        }
   }
}

Dans ce cas, vous devriez placer vos appels Crashlytics comme suit: 

if(!BuildConfig.DEBUG){
   ...
   Crashlytics.setUserIdentifier(...)
   ...
}
1
Jishin Dev

Lorsque vous utilisez Firebase Crashlytics, vous n’avez pas besoin d’initialiser Fabric. Tout se fait automatiquement.

Toutefois, si vous souhaitez effectuer une journalisation personnalisée, via (par exemple) Crashlytics.log("Custom log"), vous devez activer FirebaseCrashlytics dans votre manifeste. Vérifiez le manifeste si vous avez quelque chose comme ça:

<meta-data
    Android:name="firebase_crashlytics_collection_enabled"
    Android:value="${crashlyticsEnabled}" />

${crashlyticsEnabled} peut être défini sur true ou false ou via votre niveau d'application build.gradle . Ceci est généralement utilisé pour désactiver Firebase Crashlytics lorsque vous déboguez l'application.

1
hiddeneyes02

Si vous utilisiez Android:process, l'initialisation automatique ne fonctionnerait pas, car elle fonctionne en utilisant un fournisseur de contenu dans votre manifeste. Dans ce cas, vous devrez initialiser manuellement Crashlytics .

1
Mygod