Personnaliser vos rapports d'erreur Firebase Crashlytics


Dans le tableau de bord Crashlytics, vous pouvez cliquer sur un problème pour obtenir un rapport d'événement détaillé. Vous pouvez personnaliser ces rapports pour mieux comprendre ce qui se passe dans votre application et les circonstances des événements signalés à Crashlytics.

Signaler les exceptions non détectées

Vous pouvez détecter automatiquement toutes les erreurs "fatales" générées dans le framework Flutter en remplaçant FlutterError.onError par FirebaseCrashlytics.instance.recordFlutterFatalError. Vous pouvez également remplacer FlutterError.onError par FirebaseCrashlytics.instance.recordFlutterError pour intercepter les exceptions "non fatales" :

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();
  bool weWantFatalErrorRecording = true;
  FlutterError.onError = (errorDetails) {
    if(weWantFatalErrorRecording){
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    } else {
      FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
    }
  };

  runApp(MyApp());
}

Erreurs asynchrones

Les erreurs asynchrones ne sont pas détectées par le framework Flutter :

ElevatedButton(
  onPressed: () async {
    throw Error();
  }
  ...
)

Pour détecter ces erreurs, vous pouvez utiliser le gestionnaire PlatformDispatcher.instance.onError :

Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    FlutterError.onError = (errorDetails) {
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    };
    // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
    PlatformDispatcher.instance.onError = (error, stack) {
      FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
      return true;
    };
    runApp(MyApp());

}

Erreurs en dehors de Flutter

Pour détecter les erreurs qui se produisent en dehors du contexte Flutter, installez un écouteur d'erreurs sur le Isolate actuel :

Isolate.current.addErrorListener(RawReceivePort((pair) async {
  final List<dynamic> errorAndStacktrace = pair;
  await FirebaseCrashlytics.instance.recordError(
    errorAndStacktrace.first,
    errorAndStacktrace.last,
    fatal: true,
  );
}).sendPort);

Signaler les exceptions interceptées

En plus de signaler automatiquement les plantages de votre application, Crashlytics vous permet d'enregistrer les exceptions non fatales et de vous les envoyer la prochaine fois qu'un événement fatal est signalé ou lorsque l'application redémarre.

Utilisez la méthode recordError pour enregistrer les exceptions non fatales dans les blocs catch de votre application. Exemple :

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error'
);

// Or you can use:
await FirebaseCrashlytics.instance.recordFlutterError(errorDetails);

Vous pouvez également enregistrer d'autres informations sur l'erreur à l'aide de la propriété information :

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error',
  information: ['further diagnostic information about the error', 'version 2.0'],
);

Ces exceptions s'affichent sous forme de problèmes non fatals dans la console Firebase. Le récapitulatif du problème contient toutes les informations sur l'état que vous obtenez normalement à partir des plantages, ainsi que des détails par version et par appareil.

Crashlytics traite les exceptions sur un thread d'arrière-plan dédié afin de minimiser l'impact sur les performances de votre application. Pour réduire le trafic réseau de vos utilisateurs, Crashlytics limitera le nombre de rapports envoyés hors de l'appareil, si nécessaire.

Ajouter des clés personnalisées

Les clés personnalisées vous permettent de connaître l'état spécifique de votre application pouvant entraîner un plantage. Vous pouvez associer des paires clé/valeur arbitraires à vos rapports d'erreur, puis utiliser les clés personnalisées pour rechercher et filtrer les rapports d'erreur dans la console Firebase.

  • Dans le tableau de bord Crashlytics, vous pouvez rechercher les problèmes qui correspondent à une clé personnalisée.

  • Lorsque vous examinez un problème spécifique dans la console, vous pouvez afficher les clés personnalisées associées à chaque événement (sous-onglet Clés) et même filtrer les événements par clés personnalisées (menu Filtrer en haut de la page).

Utilisez la méthode d'instance setCustomKey pour définir des paires clé/valeur. Voici quelques exemples :

// Set a key to a string.
FirebaseCrashlytics.instance.setCustomKey('str_key', 'hello');

// Set a key to a boolean.
FirebaseCrashlytics.instance.setCustomKey("bool_key", true);

// Set a key to an int.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1);

// Set a key to a long.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1L);

// Set a key to a float.
FirebaseCrashlytics.instance.setCustomKey("float_key", 1.0f);

// Set a key to a double.
FirebaseCrashlytics.instance.setCustomKey("double_key", 1.0);

Ajouter des messages de journaux personnalisés

Pour mieux comprendre les événements qui ont précédé un plantage, vous pouvez ajouter des journaux Crashlytics personnalisés à votre application. Crashlytics associe les journaux à vos données de plantage et les affiche dans la console Firebase, sous l'onglet Journaux de Crashlytics.

Utilisez log pour identifier les problèmes. Exemple :

FirebaseCrashlytics.instance.log("Higgs-Boson detected! Bailing out");

Définir des identifiants utilisateur

Pour diagnostiquer un problème, il est souvent utile de savoir quels utilisateurs ont rencontré un plantage donné. Crashlytics inclut un moyen d'identifier anonymement les utilisateurs dans vos rapports d'erreur.

Pour ajouter des User-ID à vos rapports, attribuez à chaque utilisateur un identifiant unique sous la forme d'un numéro d'ID, d'un jeton ou d'une valeur hachée :

FirebaseCrashlytics.instance.setUserIdentifier("12345");

Si vous devez effacer un identifiant utilisateur après l'avoir défini, réinitialisez la valeur sur une chaîne vide. Effacer un identifiant utilisateur ne supprime pas les enregistrements Crashlytics existants. Si vous devez supprimer des enregistrements associés à un ID utilisateur, contactez l'assistance Firebase.

Obtenir les journaux du fil d'Ariane

Les journaux de fil d'Ariane vous permettent de mieux comprendre les interactions d'un utilisateur avec votre application avant un plantage, une erreur non fatale ou un événement ANR. Ces journaux peuvent être utiles pour reproduire et déboguer un problème.

Les journaux de fil d'Ariane sont fournis par Google Analytics. Pour les obtenir, vous devez activer Google Analytics pour votre projet Firebase et ajouter le SDK Firebase pour Google Analytics à votre application. Une fois ces conditions remplies, les journaux de fil d'Ariane sont automatiquement inclus dans les données d'un événement dans l'onglet Journaux lorsque vous affichez les détails d'un problème.

Le SDK Analytics enregistre automatiquement l'événement screen_view, ce qui permet aux journaux de fil d'Ariane d'afficher la liste des écrans consultés avant le plantage, l'erreur non fatale ou l'événement ANR. Un journal de breadcrumbs screen_view contient un paramètre firebase_screen_class.

Les journaux de navigation sont également renseignés avec les événements personnalisés que vous enregistrez manuellement dans la session de l'utilisateur, y compris les données des paramètres de l'événement. Ces données peuvent aider à afficher une série d'actions utilisateur ayant conduit à un plantage, une erreur non fatale ou un événement ANR.

Notez que vous pouvez contrôler la collecte et l'utilisation des données Google Analytics, y compris celles qui alimentent les journaux de fil d'Ariane.

Activer les rapports d'activation

Par défaut, Crashlytics collecte automatiquement les rapports d'erreur 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 avec option d'activation en désactivant les rapports automatiques et en n'envoyant des données à Crashlytics que lorsque vous le choisissez dans votre code.

  1. Désactivez la collecte automatique de manière native :

    Plates-formes Apple

    Ajoutez une clé à votre fichier Info.plist :

    • Clé : FirebaseCrashlyticsCollectionEnabled
    • Valeur : false

    Android

    Dans le bloc application de votre fichier AndroidManifest.xml, ajoutez un tag meta-data pour désactiver la collecte automatique :

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. Activez la collecte pour certains utilisateurs en appelant le remplacement de la collecte de données Crashlytics au moment de l'exécution. La valeur de remplacement persiste lors de tous les lancements ultérieurs de votre application. Crashlytics peut ainsi collecter automatiquement des rapports pour cet utilisateur.

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

    Si l'utilisateur désactive ultérieurement la collecte de données, vous pouvez transmettre false comme valeur de remplacement. Cette valeur s'appliquera la prochaine fois que l'utilisateur lancera l'application et persistera lors de tous les lancements ultérieurs pour cet utilisateur.

Gérer les données des insights sur les plantages

Les insights sur les plantages vous aident à résoudre les problèmes en comparant vos traces de pile anonymisées à celles d'autres applications Firebase. Ils vous indiquent si votre problème fait partie d'une tendance plus large. Pour de nombreux problèmes, les insights sur les plantages fournissent même des ressources pour vous aider à déboguer le plantage.

Crash Insights utilise des données de plantage agrégées pour identifier les tendances de stabilité courantes. Si vous préférez ne pas partager les données de votre application, vous pouvez désactiver les insights sur les plantages dans le menu Insights sur les plantages en haut de la liste des problèmes Crashlytics de la Firebase Console.