44 votes

Crashlytics de Fabric avec Firebase ne peut pas être désactivé pour les constructions DEBUG

J'ai une application qui utilise Crashlytics de Fabric via Firebase. Ce qui suit est la première chose exécutée dans mes applications onCreate

CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
    .disabled(BuildConfig.DEBUG)
    .build();
Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());

Néanmoins, les collisions sont présentées dans DEBUG == true mode.

J'utilise les versions suivantes

dans mon build.gradle classpath "io.fabric.tools:gradle:1.25.1"

dans mon app/build.gradle implementation "com.crashlytics.sdk.android:crashlytics:2.9.1"

Malheureusement, les crashs sont toujours signalés. Avez-vous une idée de ce que je fais de mal ?

0 votes

1 votes

Merci, mais je n'utilise pas firebase-crash car il est maintenant déprécié. Votre réponse proposée l'utilise. J'utilise crashlytics, il est juste connecté avec la console firebase.

133voto

reVerse Points 28977

Les réponses correctes ont été postées par Bob Snyder y niqueco Cependant, il semble déjà un peu fastidieux de changer la valeur des méta-données chaque fois que vous créez une version APK actuelle. manifestPlaceholder et change automatiquement la valeur en true o false en fonction de la buildType .

Ajoutez les éléments suivants à vos applications build.gradle

android {

    // ...

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

}

Et ceci pour votre AndroidManifest.xml

<manifest ... >

    <application ...>

        // ...

        <meta-data android:name="firebase_crashlytics_collection_enabled" android:value="${enableCrashReporting}" />

    </application>

</manifest>

Vous pouvez vérifier la valeur actuelle en cliquant sur l'icône de l'appareil. Merged Manifest une fois que vous avez ouvert le fichier AndroidManifest.xml. Vous devriez voir quelque chose comme ceci :

Merged manifest meta-data value for crash reporting

1 votes

Il établit un lien avec les autres réponses qui expliquent le raisonnement ET il fournit également une SOLUTION propre.

0 votes

Meilleure approche et plus générique. Merci :)

0 votes

Oui, c'est exactement comme ça que je fais. J'ai upvoted votre réponse. Cependant, je laisse la réponse acceptée telle quelle, car elle m'a conduit à la bonne solution.

44voto

Bob Snyder Points 24996

El Documentation Firebase Crashlytics explique qu'une fois que le reporting est activé dans une session d'application, il ne peut pas être désactivé.

Par défaut, les rapports Crashlytics sont activés dans un fichier de type ContentProvider nommé CrashlyticsInitProvider qui s'exécute avant votre Application est créée. CrashlyticsInitProvider active ou désactive le rapport basé sur la valeur des méta-données firebase_crashlytics_collection_enabled qui, par défaut, est vrai.

Si vous souhaitez désactiver le reporting, il est essentiel que les métadonnées du manifeste soient présentes et définies sur false :

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

Regardez dans le logcat pendant l'initialisation de l'application pour trouver le message :

CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful

Si le message est présent, firebase_crashlytics_collection_enabled est vrai. Si le message n'est pas présent, vous avez réussi à paramétrer les métadonnées pour désactiver le rapport d'accident.

Si les méta-données sont absentes ou définies à true, vous ne pouvez pas désactiver le rapport dans votre code en utilisant un appel à Fabric.with(...) .

Dans un commentaire d'une autre réponse, vous indiquez que vous avez essayé de désactiver la déclaration à l'aide des méta-données sans y parvenir. Vérifiez qu'il n'y a pas de faute de frappe et assurez-vous que la déclaration est correctement placée dans le champ <application> élément. Dans mes tests, je suis capable de désactiver le reporting en utilisant les méta-données et de l'activer au moment de l'exécution.

0 votes

Merci, je vais réessayer.

0 votes

Ce sont plusieurs questions qui, ensemble, ont conduit au problème. Votre réponse m'a aidé à les résoudre, donc je l'accepte. Je vous remercie.

3 votes

J'ai moi-même le même problème et cette solution ne semble pas suffisante. J'ai ajouté les méta-données, je n'ai PAS "CrashlyticsInitProvider initialization successful" dans les logs, j'ai quadruplé la vérification de ce qui suit Fabric.with(this, new Crashlytics()); n'est appelé que sur les constructions non déboguées, j'ai la version 2.9.3 du SDK, et je reçois toujours des rapports de panne. Aidez-moi s'il vous plaît - s'il n'y a rien d'autre à faire, je vais essayer la solution basée sur gradle mentionnée ci-dessous.

9voto

niqueco Points 1086

J'ai enfin trouvé le problème. Crashlytics est initialisé à partir d'un fournisseur de contenu, donc au moment où vous essayez de désactiver à partir de l'Application's onCreate() il est trop tard. En parcourant le code décompilé, j'ai vu que l'on peut désactiver cette initialisation en ajoutant des métadonnées à l'élément <application> du manifeste.

Donc, ce que je fais c'est ça... J'ai ajouté ceci à app/src/debug/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><!--suppress ALL -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="<your app package>">

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

</manifest>

J'ai également désactivé Crashlytics dans le fichier de construction du module d'application gradle en ajoutant :

    debug {
        ext.enableCrashlytics = false
    }

A ma grande surprise, je n'ai pas eu besoin de faire la Fabric.with(...) chose. Ce qui précède était suffisant.

Il fonctionne bien : aucun rapport.

0 votes

Merci, je vais réessayer.

0 votes

Ext.enableCrashlytics = false Cette ligne fait planter mon application avec le message suivant - "Cette application repose sur Crashlytics. Veuillez vous inscrire pour y avoir accès à fabric.io/sign_up ,"

2 votes

@AjithMemana Cela fonctionne pour l'ancien Fabric Crashlytics. Ce n'est pas le Crashlytics de Fabric avec Firebase qui est la question. Pour cela, regardez la réponse acceptée

3voto

J'ai obtenu cette information de la documentation Android Personnalisez vos rapports de collision Firebase

Activez les rapports opt-in : Par défaut, Firebase Crashlytics collecte automatiquement les rapports de collision pour tous les utilisateurs de votre application. Pour donner aux utilisateurs plus de contrôle sur les données qu'ils envoient, vous pouvez activer les rapports opt-in à la place.

Pour ce faire, vous devez désactiver la collecte automatique et initialiser Crashlytics uniquement pour les utilisateurs opt-in.

Désactivez la collecte automatique à l'aide d'une balise meta-data dans votre fichier AndroidManifest.xml :

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

Activez la collecte pour les utilisateurs sélectionnés en initialisant Crashlytics à partir d'une des activités de votre application :

Fabric.with(this, new Crashlytics());

2voto

vm345 Points 604

Vous devez désactiver Crashlytics du fichier build.gradle de l'application. Désactiver Crashlytics pour les builds de débogage

android {
    buildTypes {
        debug {
          // Disable fabric build ID generation for debug builds
          ext.enableCrashlytics = false
          ...

0 votes

Merci encore, mais j'ai besoin de le faire au moment de l'exécution pour plusieurs raisons. Savez-vous pourquoi .disabled ne fonctionne pas ? Il fonctionne parfaitement dans d'autres applications, où je n'ai pas de Firebase connecté. Il semble que ce soit un bug de Firebase, non ?

0 votes

Vous devez faire ext.enableCrashlytics = false dans votre gradle et CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder() .disabled(BuildConfig.DEBUG) .build(); Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build()); dans votre classe d'application

0 votes

Malheureusement, non. Il déploie toujours les crashs produits en mode débogage. J'ai également essayé de le désactiver dans le manifeste avec firebase_crashlytics_collection_enabled.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X