Dostosowywanie raportów o awariach Firebase Crashlytics


W panelu Crashlytics możesz kliknąć problem i wyświetlić szczegółowe w raporcie o zdarzeniach. Możesz dostosowywać te raporty, aby lepiej rozumieć, co dzieje się w aplikacji, i jakie są okoliczności związane ze zgłoszonymi zdarzeniami w Crashlytics.

Zgłoś niewykryte wyjątki

Możesz automatycznie przechwytywać wszystkie „krytyczne” błędy występujące w ramach frameworka Fluttera, zastępując FlutterError.onError wartością FirebaseCrashlytics.instance.recordFlutterFatalError. Ewentualnie aby wychwytywać także „niekrytyczne”, wyjątki, zastąp FlutterError.onError wartością FirebaseCrashlytics.instance.recordFlutterError:

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

Błędy asynchroniczne

Błędy asynchroniczne nie są przechwytywane przez framework Flutter:

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

Aby wykrywać takie błędy, możesz użyć modułu obsługi 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());

}

Błędy poza Flutter

Aby wykrywać błędy występujące poza kontekstem Fluttera, zainstaluj listenera błędów w bieżącym Isolate:

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

Zgłaszanie wykrytych wyjątków

Oprócz automatycznego zgłaszania awarii aplikacji Crashlytics umożliwia rejestrowanie niekrytycznych wyjątków i przesyłanie ich do Ciebie przy następnym zgłoszeniu krytycznego zdarzenia lub po ponownym uruchomieniu aplikacji.

Używaj metody recordError, aby rejestrować niekrytyczne wyjątki w łatwości dostępu aplikacji bloki. Przykład:

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

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

Możesz też spróbować skonfigurować rejestrowanie dodatkowych informacji o błędzie za pomocą właściwości information:

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

Te wyjątki są widoczne w konsoli Firebase jako problemy niekrytyczne. Podsumowanie problemu zawiera wszystkie informacje o stanie, które zwykle otrzymujesz z wypadków, a także zestawienia według wersji i urządzenia.

Crashlytics przetwarza wyjątki na osobnym wątku w tle, aby zminimalizować wpływ na wydajność aplikacji. Aby zmniejszyć ruch w sieci użytkowników, Crashlytics w razie potrzeby ogranicza liczbę raportów wysyłanych z urządzenia.

Dodawanie kluczy niestandardowych

Klucze niestandardowe pomagają uzyskać konkretny stan aplikacji, który doprowadził do awarii. Możesz powiązać z raportami o awariach dowolne pary klucz-wartość, a następnie używać niestandardowych kluczy do wyszukiwania i filtrowania raportów o awariach w konsoli Firebase.

  • W panelu Crashlytics, możesz wyszukać problemy pasujące do klucza niestandardowego.

  • Podczas sprawdzania konkretnego problemu w konsoli możesz wyświetlić powiązane klucze niestandardowe dla każdego zdarzenia (podkarta Klucze) i nawet je filtrować według kluczy niestandardowych (menu Filtr u góry strony).

Do ustawiania par klucz-wartość użyj metody instancji setCustomKey. Oto kilka przykładów:

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

Dodaj niestandardowe komunikaty logu

Aby uzyskać więcej informacji na temat zdarzeń prowadzących do awarii, możesz dodać niestandardowe logi Crashlytics do Twojej aplikacji. Crashlytics wiąże logi z danymi o awariach i wyświetla je konsola Firebase, na karcie Crashlytics Logi.

Aby wskazać problemy, użyj log. Przykład:

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

Ustawianie identyfikatorów użytkowników

Aby zdiagnozować problem, często warto wiedzieć, którzy użytkownicy doświadczyli danego błędu. Crashlytics umożliwia anonimowe identyfikowanie użytkowników w raportach o awariach.

Aby dodawać identyfikatory użytkowników do raportów, przypisz do każdego z nich unikalny identyfikator w postaci numeru identyfikacyjnego, tokena lub wartości zaszyfrowanej:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

Jeśli po ustawieniu identyfikatora użytkownika trzeba będzie go usunąć, zresetuj wartość do pustym ciągiem znaków. Wyczyszczenie identyfikatora użytkownika nie powoduje usunięcia istniejących rekordów Crashlytics. Jeśli musisz usunąć rekordy powiązane z użytkownikiem ID, skontaktuj się z zespołem pomocy Firebase.

Pobieranie dzienników elementów menu nawigacyjnego

Dzięki dziennikom śladów możesz lepiej poznać interakcje użytkownika z aplikacją, które doprowadziły do awarii, niekrytycznego błędu lub zdarzenia ANR. Te logi mogą być przydatne podczas próby odtworzenia i debugowania problemu.

Logi ścieżki są obsługiwane przez Google Analytics, więc aby je uzyskać, musisz włączyć Google Analytics w projekcie Firebase i dodać do aplikacji pakiet SDK Firebase dla Google Analytics. Gdy spełnisz te wymagania, ścieżki będą automatycznie uwzględniane w danych zdarzenia na karcie Logi, gdy wyświetlisz szczegóły problemu.

Pakiet SDK Analytics automatycznie rejestruje zdarzenie screen_view, dzięki czemu logi ścieżki pokazują listę ekranów wyświetlonych przed zdarzeniem ANR, niekrytycznym lub niefatalnym. Plik z logiem informacji o elementach nawigacyjnych screen_view zawiera parametr firebase_screen_class.

W logach menu nawigacyjnego znajdują się też: niestandardowych zdarzeń rejestrowanych ręcznie na , w tym dane parametrów zdarzenia. Te dane mogą pomóc w określeniu sekwencji działań użytkownika, które doprowadziły do awarii, niekrytycznego błędu lub błędu ANR.

Pamiętaj, że możesz kontrolować zbieranie i wykorzystywanie danych z usługi Google Analytics, który zawiera dane umieszczane w dziennikach menu nawigacyjnego.

Włącz raportowanie akceptacji

Domyślnie Crashlytics automatycznie zbiera raporty o awariach dla wszystkich użytkowników aplikacji. Aby zapewnić użytkownikom większą kontrolę nad danymi, które wysyłają, możesz włączyć w raportach, które trzeba włączyć, wyłączając automatyczne raportowanie i wysyłając dane tylko do Crashlytics, jeśli w kodzie:

  1. Wyłączanie natywnie automatycznego zbierania danych:

    Platformy Apple

    Dodaj nowy klucz do pliku Info.plist:

    • Klucz: FirebaseCrashlyticsCollectionEnabled
    • Wartość: false

    Android

    W bloku application pliku AndroidManifest.xml dodaj tag meta-data, aby wyłączyć automatyczne zbieranie danych:

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. Włącz zbieranie danych dla wybranych użytkowników, wywołując dane Crashlytics zastępowania kolekcji w czasie działania.

    Wartość zastąpienia będzie obowiązywać po każdym uruchomieniu aplikacji, więc Crashlytics mogą automatycznie zbierać raporty. Aby zrezygnować z automatycznego zgłaszania awarii, przekazać false jako wartość zastąpienia. Gdy ustawisz wartość false, nowa wartość zacznie obowiązywać dopiero po ponownym uruchomieniu aplikacji.

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

Zarządzanie danymi z analizy awarii

Statystyki awarii pomagają rozwiązywać problemy, porównując Twój zanonimizowany stos umożliwia śledzenie logów innych aplikacji Firebase i informację, czy problem jest jako część większego trendu. W przypadku wielu problemów statystyki awarii udostępniają nawet zasoby, które pomogą Ci w debugowaniu awarii.

Statystyki awarii wykorzystują zbiorcze dane o awariach, aby identyfikować typowe trendy dotyczące stabilności. Jeśli nie chcesz udostępniać danych o aplikacji, możesz zrezygnować ze Statystyk awarii w menu Statystyki awarii u góry listy problemów Crashlytics w konsoli Firebase.