Dostosowywanie raportów o awariach w Flutterze

Wybierz platformę: iOS+ Android Flutter Unity


Możesz kliknąć problem i uzyskać szczegółowy raport o zdarzeniu w panelu DevOps i zaangażowanie > Crashlytics w Firebase konsoli. Możesz dostosować te raporty, aby lepiej zrozumieć, co dzieje się w Twojej aplikacji, oraz okoliczności zdarzeń zgłaszanych do Crashlytics.

Zgłaszanie wyjątków

Zgłaszanie nieobsłużonych wyjątków

Możesz automatycznie przechwytywać wszystkie błędy „krytyczne” zgłaszane w ramach platformy Flutter, zastępując FlutterError.onError wartością FirebaseCrashlytics.instance.recordFlutterFatalError. Jeśli chcesz też przechwytywać wyjątki „niekrytyczne”, 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 Fluttera:

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

Aby przechwytywać 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 przechwytywać błędy występujące poza kontekstem Fluttera, zainstaluj moduł nasłuchiwania 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 obsłużonych wyjątków

Oprócz automatycznego zgłaszania awarii aplikacji Crashlytics umożliwia rejestrowanie wyjątków niekrytycznych i wysyłanie ich przy następnym zgłoszeniu poważnego błędu lub po ponownym uruchomieniu aplikacji.

Aby rejestrować wyjątki niekrytyczne w blokach catch aplikacji, użyj metody recordError. 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ż rejestrować dodatkowe informacje 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ą wyświetlane jako problemy niekrytyczne w panelu DevOps i zaangażowanie > Crashlytics dashboard w konsoli Firebase. Podsumowanie problemu zawiera wszystkie informacje o stanie, które zwykle otrzymujesz w przypadku awarii, a także podział według wersji i urządzenia.

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

Dodawanie kluczy niestandardowych

Klucze niestandardowe pomagają uzyskać informacje o konkretnym stanie aplikacji, który doprowadził do awarii. Możesz powiązać dowolne pary klucz-wartość z raportami o awariach, a następnie użyć kluczy niestandardowych do wyszukiwania i filtrowania raportów o awariach w DevOps i zaangażowanie > Crashlytics panelu Firebase konsoli.

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

  • Gdy przeglądasz konkretny problem w panelu, możesz wyświetlić powiązane klucze niestandardowe dla każdego zdarzenia (podzakładka Klucze) i 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 dziennika

Aby uzyskać więcej kontekstu dotyczącego zdarzeń prowadzących do awarii, możesz dodać niestandardowe Crashlytics dzienniki do aplikacji. Crashlytics powiąże dzienniki z danymi o awarii i wyświetli je na karcie Dzienniki po wyświetleniu szczegółów problemu (wszystkie problemy znajdziesz w panelu DevOps i zaangażowanie > Crashlytics w konsoli Firebase).

Aby pomóc w identyfikowaniu problemów, użyj metody log. Przykład:

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

Ustawianie identyfikatorów użytkowników

Aby zdiagnozować problem, często przydaje się informacja o tym, który użytkownik doświadczył danej awarii. Crashlytics zawiera sposób na 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 zaszyfrowanej wartości:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

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

Pobieranie dzienników działań użytkownika

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

Dzienniki działań użytkownika 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 te wymagania zostaną spełnione, dzienniki działań użytkownika będą automatycznie dołączane do danych zdarzenia na karcie Dzienniki po wyświetleniu szczegółów problemu (wszystkie problemy znajdziesz w panelu DevOps i zaangażowanie > Crashlytics w konsoli Firebase).

Pakiet Analytics SDK automatycznie rejestruje zdarzenie screen_view co umożliwia wyświetlanie w dziennikach działań użytkownika listy ekranów wyświetlonych przed awarią, błędem niekrytycznym lub zdarzeniem ANR. Dziennik działań użytkownika screen_view zawiera parametr firebase_screen_class.

Dzienniki działań użytkownika są też wypełniane wszystkimi 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 zdarzenia ANR.

Pamiętaj, że możesz kontrolować zbieranie i wykorzystywanie danych Google Analytics, w tym danych, które wypełniają dzienniki działań użytkownika.

Włączanie raportowania, na które użytkownicy muszą wyrazić zgodę

Domyślnie Crashlytics automatycznie zbiera raporty o awariach wszystkich użytkowników Twojej aplikacji. Aby zapewnić użytkownikom większą kontrolę nad wysyłanymi danymi, możesz włączyć raportowanie, na które użytkownicy muszą wyrazić zgodę, wyłączając automatyczne raportowanie i wysyłając dane do Crashlytics tylko wtedy, gdy zdecydujesz się na to w kodzie.

  1. Wyłącz automatyczne zbieranie danych natywnie:

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

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

    Jeśli użytkownik później zrezygnuje ze zbierania danych, możesz przekazać wartość false jako wartość zastąpienia. Zostanie ona zastosowana przy następnym uruchomieniu aplikacji przez użytkownika i będzie zachowywana we wszystkich kolejnych uruchomieniach.

Zarządzanie danymi statystyk awarii

Statystyki awarii pomagają rozwiązywać problemy, porównując zanonimizowane zrzuty stosu z zrzutami z innych aplikacji Firebase i informując, czy problem jest częścią większego trendu. W przypadku wielu problemów statystyki awarii udostępniają też zasoby, które pomagają w debugowaniu awarii.

Statystyki awarii używają zagregowanych danych o awariach do identyfikowania typowych trendów 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 konsoli Firebase.

Dalsze kroki