Firebase Crashlytics-Absturzberichte anpassen


Im Dashboard Crashlytics können Sie auf ein Problem klicken, um einen detaillierten Ereignisbericht aufzurufen. Sie können diese Berichte anpassen, um besser nachvollziehen zu können, was in Ihrer App passiert und welche Umstände zu den bei Crashlytics gemeldeten Ereignissen geführt haben.

Nicht erfasste Ausnahmen melden

Sie können alle „fatalen“ Fehler, die im Flutter-Framework auftreten, automatisch abfangen, indem Sie FlutterError.onError durch FirebaseCrashlytics.instance.recordFlutterFatalError überschreiben. Alternativ können Sie auch FlutterError.onError mit FirebaseCrashlytics.instance.recordFlutterError überschreiben, um auch nicht schwerwiegende Ausnahmen zu erfassen:

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

Asynchrone Fehler

Asynchrone Fehler werden vom Flutter-Framework nicht erkannt:

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

Sie können den PlatformDispatcher.instance.onError-Handler verwenden, um solche Fehler zu erfassen:

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());

}

Fehler außerhalb von Flutter

Wenn Sie Fehler außerhalb des Flutter-Kontexts abfangen möchten, installieren Sie einen Fehlerlistener auf der aktuellen Isolate:

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

Erkannte Ausnahmen melden

Mit Crashlytics kannst du nicht nur die Abstürze deiner App automatisch melden, sondern auch nicht schwerwiegende Ausnahmen aufzeichnen und an dich senden, wenn das nächste Mal ein schwerwiegendes Ereignis gemeldet wird oder die App neu gestartet wird.

Verwenden Sie die Methode recordError, um nicht fatale Ausnahmen in den Catch-Blöcken Ihrer App zu erfassen. Beispiel:

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

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

Möglicherweise möchten Sie auch weitere Informationen zum Fehler protokollieren. Das ist mithilfe der Eigenschaft information möglich:

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

Diese Ausnahmen werden in der Firebase-Konsole als nicht schwerwiegende Probleme angezeigt. Die Problemübersicht enthält alle Statusinformationen, die Sie normalerweise bei Abstürzen erhalten, sowie Aufschlüsselungen nach Version und Hardwaregerät.

Crashlytics verarbeitet Ausnahmen in einem speziellen Hintergrund-Thread, um die Leistungsauswirkungen auf Ihre App zu minimieren. Um den Netzwerkverkehr Ihrer Nutzer zu reduzieren, begrenzt Crashlytics bei Bedarf die Anzahl der vom Gerät gesendeten Berichte.

Benutzerdefinierte Schlüssel hinzufügen

Mit benutzerdefinierten Schlüsseln können Sie den spezifischen Status Ihrer App abrufen, der zu einem Absturz führte. Sie können Ihren Absturzberichten beliebige Schlüssel/Wert-Paare zuordnen und dann mithilfe der benutzerdefinierten Schlüssel Absturzberichte in der Firebase-Konsole suchen und filtern.

  • Im Crashlytics-Dashboard können Sie nach Problemen suchen, die mit einem benutzerdefinierten Schlüssel übereinstimmen.

  • Wenn Sie sich ein bestimmtes Problem in der Console ansehen, können Sie auf dem Unter-Tab Schlüssel die zugehörigen benutzerdefinierten Schlüssel für jedes Ereignis aufrufen und die Ereignisse sogar über das Menü Filter oben auf der Seite nach benutzerdefinierten Schlüsseln filtern.

Verwenden Sie die Instanzmethode setCustomKey, um Schlüssel/Wert-Paare festzulegen. Hier einige Beispiele:

// 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);

Benutzerdefinierte Protokollmeldungen hinzufügen

Wenn Sie mehr Kontext zu den Ereignissen erhalten möchten, die zu einem Absturz geführt haben, können Sie Ihrer App benutzerdefinierte Crashlytics-Protokolle hinzufügen. Crashlytics verknüpft die Protokolle mit Ihren Absturzdaten und zeigt sie in der Firebase-Konsole auf dem Tab Crashlytics Protokolle an.

Verwende log, um Probleme zu lokalisieren. Beispiel:

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

Nutzerkennungen festlegen

Zur Diagnose eines Problems ist es oft hilfreich zu wissen, bei welchen Nutzern ein bestimmter Absturz aufgetreten ist. Crashlytics bietet eine Möglichkeit, Nutzer in Ihren Absturzberichten anonym zu identifizieren.

Wenn Sie Ihren Berichten User-IDs hinzufügen möchten, weisen Sie jedem Nutzer eine eindeutige Kennung in Form einer ID-Nummer, eines Tokens oder eines Hashwerts zu:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

Wenn Sie eine Nutzer-ID nach dem Festlegen löschen möchten, setzen Sie den Wert auf einen leeren String zurück. Durch das Löschen einer Nutzer-ID werden die vorhandenen Crashlytics-Einträge nicht entfernt. Wenn Sie Einträge löschen möchten, die mit einer Nutzer-ID verknüpft sind, wenden Sie sich an den Firebase-Support.

Navigationspfad-Logs abrufen

Mit Navigationspfadlogs erhalten Sie einen besseren Einblick in die Interaktionen eines Nutzers mit Ihrer App, die zu einem Absturz-, nicht schwerwiegenden oder ANR-Ereignis geführt haben. Diese Protokolle können hilfreich sein, wenn Sie versuchen, ein Problem zu reproduzieren und zu beheben.

Navigationspfadlogs werden von Google Analytics bereitgestellt. Wenn Sie also Navigationspfadlogs erhalten möchten, müssen Sie Google Analytics für Ihr Firebase-Projekt aktivieren und Ihrer App das Firebase SDK für Google Analytics hinzufügen. Wenn diese Anforderungen erfüllt sind, werden Navigationspfadlogs automatisch in die Daten eines Ereignisses auf dem Tab Logs eingefügt, wenn Sie sich die Details eines Problems ansehen.

Das Analytics SDK protokolliert das screen_view-Ereignis automatisch. Dadurch können in den Navigationspfad-Logs eine Liste der Bildschirme angezeigt werden, die vor dem Absturz, dem nicht schwerwiegenden Ereignis oder dem ANR-Ereignis aufgerufen wurden. Ein screen_view-Navigationspfad-Log enthält einen firebase_screen_class-Parameter.

In Breadcrumb-Protokollen werden auch alle benutzerdefinierten Ereignisse erfasst, die Sie manuell in der Sitzung des Nutzers erfassen, einschließlich der Parameterdaten des Ereignisses. Anhand dieser Daten können Sie eine Reihe von Nutzeraktionen nachvollziehen, die zu einem Absturz, einem nicht schwerwiegenden Ereignis oder einem ANR-Ereignis geführt haben.

Sie können die Erfassung und Verwendung von Google Analytics-Daten steuern. Dazu gehören auch die Daten, die in Navigationspfadlogs gefüllt werden.

Opt-in-Berichte aktivieren

Standardmäßig erfasst Crashlytics automatisch Absturzberichte für alle Nutzer Ihrer App. Um Nutzern mehr Kontrolle über die von ihnen gesendeten Daten zu geben, können Sie die Funktion „Opt-in-Berichte“ aktivieren. Dazu deaktivieren Sie die automatische Berichterstellung und senden Daten nur dann an Crashlytics, wenn Sie dies in Ihrem Code angeben:

  1. Automatische Erhebung nativ deaktivieren:

    Apple-Plattformen

    Fügen Sie der Datei Info.plist einen neuen Schlüssel hinzu:

    • Schlüssel: FirebaseCrashlyticsCollectionEnabled
    • Wert: false

    Android

    Fügen Sie in der AndroidManifest.xml-Datei im application-Block das Tag meta-data hinzu, um die automatische Erfassung zu deaktivieren:

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. Aktivieren Sie die Erhebung für ausgewählte Nutzer, indem Sie die Datenerhebungsüberschreibung Crashlytics zur Laufzeit aufrufen.

    Der Überschreibungswert bleibt bei jedem Start Ihrer App erhalten, damit Crashlytics Berichte automatisch erfassen kann. Wenn Sie automatische Absturzberichte deaktivieren möchten, übergeben Sie false als Überschreibungswert. Wenn false festgelegt ist, gilt der neue Wert erst bei der nächsten Ausführung der Anwendung.

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

Crash Insights-Daten verwalten

Mit Absturzinformationen können Sie Probleme beheben, indem Sie Ihre anonymisierten Stacktraces mit Traces aus anderen Firebase-Apps vergleichen. Außerdem erfahren Sie, ob Ihr Problem Teil eines größeren Trends ist. Bei vielen Problemen finden Sie in Crash Insights sogar Ressourcen, mit denen Sie den Absturz beheben können.

In Crash Insights werden aggregierte Absturzdaten verwendet, um häufige Stabilitätstrends zu identifizieren. Wenn Sie die Daten Ihrer App nicht freigeben möchten, können Sie Crash Insights in der Firebase-Konsole im Menü Crash Insights oben in der Crashlytics-Problemliste deaktivieren.