Dostosowywanie raportów o awariach w Flutterze

Wybierz platformę: iOS+ Android Flutter Unity


Możesz kliknąć problem i wyświetlić szczegółowy raport Zdarzenia w Firebase konsoli na panelu DevOps i zaangażowanie > Crashlytics. Możesz dostosowywać te raporty, aby lepiej zrozumieć, co dzieje się w aplikacji i jakie są okoliczności zdarzeń zgłaszanych do Crashlytics.

Zgłaszanie wyjątków

Zgłaszanie niewykrytych wyjątków

Możesz automatycznie przechwytywać wszystkie błędy krytyczne, które występują w środowisku Flutter, zastępując FlutterError.onError przez FirebaseCrashlytics.instance.recordFlutterFatalError. Możesz też zastąpić FlutterError.onError metodą FirebaseCrashlytics.instance.recordFlutterError, aby wychwytywać również wyjątki niekrytyczne:

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ą wychwytywane przez platformę Flutter:

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

Aby wychwytywać 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 Flutterem

Aby wychwytywać błędy, które występują poza kontekstem Flutter, zainstaluj detektor 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łaszaj wykryte wyjątki

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

Użyj metody recordError, aby rejestrować niekrytyczne wyjątki w blokach catch 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ż zarejestrować dodatkowe informacje o błędzie, korzystając z 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ą wyświetlane jako błędy niekrytyczne w panelu DevOps i zaangażowanie > Crashlytics w konsoli Firebase. Podsumowanie problemu zawiera wszystkie informacje o stanie, które zwykle otrzymujesz 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 w sieci użytkowników, Crashlytics w razie potrzeby ograniczy liczbę raportów wysyłanych z urządzenia.

Dodawanie kluczy niestandardowych

Klucze niestandardowe pomagają poznać konkretny stan aplikacji, który doprowadził do awarii. Z raportami o awariach możesz powiązać dowolne pary klucz-wartość, a następnie używać kluczy niestandardowych do wyszukiwania i filtrowania raportów o awariach w panelu DevOps i zaangażowanie > Crashlytics w konsoli Firebase.

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

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

Aby ustawić pary 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 uzyskać więcej informacji o zdarzeniach, które doprowadziły do awarii, możesz dodać do aplikacji niestandardowe dzienniki Crashlytics. Crashlytics powiąże dzienniki z danymi o awariach i wyświetli je na karcie Dzienniki, gdy będziesz przeglądać szczegóły problemu (wszystkie problemy możesz zobaczyć w Firebase Console na panelu DevOps i zaangażowanie > Crashlytics).

Użyj log, aby precyzyjnie określić problemy. Przykład:

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

Ustawianie identyfikatorów użytkowników

Aby zdiagnozować problem, często warto wiedzieć, u których użytkowników wystąpiła dana awaria. Crashlytics zawiera sposób anonimowej identyfikacji 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 wartości skrótu:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

Jeśli po ustawieniu identyfikatora użytkownika musisz go usunąć, zresetuj jego wartość na pusty ciąg znaków. Wyczyszczenie identyfikatora użytkownika nie powoduje usunięcia dotychczasowych rekordów Crashlytics. Jeśli chcesz usunąć rekordy powiązane z identyfikatorem użytkownika, skontaktuj się z zespołem pomocy Firebase.

Pobieranie logów działań użytkownika

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

Logi działań użytkownika są obsługiwane przez Google Analytics, więc aby je otrzymywać, musisz włączyć Google Analytics w projekcie w Firebase i dodać do aplikacji pakiet SDK Firebase dla Google Analytics. Gdy spełnisz te wymagania, logi działań użytkownika będą automatycznie dołączane do danych zdarzenia na karcie Logi, gdy wyświetlisz szczegóły problemu (wszystkie problemy możesz zobaczyć w konsoli Firebase na panelu DevOps i zaangażowanie > Crashlytics).

Pakiet SDK Analytics automatycznie rejestruje zdarzenie screen_view, dzięki czemu logi działań użytkownika mogą wyświetlać listę ekranów wyświetlonych przed awarią, błędem niekrytycznym lub zdarzeniem ANR. Log działań użytkownika screen_view zawiera parametr firebase_screen_class.

Logi działań użytkownika są też wypełniane zdarzeniami niestandardowymi, które ręcznie rejestrujesz w sesji użytkownika, w tym danymi parametrów zdarzenia. Te dane mogą pokazywać serię działań użytkownika, 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, które wypełniają logi działań użytkownika.

Włączanie raportowania o wyrażeniu zgody

Domyślnie Crashlytics automatycznie zbiera raporty o awariach od wszystkich użytkowników aplikacji. Aby zapewnić użytkownikom większą kontrolę nad wysyłanymi danymi, możesz włączyć raportowanie na podstawie akceptacji, wyłączając raportowanie automatyczne i wysyłając dane do Crashlytics tylko wtedy, gdy wybierzesz tę opcję w kodzie.

  1. Wyłączanie automatycznego zbierania danych w sposób natywny:

    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 zastąpienie zbierania danych Crashlytics w czasie działania. Wartość zastąpienia jest zachowywana we wszystkich kolejnych uruchomieniach aplikacji, dzięki czemu Crashlytics może automatycznie zbierać raporty dotyczące tego użytkownika.

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

    Jeśli użytkownik później zrezygnuje ze zbierania danych, możesz przekazać wartość zastępującą false, która zostanie zastosowana przy następnym uruchomieniu aplikacji przez użytkownika i będzie obowiązywać przy wszystkich kolejnych uruchomieniach.

Zarządzanie danymi Crash Insights

Crash Insights pomaga rozwiązywać problemy, porównując zanonimizowane zrzuty stosu ze zrzutami z innych aplikacji w Firebase i informując, czy problem jest częścią większego trendu. W przypadku wielu problemów Crash Insights udostępnia nawet zasoby, które pomagają w debugowaniu awarii.

Statystyki awarii wykorzystują zbiorcze dane o awariach do identyfikowania typowych trendów dotyczących stabilności. Jeśli nie chcesz udostępniać danych aplikacji, możesz zrezygnować ze Statystyk awarii w menu Statystyki awarii u góry listy problemów w panelu DevOps i zaangażowanie > Crashlytics w konsoli Firebase.

Dalsze kroki