Jeśli Twoja aplikacja na Androida zawiera biblioteki natywne , możesz włączyć śledzenie pełnego stosu i szczegółowe raporty o awariach dla swojego kodu natywnego z Firebase Crashlytics, wprowadzając kilka małych aktualizacji konfiguracji kompilacji aplikacji.
W tym przewodniku opisano, jak skonfigurować raportowanie o awariach za pomocą pakietu SDK Firebase Crashlytics dla NDK.
Jeśli szukasz informacji, jak rozpocząć pracę 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 uzyskać dostęp do takich funkcji, jak użytkownicy bez awarii, logi nawigacyjne i alerty dotyczące prędkości, musisz włączyć Google Analytics w swoim projekcie Firebase.
Jeśli Twój istniejący projekt Firebase nie ma włączonej usługi Google Analytics, możesz ją włączyć na karcie Integracje w swoim
Jeśli tworzysz nowy projekt Firebase, włącz Google Analytics podczas tworzenia projektu.
Krok 1 : Dodaj pakiet Crashlytics SDK dla NDK do swojej aplikacji
W pliku Gradle modułu (na poziomie aplikacji) (zwykle<project>/<app-module>/build.gradle.kts
lub <project>/<app-module>/build.gradle
) dodaj zależność dla Crashlytics NDK biblioteka dla Androida. Zalecamy używanie Firebase Android BoM do kontrolowania wersji bibliotek.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.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:32.6.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") }
Korzystając z Firebase Android BoM , Twoja aplikacja będzie zawsze korzystać z kompatybilnych wersji bibliotek Firebase Android.
(Alternatywa) Dodaj zależności biblioteki Firebase bez użycia BoM
Jeśli zdecydujesz się nie używać BoM Firebase, musisz określić każdą wersję biblioteki Firebase w jej wierszu zależności.
Pamiętaj, że jeśli używasz w swojej aplikacji wielu bibliotek Firebase, zdecydowanie zalecamy używanie BoM do zarządzania wersjami bibliotek, co gwarantuje, że wszystkie wersje będą kompatybilne.
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:18.6.0") implementation("com.google.firebase:firebase-analytics:21.5.0") }
Krok 2 : Dodaj wtyczkę Crashlytics Gradle do swojej aplikacji
W pliku Gradle na poziomie głównym (na poziomie projektu) (
<project>/build.gradle.kts
lub<project>/build.gradle
) dodaj wtyczkę Crashlytics Gradle do blokuplugins
:Kotlin
plugins { id("com.android.application") version "7.3.0" apply false // ... // Make sure that you have the Google services Gradle plugin dependency id("com.google.gms.google-services") version "4.4.0" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "2.9.9" apply false }
Groovy
plugins { id 'com.android.application' version '7.3.0' apply false // ... // Make sure that you have the Google services Gradle plugin dependency id 'com.google.gms.google-services' version '4.4.0' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '2.9.9' 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ę Crashlytics Gradle:Kotlin
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") }
Groovy
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 rozszerzenie Crashlytics do swojej kompilacji
W pliku Gradle modułu (na poziomie aplikacji) (zwykle <project>/<app-module>/build.gradle.kts
lub <project>/<app-module>/build.gradle
) skonfiguruj rozszerzenie Crashlytics.
Kotlin
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 } } } }
Groovy
// ... 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 po awariach NDK, Crashlytics musi znać symbole w natywnych plikach binarnych. Wtyczka Crashlytics Gradle zawiera zadanie uploadCrashlyticsSymbolFile BUILD_VARIANT
umożliwiające automatyzację tego procesu.
Aby móc 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 pakiet Crashlytics SDK dla NDK, jak i wtyczka Crashlytics Gradle zależą od obecności identyfikatora kompilacji GNU w natywnych obiektach współdzielonych.
Możesz sprawdzić obecność tego identyfikatora, uruchamiając
readelf -n
w 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 dokończyć konfigurowanie Crashlytics i zobaczyć początkowe dane w panelu kontrolnym Crashlytics konsoli Firebase, musisz wymusić awarię testową.
Dodaj do swojej aplikacji kod, którego możesz użyć do wymuszenia awarii testowej.
Możesz użyć poniższego kodu w
MainActivity
swojej aplikacji, aby dodać do aplikacji przycisk, którego naciśnięcie powoduje awarię. Przycisk jest oznaczony jako „Test Crash”.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))
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));
Kompiluj i uruchamiaj swoją aplikację.
Wymuś awarię testową, aby wysłać pierwszy raport o awarii aplikacji:
Otwórz aplikację na urządzeniu testowym lub emulatorze.
W swojej aplikacji naciśnij przycisk „Testuj awarię”, który dodałeś za pomocą powyższego kodu.
Gdy aplikacja ulegnie awarii, uruchom ją ponownie, aby aplikacja mogła wysłać raport o awarii do Firebase.
Przejdź do panelu Crashlytics konsoli Firebase, aby zobaczyć awarię testową.
Jeśli odświeżyłeś konsolę i po pięciu minutach nadal nie widzisz awarii testowej, 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, a raporty i statystyki dotyczące awarii możesz przeglądać i sprawdzać w panelu kontrolnym Crashlytics.
Następne kroki
(Zalecane) Uzyskaj pomoc 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. Aby skorzystać z tej funkcji debugowania, upewnij się, że Twoja aplikacja ma jawnie włączoną funkcję GWP-ASan i korzysta z najnowszego zestawu SDK Crashlytics dla NDK (wersja 18.3.6 lub nowsza lub Firebase BoM wersja 31.3.0 lub nowsza).
Dostosuj konfigurację raportu o awariach , dodając raporty wyrażające zgodę, 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.
Rozwiązywanie problemów
Jeśli widzisz różne ślady stosu w konsoli Firebase i w logcat, zapoznaj się z przewodnikiem rozwiązywania problemów .
Alternatywne opcje przesyłania symboli
Główny przepływ pracy na tej stronie powyżej ma zastosowanie do standardowych kompilacji Gradle. Jednak niektóre aplikacje korzystają z 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 przesłaniu symboli.
Opcja : Prześlij symbole dla modułów bibliotecznych i zależności zewnętrznych
Opcja ta może być pomocna w następujących sytuacjach:
- Jeśli używasz dostosowanego procesu kompilacji NDK w Gradle
- Jeśli Twoje biblioteki natywne są wbudowane w moduł biblioteki/funkcji lub dostarczone przez stronę trzecią
- Jeśli zadanie automatycznego przesyłania symboli nie powiedzie się lub na pulpicie nawigacyjnym widzisz awarie bez symboli
Standardowe zadanie przesyłania symboli Crashlytics zakłada, że budujesz biblioteki natywne w ramach kompilacji Gradle modułu aplikacji, używając standardowych narzędzi do kompilacji NDK, takich jak CMake.
Jeśli jednak używasz niestandardowego procesu kompilacji NDK w Gradle lub Twoje biblioteki natywne są wbudowane w moduł biblioteki/funkcji lub dostarczone przez stronę trzecią, może być konieczne jawne określenie ścieżki do nieobciętych bibliotek. Aby to osiągnąć, możesz dodać właściwość unstrippedNativeLibsDir
w rozszerzeniu Crashlytics w pliku kompilacji Gradle.
Upewnij się, że wcześniej na tej stronie wykonałeś następujące początkowe zadania z głównego przepływu pracy:
Aby zadanie automatycznego przesyłania symboli mogło znaleźć informacje o symbolach, dodaj następujący plik Gradle do swojego modułu (na poziomie aplikacji) (zwykle
<project>/<app-module>/build.gradle.kts
lub<project>/<app-module>/build.gradle
):Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { release { configure
{ nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } } Groovy
// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Wtyczka Crashlytics będzie rekursywnie przeszukiwać określony katalog w poszukiwaniu bibliotek natywnych z rozszerzeniem
.so
. Następnie Crashlytics 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 jednej wersji kompilacji, dostarczając listę lub instancję
FileCollection
Na koniec wymuś awarię testową , aby zakończyć konfigurację Crashlytics i zobaczyć początkowe dane w panelu Crashlytics konsoli Firebase.
Opcja : prześlij symbole dla kompilacji innych niż Gradle lub niedostępnych, nieokrojonych bibliotek natywnych
Opcja ta może być pomocna w następujących sytuacjach:
Jeśli używasz procesu kompilacji innego niż Gradle
Jeśli nieskażone biblioteki natywne są dostarczane w sposób uniemożliwiający dostęp do nich podczas kompilacji Gradle
Ta opcja wymaga uruchomienia polecenia Firebase CLI podczas tworzenia kompilacji wydania lub dowolnej kompilacji, dla której chcesz zobaczyć symboliczne ślady stosu w konsoli Firebase.
Upewnij się, że wcześniej na tej stronie wykonałeś następujące początkowe zadania z głównego przepływu pracy:
Dodano pakiet Crashlytics SDK dla NDK i wtyczkę Crashlytics Gradle .
Pamiętaj, że dzięki tej opcji nie musisz dodawać rozszerzenia
firebaseCrashlytics
ani konfigurować automatycznego przesyłania symboli, ponieważ zamiast tego będziesz używać interfejsu wiersza polecenia Firebase (kolejne kroki poniżej) do generowania i przesyłania plików symboli.Skonfiguruj środowisko i projekt do przesyłania symboli:
Postępuj zgodnie z instrukcjami, aby zainstalować interfejs CLI Firebase .
Jeśli masz już zainstalowany interfejs CLI, pamiętaj o zaktualizowaniu go do najnowszej wersji .
(tylko dla aplikacji korzystających z interfejsu API systemu Android na poziomie 30 lub nowszym) Zaktualizuj szablon
AndroidManifest.xml
swojej aplikacji, aby wyłączyć tagowanie wskaźników:Zaznacz pole Ustawienia odtwarzacza Android > Ustawienia publikowania > Kompiluj > Niestandardowy manifest główny .
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 swoich 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 znalezienia 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
Wyeksportowany do projektu Android Studio — PATH/TO/SYMBOLS może być dowolnym katalogiem. Interfejs wiersza polecenia Firebase będzie rekursywnie przeszukiwać określony katalog w poszukiwaniu bibliotek natywnych z rozszerzeniem
.so
.Zbudowano plik APK bezpośrednio z poziomu Unity — PATH/TO/SYMBOLS to ścieżka spakowanego pliku symboli wygenerowanego w katalogu głównym projektu po zakończeniu kompilacji (na przykład:
myproject/myapp-1.0-v100.symbols.zip
).
Zobacz zaawansowane opcje używania 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
Należy pamiętać, że domyślnym ustawieniem generowania pliku symboli jest Breakpad. Używaj tej flagi tylko wtedy, gdy ją 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
Zawiera dodatkowe informacje dotyczące debugowania Na koniec wymuś awarię testową , aby zakończyć konfigurację Crashlytics i zobaczyć początkowe dane w panelu Crashlytics konsoli Firebase.
Po zbudowaniu aplikacji w ramach wymuszania awarii pamiętaj o uruchomieniu polecenia
crashlytics:symbols:upload
interfejsu Firebase CLI, aby przesłać plik symboli.