Dostosowywanie raportów o awariach Firebase Crashlytics

W panelu Crashlytics możesz kliknąć problem i wyświetlić szczegółowy raport o zdarzeniach. Możesz dostosować te raporty, aby lepiej zrozumieć, co dzieje się w Twojej aplikacji i okoliczności dotyczące zdarzeń zgłoszonych do Crashlytics.

Zgłaszanie niewykrytych wyjątków

Możesz automatycznie wychwytywać wszystkie „krytyczne” błędy zgłaszane w ramach platformy Flutter, zastępując funkcję FlutterError.onError za pomocą funkcji FirebaseCrashlytics.instance.recordFlutterFatalError. Aby też wychwytywać wyjątki „niekrytyczne”, zastąp FlutterError.onError za pomocą parametru 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

Platforma Flutter nie przechwytuje błędów asynchronicznych:

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

Aby wychwycić 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 spoza Flutter

Aby wychwytywać błędy, które występują poza kontekstem Flutter, zainstaluj odbiornik błędów w bieżącej konfiguracji Isolate:

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

Raport dotyczący wyjątków

Crashlytics nie tylko automatycznie zgłasza awarie aplikacji, ale też umożliwia rejestrowanie niekrytycznych wyjątków i wysyłanie ich do Ciebie przy następnym zgłoszeniu zdarzenia krytycznego lub po ponownym uruchomieniu aplikacji.

Metoda recordError pozwala rejestrować niekrytyczne wyjątki w blokach typu catch dla aplikacji. 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ż zapisać dodatkowe informacje o błędzie, co jest możliwe przy użyciu 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 wyświetlają się jako problemy niekrytyczne w konsoli Firebase. Podsumowanie problemu zawiera wszystkie informacje o stanie, które zwykle pojawiają się w przypadku awarii, wraz z podziałem według wersji i urządzenia.

Crashlytics przetwarza wyjątki w dedykowanym wątku w tle, aby zminimalizować wpływ na wydajność aplikacji. Aby zmniejszyć ruch sieciowy użytkowników, Crashlytics w razie potrzeby będzie ograniczać liczbę raportów wysyłanych poza urządzenie.

Dodaj klucze niestandardowe

Klucze niestandardowe pomagają określić stan aplikacji, który doprowadził do awarii. Do raportów o awariach możesz powiązać wybrane pary klucz-wartość, a następnie za pomocą kluczy niestandardowych wyszukiwać i filtrować raporty o awariach w konsoli Firebase.

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

  • Gdy sprawdzasz konkretny problem w konsoli, możesz wyświetlić klucze niestandardowe powiązane z każdym zdarzeniem (podkarta Klucze), a nawet filtrować zdarzenia według kluczy niestandardowych (w 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);

Dodawanie niestandardowych komunikatów logu

Aby zapewnić sobie szerszy kontekst dla zdarzeń prowadzących do awarii, możesz dodać do aplikacji niestandardowe dzienniki Crashlytics. Crashlytics powiąże je z danymi awarii i wyświetli je w konsoli Firebase na karcie Logi Crashlytics.

Użyj narzędzia log, aby łatwiej wskazać problemy. Przykład:

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

Konfigurowanie identyfikatorów użytkowników

W celu zdiagnozowania problemu często warto wiedzieć, u których użytkowników wystąpiła dana awaria. Crashlytics umożliwia anonimowe identyfikowanie użytkowników w raportach o awariach.

Aby dodać identyfikatory użytkowników do raportów, przypisz każdemu użytkownikowi unikalny identyfikator w postaci numeru identyfikacyjnego, tokena lub zahaszowanej wartości:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

Jeśli w przyszłości musisz usunąć ustawiony identyfikator użytkownika, zresetuj jego wartość do pustego ciągu znaków. Wyczyszczenie identyfikatora użytkownika nie powoduje usunięcia dotychczasowych rekordów Crashlytics. Jeśli chcesz usunąć rekordy powiązane z identyfikatorem User-ID, skontaktuj się z zespołem pomocy Firebase.

Pobieranie dzienników menu nawigacyjnego

Logi menu nawigacyjnego pozwalają lepiej zrozumieć interakcje użytkownika z aplikacją, które doprowadziły do awarii, błędu niekrytycznego lub błędu ANR. Logi mogą być przydatne podczas próby odtworzenia i debugowania problemu.

Logi menu nawigacyjnego są obsługiwane przez Google Analytics, więc aby je pobierać, musisz włączyć Google Analytics dla swojego projektu Firebase i dodać do aplikacji pakiet SDK Firebase dla Google Analytics. Po spełnieniu tych wymagań logi menu nawigacyjnego są automatycznie dołączane do danych zdarzenia na karcie Logi po wyświetleniu szczegółów problemu.

Pakiet SDK Analytics automatycznie rejestruje zdarzenie screen_view, dzięki któremu w dziennikach menu nawigacyjnego znajduje się lista ekranów wyświetlanych przed zdarzeniem awarii, niekrytycznym lub ANR. Log menu nawigacyjnego screen_view zawiera parametr firebase_screen_class.

Są one też wypełniane wszystkimi zdarzeniami niestandardowymi, które rejestrujesz ręcznie w ramach sesji użytkownika, w tym danymi parametrów zdarzenia. Dane te pomagają pokazywać serię działań użytkowników, które doprowadziły do awarii, błędu niekrytycznego lub błędu ANR.

Pamiętaj, że możesz kontrolować zbieranie i wykorzystywanie danych Google Analytics, w tym danych wypełniających logi menu nawigacyjnego.

Włącz raportowanie dotyczące wyrażania zgody

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

  1. Wyłącz automatyczne zbieranie danych natywnie:

    Platformy Apple

    Dodaj nowy klucz do pliku Info.plist:

    • Klucz: FirebaseCrashlyticsCollectionEnabled
    • Wartość: false

    Urządzenie z Androidem

    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 zastąpienie zbierania danych Crashlytics w czasie działania.

    Wartość zastąpienia jest utrzymywana po uruchomieniu aplikacji, więc Crashlytics może automatycznie zbierać raporty. Aby zrezygnować z automatycznego raportowania o awariach, przekaż false jako wartość zastąpienia. Gdy ustawisz wartość false, nowa wartość będzie stosowana dopiero przy następnym uruchomieniu aplikacji.

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

Zarządzanie danymi narzędzia Crash Insights

Statystyki awarii pomagają rozwiązywać problemy, porównując zanonimizowane zrzuty stosu z śladami z innych aplikacji Firebase i informując, czy Twój problem nie należy do większego trendu. W przypadku wielu problemów narzędzie Crash Insights udostępnia nawet zasoby, które pomagają debugować awarię.

Crash Insights używa zbiorczych danych o awariach, aby identyfikować typowe trendy związane ze stabilnością. Jeśli nie chcesz udostępniać danych o aplikacji, możesz zrezygnować z Statystyk awarii, korzystając z menu Statystyki awarii u góry listy problemów Crashlytics w konsoli Firebase.