Jeśli Twoja aplikacja na Androida zawiera biblioteki natywne , możesz włączyć pełne śledzenie stosu i szczegółowe raporty o awariach dla kodu natywnego z Firebase Crashlytics, wprowadzając kilka drobnych aktualizacji konfiguracji kompilacji aplikacji.
W tym przewodniku opisano, jak skonfigurować raportowanie o awariach za pomocą pakietu Firebase Crashlytics SDK dla NDK.
Jeśli szukasz sposobu na rozpoczęcie korzystania z Crashlytics w swoich projektach Unity, zapoznaj się z przewodnikiem wprowadzającym do Unity .
Zanim zaczniesz
Jeśli jeszcze tego nie zrobiłeś, dodaj Firebase do swojego projektu na Androida. Jeśli nie masz aplikacji na Androida, możesz pobrać przykładową aplikację .
Zalecane : aby korzystać z funkcji, takich jak użytkownicy bez awarii, dzienniki nawigacyjne i alerty dotyczące szybkości, musisz włączyć Google Analytics w swoim projekcie Firebase.
Jeśli w istniejącym projekcie Firebase nie włączono Google Analytics, możesz włączyć Google Analytics na karcie Integracje w > Ustawienia projektu w konsoli Firebase.
Jeśli tworzysz nowy projekt Firebase, włącz Google Analytics podczas procesu tworzenia projektu.
Krok 1 : Dodaj pakiet Firebase Crashlytics SDK dla NDK do swojej aplikacji
Korzystając z Firebase Android BoM , zadeklaruj zależność dla biblioteki Crashlytics NDK Android w pliku Gradle modułu (na poziomie aplikacji) (zwykleapp/build.gradle
).Aby zapewnić optymalne działanie Crashlytics, zalecamy włączenie Google Analytics w projekcie Firebase i dodanie pakietu SDK Firebase dla Google Analytics do swojej aplikacji.
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:30.0.1') // Declare 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' }
Korzystając z Firebase Android BoM , Twoja aplikacja będzie zawsze używać zgodnych wersji bibliotek Firebase Android.
(Alternatywnie) Zadeklaruj zależności biblioteki Firebase bez użycia BoM
Jeśli zdecydujesz się nie korzystać z BoM Firebase, musisz określić każdą wersję biblioteki Firebase w jej wierszu zależności.
Pamiętaj, że jeśli korzystasz z wielu bibliotek Firebase w swojej aplikacji, zdecydowanie zalecamy używanie BoM do zarządzania wersjami bibliotek, co zapewnia zgodność wszystkich wersji.
dependencies { // Declare 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:18.2.10' implementation 'com.google.firebase:firebase-analytics:21.0.0' }
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:30.0.1') // Declare 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-ktx' }
Korzystając z Firebase Android BoM , Twoja aplikacja będzie zawsze używać zgodnych wersji bibliotek Firebase Android.
(Alternatywnie) Zadeklaruj zależności biblioteki Firebase bez użycia BoM
Jeśli zdecydujesz się nie korzystać z BoM Firebase, musisz określić każdą wersję biblioteki Firebase w jej wierszu zależności.
Pamiętaj, że jeśli korzystasz z wielu bibliotek Firebase w swojej aplikacji, zdecydowanie zalecamy używanie BoM do zarządzania wersjami bibliotek, co zapewnia zgodność wszystkich wersji.
dependencies { // Declare 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:18.2.10' implementation 'com.google.firebase:firebase-analytics-ktx:21.0.0' }
Krok 2 : dodaj wtyczkę Firebase Crashlytics do swojej aplikacji
W pliku
build.gradle
na poziomie projektu dodaj wtyczkę Crashlytics Gradle jako zależność buildscript.buildscript { repositories { // Check that you have Google's Maven repository (if not, add it). google() } dependencies { // ... // Check that you have the Google services Gradle plugin v4.3.2 or later // (if not, add it). classpath 'com.google.gms:google-services:4.3.10' // Add the Crashlytics Gradle plugin classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' } } allprojects { repositories { // Check that you have Google's Maven repository (if not, add it). google() } }
W pliku
build.gradle
na poziomie aplikacji zastosuj wtyczkę Crashlytics Gradle:apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' // Google services Gradle plugin // Apply the Crashlytics Gradle plugin apply plugin: 'com.google.firebase.crashlytics'
Krok 3 : Dodaj rozszerzenie firebaseCrashlytics
do swojej kompilacji
W pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle
) dodaj rozszerzenie firebaseCrashlytics
.
Java
// ... 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 } } } }
Kotlin+KTX
// ... 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 wygenerować czytelne ślady stosu z awarii NDK, Crashlytics musi znać symbole w twoich natywnych plikach binarnych. Wtyczka Crashlytics Gradle zawiera zadanie uploadCrashlyticsSymbolFile BUILD_VARIANT
aby zautomatyzować ten proces.
Aby uzyskać dostęp do zadania automatycznego przesyłania symboli, upewnij się, że
nativeSymbolUploadEnabled
jest ustawione natrue
w pliku Gradle modułu (na poziomie aplikacji).Aby nazwy metod pojawiały się w śladach stosu, należy jawnie wywołać zadanie
uploadCrashlyticsSymbolFile BUILD_VARIANT
po każdej kompilacji biblioteki NDK. Na przykład:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
Zarówno Crashlytics SDK for NDK, jak i Crashlytics Gradle zależą od obecności identyfikatora kompilacji GNU w natywnych obiektach współdzielonych.
Możesz zweryfikować obecność tego identyfikatora, uruchamiając
readelf -n
na każdym pliku binarnym. Jeśli nie ma identyfikatora kompilacji, dodaj-Wl,--build-id
do flag systemu kompilacji, aby rozwiązać problem.
Krok 5 : Wymuś awarię testową, aby zakończyć konfigurację
Aby zakończyć konfigurowanie Crashlytics i wyświetlić początkowe dane w panelu Crashlytics konsoli Firebase, musisz wymusić awarię testową.
Dodaj do aplikacji kod, którego możesz użyć do wymuszenia awarii testowej.
Możesz użyć następującego kodu w
MainActivity
aplikacji, aby dodać do aplikacji przycisk, który po naciśnięciu powoduje awarię. Przycisk jest oznaczony jako „Test Crash”.Java
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));
Kotlin+KTX
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))
Zbuduj i uruchom swoją aplikację.
Wymuś awarię testową, aby wysłać pierwszy raport o awarii aplikacji:
Otwórz swoją aplikację z urządzenia testowego lub emulatora.
W swojej aplikacji naciśnij przycisk „Przetestuj awarię”, który został dodany za pomocą powyższego kodu.
Po awarii aplikacji uruchom ją ponownie, aby aplikacja mogła wysłać raport o awarii do Firebase.
Przejdź do panelu Crashlytics w konsoli Firebase, aby zobaczyć awarię testu.
Jeśli po odświeżeniu konsoli nadal nie widzisz awarii testowej po pięciu minutach, włącz rejestrowanie debugowania , aby sprawdzić, czy aplikacja wysyła raporty o awariach.
I to wszystko! Crashlytics monitoruje teraz Twoją aplikację pod kątem awarii. Możesz przeglądać i badać raporty o awariach oraz statystyki na pulpicie nawigacyjnym Crashlytics.
Alternatywne opcje przesyłania symboli
Główny przepływ pracy na tej stronie powyżej dotyczy standardowych kompilacji Gradle. Jednak niektóre aplikacje używają innej konfiguracji lub narzędzi (na przykład procesu kompilacji innego niż Gradle). W takich sytuacjach poniższe opcje mogą być pomocne w pomyślnym przesyłaniu symboli.
Opcja : Prześlij symbole modułów bibliotecznych i zależności zewnętrznych
Ta opcja może być pomocna w następujących sytuacjach:
- Jeśli używasz niestandardowego procesu budowania NDK w Gradle
- Jeśli Twoje biblioteki natywne są wbudowane w moduł biblioteki/funkcji lub dostarczane przez firmę zewnętrzną
- Jeśli zadanie automatycznego przesyłania symboli kończy się niepowodzeniem lub widzisz niesymbolizowane awarie na desce rozdzielczej
Standardowe zadanie przesyłania symboli Crashlytics zakłada, że tworzysz biblioteki natywne w ramach kompilacji Gradle modułu aplikacji przy użyciu standardowych narzędzi do kompilacji NDK, takich jak CMake.
Jednakże, jeśli używasz niestandardowego procesu budowania NDK w Gradle lub twoje natywne biblioteki są zbudowane w module biblioteki/funkcji lub dostarczone przez stronę trzecią, może być konieczne wyraźne określenie ścieżki do nieokrojonych bibliotek. Aby to osiągnąć, możesz dodać właściwość unstrippedNativeLibsDir
w rozszerzeniu firebaseCrashlytics
w pliku build.gradle
.
Upewnij się, że wykonałeś następujące początkowe zadania z głównego przepływu pracy wcześniej na tej stronie:
Aby zadanie automatycznego przesyłania symboli mogło znaleźć informacje o symbolu, dodaj następujące elementy do pliku
build.gradle
modułu (na poziomie aplikacji):// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Wtyczka Crashlytics będzie rekurencyjnie przeszukiwać określony katalog w poszukiwaniu bibliotek natywnych z rozszerzeniem
.so
. Crashlytics następnie wyodrębnia symbole debugowania ze wszystkich takich bibliotek i przesyła je na serwery Firebase.Oto, co możesz określić we właściwości
unstrippedNativeLibsDir
:Dowolny argument dozwolony dla
org.gradle.api.Project#files(Object...)
, w tym:java.lang.String
,java.io.File
luborg.gradle.api.file.FileCollection
Wiele katalogów dla jednego smaku kompilacji poprzez dostarczenie listy lub instancji
FileCollection
Na koniec wymuś awarię testową, aby zakończyć konfigurowanie Crashlytics i wyświetlić początkowe dane w panelu Crashlytics konsoli Firebase.
Opcja : Prześlij symbole dla kompilacji innych niż Gradle lub niedostępnych nieokrojonych bibliotek natywnych
Ta opcja może być pomocna w następujących sytuacjach:
Jeśli używasz procesu kompilacji innego niż Gradle
Jeśli nieokrojone biblioteki natywne są dostarczane w taki sposób, że nie są dostępne podczas kompilacji Gradle
Ta opcja wymaga uruchomienia polecenia interfejsu wiersza polecenia Firebase podczas tworzenia kompilacji wydania lub dowolnej kompilacji, dla której chcesz wyświetlić symboliczne ślady stosu w konsoli Firebase.
Upewnij się, że wykonałeś następujące początkowe zadania z głównego przepływu pracy wcześniej na tej stronie:
Pamiętaj, że w przypadku tej opcji nie musisz dodawać rozszerzenia
firebaseCrashlytics
ani konfigurować automatycznego przesyłania symboli, ponieważ zamiast tego będziesz używać interfejsu wiersza polecenia Firebase (następne kroki poniżej) do generowania i przesyłania plików symboli.Skonfiguruj swoje środowisko i projekt do przesyłania symboli:
Postępuj zgodnie z instrukcjami, aby zainstalować Firebase CLI .
Jeśli już zainstalowałeś CLI, zaktualizuj do najnowszej wersji .
(tylko w przypadku aplikacji korzystających z interfejsu API systemu Android na poziomie 30+) Zaktualizuj szablon
AndroidManifest.xml
swojej aplikacji, aby wyłączyć tagowanie wskaźnika:Zaznacz pole Ustawienia odtwarzacza Android > Ustawienia publikowania > Kompilacja > Niestandardowy główny manifest .
Otwórz szablon manifestu znajdujący się w
Assets/Plugins/Android/AndroidManifest.xml
.Dodaj następujący atrybut do tagu aplikacji:
<application android:allowNativeHeapPointerTagging="false" ... />
Zbuduj swój projekt.
Prześlij informacje o symbolach.
Po zakończeniu kompilacji wygeneruj plik symboli zgodny z Crashlytics i prześlij go na serwery Firebase, uruchamiając następujące polecenie Firebase CLI:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : Twój identyfikator aplikacji Firebase na Androida (nie nazwa pakietu)
Przykładowy identyfikator aplikacji Firebase na Androida:1:567383003300:android:17104a2ced0c9b9b
Oto dwa sposoby na znalezienie identyfikatora aplikacji Firebase:
W pliku
google-services.json
identyfikator aplikacji to wartośćmobilesdk_app_id
; lubW konsoli Firebase przejdź do ustawień projektu . Przewiń w dół do karty Twoje aplikacje , a następnie kliknij żądaną aplikację Firebase, aby znaleźć jej identyfikator aplikacji.
PATH/TO/SYMBOLS : Ścieżka do pliku symboli wygenerowanego przez CLI
Eksportowane do projektu Android Studio — PATH/TO/SYMBOLS może być dowolnym katalogiem. Firebase CLI będzie rekursywnie przeszukiwać określony katalog w poszukiwaniu bibliotek natywnych z rozszerzeniem
.so
.Zbuduj pakiet APK bezpośrednio z poziomu Unity — PATH/TO/SYMBOLS to ścieżka do spakowanego pliku symboli wygenerowanego w katalogu głównym projektu po zakończeniu kompilacji (na przykład:
myproject/myapp-1.0-v100.symbols.zip
).
Wyświetl zaawansowane opcje korzystania z polecenia Firebase CLI do generowania i przesyłania plików symboli
Flaga Opis --generator=csym
Używa starszego generatora plików symboli cSYM zamiast domyślnego generatora Breakpad
Nie zaleca się stosowania. Zalecamy użycie domyślnego generatora plików symboli Breakpad.
--generator=breakpad
Używa generatora plików symboli Breakpad
Zauważ, że domyślnym generatorem plików symboli jest Breakpad. Użyj tej flagi tylko wtedy, gdy dodałeś
symbolGenerator { csym() }
w konfiguracji kompilacji i chcesz go zastąpić, aby zamiast tego używać Breakpad.--dry-run
Generuje pliki symboli, ale ich nie przesyła
Ta flaga jest przydatna, jeśli chcesz sprawdzić zawartość wysyłanych plików.
--debug
Zapewnia dodatkowe informacje dotyczące debugowania Na koniec wymuś awarię testową, aby zakończyć konfigurowanie Crashlytics i wyświetlić początkowe dane w panelu Crashlytics konsoli Firebase.
Po skompilowaniu aplikacji w ramach wymuszania awarii uruchom polecenie
crashlytics:symbols:upload
, aby przesłać plik symboli.
Rozwiązywanie problemów
Jeśli widzisz różne ślady stosu w konsoli Firebase i w dzienniku, zapoznaj się z przewodnikiem rozwiązywania problemów .
Następne kroki
Dostosuj ustawienia swojego raportu o awariach, dodając raporty, dzienniki, klucze i śledzenie błędów niekrytycznych.
Zintegruj się z Google Play , aby móc filtrować raporty o awariach aplikacji na Androida według ścieżki Google Play bezpośrednio w panelu Crashlytics. Dzięki temu możesz lepiej skoncentrować swój pulpit nawigacyjny na konkretnych kompilacjach.