Jeśli Twoja aplikacja na Androida zawiera biblioteki natywne, możesz włączyć pełne zrzuty stosu i szczegółowe raporty o awariach dla kodu natywnego z poziomu Firebase Crashlytics, wprowadzając kilka drobnych zmian w konfiguracji kompilacji aplikacji.
Z tego przewodnika dowiesz się, jak skonfigurować zgłaszanie awarii za pomocą pakietu Firebase Crashlytics SDK dla NDK.
Jeśli szukasz informacji o tym, jak zacząć korzystać z Crashlytics w projektach w Unity, zapoznaj się z przewodnikiem dla początkujących na temat Unity.
Zanim zaczniesz
Jeśli jeszcze tego nie zrobiono, dodaj Firebase do projektu Androida. Jeśli nie masz aplikacji na Androida, możesz pobrać próbną aplikację.
Zalecane: aby automatycznie otrzymywać logi ścieżki, które pomogą Ci zrozumieć działania użytkowników prowadzące do awarii, niekrytycznych błędów lub zdarzeń ANR, musisz włączyć Google Analytics w projekcie Firebase.
Jeśli w dotychczasowym projekcie Firebase nie masz włączonej usługi Google Analytics, możesz ją włączyć na karcie Integracje w sekcji
w konsoli > Ustawienia projektuFirebase.Google Analytics Jeśli tworzysz nowy projekt Firebase, włącz Google Analytics w trakcie procesu tworzenia projektu.
Upewnij się, że aplikacja ma te minimalne wymagane wersje:
- Gradle 8.0
- Wtyczka Androida do obsługi Gradle 8.1.0
- Wtyczka Gradle usług Google 4.4.1
Krok 1. Dodaj do aplikacji pakiet SDK Crashlytics dla NDK
W pliku Gradle modułu (na poziomie aplikacji) (zwykle<project>/<app-module>/build.gradle.kts
lub
<project>/<app-module>/build.gradle
) dodaj zależność z biblioteką NDK Crashlytics na Androida. Zalecamy używanie Firebase Android BoM do kontrolowania wersji biblioteki.
Aby uzyskać optymalne wyniki w przypadku Crashlytics, zalecamy włączenie Google Analytics w projekcie Firebase i dodanie do aplikacji pakietu SDK Firebase dla Google Analytics.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:33.9.0")) // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk") implementation("com.google.firebase:firebase-analytics") }
Gdy korzystasz z Firebase Android BoM, aplikacja zawsze używa zgodnych wersji bibliotek Firebase na Androida.
(Alternatywnie) Dodaj zależności biblioteki Firebase bez korzystania z BoM
Jeśli zdecydujesz się nie używać Firebase BoM, musisz podać każdą wersję biblioteki Firebase w linii zależności.
Jeśli w aplikacji używasz kilku bibliotek Firebase, zdecydowanie zalecamy korzystanie z BoM do zarządzania wersjami bibliotek. Dzięki temu wszystkie wersje będą ze sobą zgodne.
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk:19.4.0") implementation("com.google.firebase:firebase-analytics:22.2.0") }
Krok 2. Dodaj do aplikacji wtyczkę Crashlytics Gradle
W pliku Gradle na poziomie katalogu głównego (na poziomie projektu) (
<project>/build.gradle.kts
lub<project>/build.gradle
) dodaj wtyczkę Gradle Crashlytics do blokuplugins
:plugins { // Make sure that you have the AGP plugin 8.1+ dependency id("com.android.application") version "8.1.4" apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id("com.google.gms.google-services") version "4.4.2" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.3" apply false }
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id 'com.android.application' version '8.1.4' apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id 'com.google.gms.google-services' version '4.4.2' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.3' apply false }
W pliku Gradle modułu (na poziomie aplikacji) (zwykle
<project>/<app-module>/build.gradle.kts
lub<project>/<app-module>/build.gradle
) dodaj wtyczkę Gradle Crashlytics:plugins { id("com.android.application") // ... // Make sure that you have the Google services Gradle plugin id("com.google.gms.google-services") // Add the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") }
plugins { id 'com.android.application' // ... // Make sure that you have the Google services Gradle plugin id 'com.google.gms.google-services' // Add the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' }
Krok 3. Dodaj do kompilacji rozszerzenie Crashlytics
W pliku Gradle modułu (na poziomie aplikacji) (zwykle <project>/<app-module>/build.gradle.kts
lub <project>/<app-module>/build.gradle
) skonfiguruj rozszerzenie Crashlytics.
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { getByName("release") { // Add this extension configure<CrashlyticsExtension> { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled = true } } } }
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true } } } }
Krok 4. Skonfiguruj automatyczne przesyłanie symboli natywnych
Aby generować czytelne ścieżki stosu z awaryjnych NDK, Crashlytics musi znać symbole w natywnym binarnym. Wtyczka Gradle Crashlytics zawiera zadanie uploadCrashlyticsSymbolFileBUILD_VARIANT
, które automatyzuje ten proces.
Aby mieć dostęp do zadania automatycznego przesyłania symboli, w pliku Gradle na poziomie modułu (aplikacji) ustaw wartość
nativeSymbolUploadEnabled
natrue
.Aby nazwy metod były widoczne w śladach stosu, musisz wyraźnie wywołać zadanie
uploadCrashlyticsSymbolFileBUILD_VARIANT
po każdym wygenerowaniu biblioteki NDK. Przykład:>./gradlew app:assemble
BUILD_VARIANT \ app:uploadCrashlyticsSymbolFileBUILD_VARIANT Zarówno pakiet SDK Crashlytics dla NDK, jak i wtyczka Gradle Crashlytics zależą od obecności identyfikatora kompilacji GNU w natywnościowych obiektach współdzielonych.
Obecność tego identyfikatora możesz zweryfikować, uruchamiając
w przypadku każdego binarnego pliku. Jeśli identyfikator kompilacji jest nieobecny, dodaj flagireadelf -n
do systemu kompilacji, aby rozwiązać problem.-Wl,--build-id
Krok 5. Wymuś awarię testową, aby zakończyć konfigurację
Aby dokończyć konfigurowanie Crashlytics i zobaczyć pierwsze dane na panelu Crashlytics w konsoli Firebase, musisz wymusić testowy błąd krytyczny.
Dodaj do aplikacji kod, który pozwoli wymusić awarię testową.
Aby dodać do aplikacji przycisk, który po naciśnięciu powoduje awarię aplikacji, możesz użyć tego kodu w sekcji
MainActivity
. Przycisk ma etykietę „Testowy błąd”.val crashButton = Button(this) crashButton.text = "Test Crash" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Kompilowanie i uruchamianie aplikacji.
Wymuś awarię testową, aby wysłać pierwszy raport o awarii aplikacji:
Otwórz aplikację na urządzeniu testowym lub w emulatorze.
W aplikacji kliknij przycisk „Test Crash”, który został dodany za pomocą kodu powyżej.
Gdy aplikacja ulegnie awarii, uruchom ją ponownie, aby mogła wysłać raport o awarii do Firebase.
Aby zobaczyć testowy błąd krytyczny, otwórz panel Crashlytics konsoli Firebase.
Jeśli po 5 minutach od odświeżenia konsoli nadal nie widzisz testowego błędu, włącz debugowanie, aby sprawdzić, czy aplikacja wysyła raporty o błędach.
To wszystko. Crashlytics będzie teraz monitorować Twoją aplikację pod kątem awarii. Możesz wyświetlać raporty i statystyki dotyczące awarii oraz je analizować w panelu Crashlytics.
Dalsze kroki
(Zalecany) Aby pomóc w debugowaniu awarii spowodowanych błędami pamięci natywnej, zbierz raporty GWP-ASan. Te błędy związane z pamięcią mogą być związane z uszkodzeniem pamięci w aplikacji, co jest główną przyczyną luk w zabezpieczeniach aplikacji. Aby korzystać z tej funkcji debugowania, upewnij się, że w aplikacji GWP-ASan jest wyraźnie włączona i że używa ona najnowszej wersji pakietu Crashlytics SDK dla NDK (18.3.6 lub nowszej) albo Firebase BoM (31.3.0 lub nowszej).
Dostosuj konfigurację raportów o awariach, dodając raportowanie z opcją opt-in, logi, klucze i śledzenie błędów niekrytycznych.
Integracja z Google Play, dzięki której możesz filtrować raporty o awariach aplikacji na Androida według ścieżki Google Play bezpośrednio w panelu Crashlytics. Dzięki temu możesz lepiej dostosować panel do konkretnych wersji.
Rozwiązywanie problemów
Jeśli w konsoli Firebase i w logcat widzisz różne ścieżki stosu, zapoznaj się z przewodnikiem po rozwiązywaniu problemów.
Alternatywne opcje przesyłania symboli
Główny proces na tej stronie powyżej dotyczy standardowych kompilacji Gradle. Niektóre aplikacje korzystają jednak z innej konfiguracji lub narzędzi (np. z procesu kompilacji innego niż Gradle). W takich sytuacjach możesz skorzystać z tych opcji, aby przesłać symbole.
Opcja: przesyłaj symbole dla modułów biblioteki i zewnętrznych zależności
Ta opcja może być przydatna w tych sytuacjach:
- Jeśli używasz niestandardowego procesu kompilacji NDK w Gradle
- Jeśli natywne biblioteki są zbudowane w bibliotece lub module funkcji lub są dostarczane przez zewnętrznego dostawcę
- Jeśli automatyczne przesyłanie symboli nie działa lub na panelu widać niesymbolizowane awarie
Wyświetlanie instrukcji dotyczących tej opcji
Standardowe zadanie przesyłania symboli Crashlytics zakłada, że kompilujesz swoje natywne biblioteki w ramach kompilacji Gradle w module aplikacji za pomocą standardowych narzędzi kompilacji NDK, takich jak CMake.
Jeśli jednak używasz w Gradle spersonalizowanego procesu kompilacji NDK lub Twoje natywne biblioteki są kompilowane w module biblioteki/funkcji lub są dostarczane przez firmę zewnętrzną, konieczne może być jawne określenie ścieżki do niezmodyfikowanych bibliotek. Aby to zrobić, w pliku kompilacji Gradle dodaj właściwość unstrippedNativeLibsDir
w rozszerzeniu Crashlytics.
Upewnij się, że wykonałeś te wstępne czynności z głównego procesu pracy z tej strony:
Aby zadanie automatycznego przesyłania symboli mogło znaleźć informacje o symbolach, dodaj do pliku Gradle modułu (na poziomie aplikacji) (zazwyczaj
<project>/<app-module>/build.gradle.kts
lub<project>/<app-module>/build.gradle
) następujący ciąg:import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("
PATH/TO/UNSTRIPPED/DIRECTORY ") } } } }// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("
PATH/TO/UNSTRIPPED/DIRECTORY ") } } } }Wtyczka Crashlytics będzie rekurencyjnie wyszukiwać w określonym katalogu natywne biblioteki o rozszerzeniu
.so
. Crashlytics wyodrębnia symbole debugowania ze wszystkich takich bibliotek i przesyła je na serwery Firebase.W przypadku właściwości
unstrippedNativeLibsDir
możesz określić:Każdy argument dozwolony w przypadku funkcji
org.gradle.api.Project#files(Object...)
, w tym: ,java.lang.String
ijava.io.File
.org.gradle.api.file.FileCollection
wiele katalogów dla jednej wersji, podając listę lub wystąpienie
FileCollection
(od wersji 3.0.0 wtyczki Gradle) Gromadź wiele katalogów w poszczególnych produktach i wersjach kompilacji.Crashlytics
Przykład z wieloma katalogami
buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("
MY/NATIVE/LIBS ") } } productFlavors { flavorDimensions += "feature" create("basic") { dimension = "feature" // ... } create("featureX") { dimension = "feature" configure<CrashlyticsExtension> { unstrippedNativeLibsDir = file("MY/FEATURE_X/LIBS ") } } } }Zadanie
uploadCrashlyticsSymbolFilesBasicRelease
prześle tylko symbole z plikuMY/NATIVE/LIBS
, ale zadanieuploadCrashlyticsSymbolFilesFeatureXRelease
prześle symbole z obu plików:MY/NATIVE/LIBS
iMY/FEATURE_X/LIBS
.Na koniec wymuś testowy błąd, aby dokończyć konfigurowanie Crashlytics i zobaczyć początkowe dane na pulpicie Crashlytics w konsoli Firebase.
Opcja: prześlij symbole dla wersji nieobejmujących Gradle lub niedostępnych nieoczyszczonych bibliotek natywnych
Ta opcja może być przydatna w tych sytuacjach:
Jeśli używasz procesu kompilacji innego niż Gradle
Jeśli nieobcięte biblioteki natywne są udostępniane w taki sposób, że nie są dostępne podczas kompilacji Gradle.
Wyświetlanie instrukcji dotyczących tej opcji
Aby użyć tej opcji, musisz uruchomić w konsoli Firebase polecenie wiersza poleceń Firebase, gdy tworzysz wersję wydania lub dowolną wersję, dla której chcesz zobaczyć symboliczne ścieżki stosu.
Upewnij się, że wykonałeś te wstępne czynności z głównego procesu pracy z tej strony:
Dodano pakiet SDK Crashlytics dla NDK i wtyczkę CrashlyticsGradle.
Pamiętaj, że w przypadku tej opcji nie musisz dodawać rozszerzenia
firebaseCrashlytics
ani konfigurować automatycznego przesyłania symboli, ponieważ do generowania i przesyłania plików symboli użyjesz polecenia wiersza Firebase (patrz kolejne kroki poniżej).Skonfiguruj środowisko i projekt na potrzeby przesyłania symboli:
Postępuj zgodnie z instrukcjami, aby zainstalować interfejs wiersza poleceń Firebase.
Jeśli wiersz poleceń jest już zainstalowany, zaktualizuj go do najnowszej wersji.
(dotyczy tylko aplikacji korzystających z interfejsu API na poziomie 30 lub wyższym) Aby wyłączyć tagowanie wskaźnika, zaktualizuj szablon
AndroidManifest.xml
aplikacji:Zaznacz pole Ustawienia odtwarzacza Androida > Ustawienia publikacji > Kompilacja > Niestandardowy główny plik manifestu.
Otwórz szablon pliku manifestu, który znajduje się w folderze
Assets/Plugins/Android/AndroidManifest.xml
.Dodaj do tagu aplikacji ten atrybut:
<application android:allowNativeHeapPointerTagging="false" ... />
Utwórz projekt.
Prześlij informacje o symbolach.
Po zakończeniu kompilacji wygeneruj plik symboli zgodny z Crashlytics i prześlij go na serwery Firebase, wykonując to polecenie wiersza poleceń Firebase:
firebase crashlytics:symbols:upload --app=
FIREBASE_APP_ID PATH/TO/SYMBOLS FIREBASE_APP_ID: identyfikator aplikacji Firebase na Androida (nie nazwa pakietu)
Przykład identyfikatora aplikacji Firebase na Androida:1:567383003300:android:17104a2ced0c9b9b
Nie wiesz, jak znaleźć identyfikator aplikacji Firebase?
Identyfikator aplikacji Firebase możesz znaleźć na 2 sposoby:
W pliku
google-services.json
identyfikator aplikacji to wartośćmobilesdk_app_id
;W konsoli Firebase otwórz Ustawienia projektu. Przewiń w dół do karty Twoje aplikacje, a potem kliknij wybraną aplikację Firebase, aby znaleźć jej identyfikator.
PATH/TO/SYMBOLS: ścieżka do pliku symboli wygenerowanego przez interfejs wiersza poleceń.
wyeksportowany do projektu w Android Studio – PATH/TO/SYMBOLS może być dowolnym katalogiem. Narzędzie wiersza poleceń Firebase będzie rekurencyjnie przeszukiwać określony katalog w poszukiwaniu bibliotek natywnych z rozszerzeniem
.so
.Kompilacja pliku APK bezpośrednio w Unity – PATH/TO/SYMBOLS to ścieżka do skompresowanego pliku symboli wygenerowanego w katalogu głównym projektu po zakończeniu kompilacji (np.
).myproject/myapp-1.0-v100.symbols.zip
Wyświetlanie zaawansowanych opcji korzystania z polecenia wiersza poleceń Firebase do generowania i przesyłania plików symboli
Flaga Opis --generator=csym
Zamiast domyślnego generatora Breakpad używa starszego generatora plików symboli cSYM.
Nie zalecamy ich używania. Zalecamy użycie domyślnego generatora plików symboli Breakpad.
--generator=breakpad
Używa generatora plików symboli Breakpad.
Pamiętaj, że domyślnym narzędziem do generowania plików symboli jest Breakpad. Używaj tej flagi tylko wtedy, gdy do konfiguracji kompilacji dodasz parametr
i chcesz go zastąpić, aby zamiast niego używać Breakpada.symbolGenerator { csym() }
--dry-run
generuje pliki symboli, ale ich nie przesyła;
Ten znacznik jest przydatny, jeśli chcesz sprawdzić zawartość wysyłanych plików.
--debug
zawiera dodatkowe informacje na potrzeby debugowania; Na koniec wymuś testowy błąd, aby dokończyć konfigurowanie Crashlytics i zobaczyć początkowe dane na pulpicie Crashlytics w konsoli Firebase.
Po skompilowaniu aplikacji w ramach wymuszania awarii uruchom polecenie Firebase CLI
crashlytics:symbols:upload
, aby przesłać plik z symbolami.