Dostosowywanie raportów o awariach na Androidzie

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.

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.

  • Możesz wyszukiwać 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), a nawet filtrować zdarzenia według kluczy niestandardowych (menu Filtr u góry strony).

Aby ustawić pary klucz-wartość, użyj metody instancji setCustomKey. Pamiętaj, że metoda setCustomKey jest przeciążona dla parametru value, aby akceptować dowolny argument podstawowy lub String. Oto przykłady:

Kotlin

val crashlytics = Firebase.crashlytics
crashlytics.setCustomKeys {
    key("my_string_key", "foo") // String value
    key("my_bool_key", true) // boolean value
    key("my_double_key", 1.0) // double value
    key("my_float_key", 1.0f) // float value
    key("my_int_key", 1) // int value
}

Java

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.setCustomKey("my_string_key", "foo" /* string value */);

crashlytics.setCustomKey("my_bool_key", true /* boolean value */);

crashlytics.setCustomKey("my_double_key", 1.0 /* double value */);

crashlytics.setCustomKey("my_float_key", 1.0f /* float value */);

crashlytics.setCustomKey("my_int_key", 1 /* int value */);

Możesz też zmienić wartość istniejącego klucza, wywołując go i ustawiając inną wartość. Przykład:

Kotlin

val crashlytics = Firebase.crashlytics
crashlytics.setCustomKeys {
    key("current_level", 3)
    key("last_UI_action", "logged_in")
}

Java

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.setCustomKey("current_level", 3);
crashlytics.setCustomKey("last_UI_action", "logged_in");

Dodaj pary klucz-wartość zbiorczo, przekazując instancję CustomKeysAndValues do metody instancji setCustomKeys:

Kotlin

W przypadku Kotlina istniejąca funkcja jest prostsza niż użycie kreatora CustomKeysAndValues.

crashlytics.setCustomKeys {
  key("str_key", "hello")
  key("bool_key", true)
  key("int_key", 1)
  key("long_key", 1L)
  key("float_key", 1.0f)
  key("double_key", 1.0)
}

Java

CustomKeysAndValues keysAndValues = new CustomKeysAndValues.Builder()
.putString("string key", "string value")
.putString("string key 2", "string  value 2")
.putBoolean("boolean key", True)
.putBoolean("boolean key 2", False)
.putFloat("float key", 1.01)
.putFloat("float key 2", 2.02)
.build();

FirebaseCrashlytics.getInstance().setCustomKeys(keysAndValues);

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:

Kotlin

Firebase.crashlytics.log("message")

Java

FirebaseCrashlytics.getInstance().log("message");

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:

Kotlin

Firebase.crashlytics.setUserId("user123456789")

Java

FirebaseCrashlytics.getInstance().setUserId("user123456789");

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.

(Tylko Android NDK) Dodawanie metadanych do raportów o awariach NDK

Możesz opcjonalnie dołączyć nagłówek crashlytics.h w kodzie C++, aby dodać metadane do raportów o awariach NDK, takie jak klucze niestandardowe, dzienniki niestandardowe i identyfikatory użytkowników. Wszystkie te opcje są opisane powyżej na tej stronie.

crashlytics.h jest dostępny jako biblioteka C++ zawierająca tylko nagłówki w repozytorium GitHub pakietu SDK Firebase na Androida.

Instrukcje korzystania z interfejsów API NDK C++ znajdziesz w komentarzach w pliku nagłówka.

Uwzględnianie raportów GWP-ASan w celu debugowania problemów z uszkodzeniem pamięci

Crashlytics może pomóc w debugowaniu awarii spowodowanych błędami pamięci natywnej, zbierając raporty GWP-ASan. Te błędy związane z pamięcią mogą być powiązane z uszkodzeniem pamięci w aplikacji, co jest główną przyczyną luk w zabezpieczeniach aplikacji.

W panelu DevOps i zaangażowanie > Crashlytics w konsoli Firebase możesz wykonać te czynności:

  • Te dane możesz wyświetlić na nowej karcie „Zrzuty stosu pamięci”, gdy klikniesz szczegóły problemu.

  • Możesz użyć nowego sygnału i filtra „Raport GWP-ASan”, aby szybko wyświetlić wszystkie problemy z tymi danymi.

Raporty o błędach pamięci zgłaszanych przez GWP-ASan możesz otrzymywać, jeśli wyraźnie włączysz GWP-ASan w aplikacji i używasz pakietu SDK Crashlytics dla NDK w wersji 18.3.6 lub nowszej (Firebase BoM w wersji 31.3.0 lub nowszej). Konfigurację GWP-ASan możesz przetestować, korzystając z przykładowego kodu natywnego w dokumentacji Androida.

Zgłaszanie wyjątków niekrytycznych

Oprócz automatycznego raportowania awarii aplikacji Crashlytics umożliwia rejestrowanie niekrytycznych wyjątków i wysyła je do Ciebie przy następnym uruchomieniu aplikacji.

Użyj metody recordException, aby rejestrować niekrytyczne wyjątki w blokach catch aplikacji. Przykład:

Kotlin

try {
    methodThatThrows()
} catch (e: Exception) {
    Firebase.crashlytics.recordException(e)
    // handle your exception here
}

Java

try {
    methodThatThrows();
} catch (Exception e) {
    FirebaseCrashlytics.getInstance().recordException(e);
    // handle your exception here
}

Możesz też dołączyć klucze niestandardowe do konkretnego niekrytycznego wyjątku. Przykład:

Kotlin

try {
    methodThatThrows()
} catch (e: Exception) {
    Firebase.crashlytics.recordException(e) {
        key("string key", "string value")
        key("boolean key", true)
        key("float key", Float.MAX_VALUE)
    }
    // handle your exception here
}

Java

try {
    methodThatThrows();
} catch (Exception e) {
    CustomKeysAndValues keysAndValues = new CustomKeysAndValues.Builder()
            .putString("string key", "string value")
            .putBoolean("boolean key", true)
            .putFloat("float key", Float.MAX_VALUE)
            .build();
    FirebaseCrashlytics.getInstance().recordException(e, keysAndValues);
    // handle your exception here
}

Wszystkie zarejestrowane wyjątki są widoczne jako niekrytyczne problemy 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 Androida 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 grupuje zarejestrowane wyjątki i wysyła je przy następnym uruchomieniu aplikacji.

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 wszelkimi 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. 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.

    Kotlin

    Firebase.crashlytics.setCrashlyticsCollectionEnabled(true)

    Java

    FirebaseCrashlytics.getInstance().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