Wenn Ihre Android-App native Bibliotheken enthält , können Sie mit ein paar kleinen Aktualisierungen der Build-Konfiguration Ihrer App vollständige Stacktraces und detaillierte Absturzberichte für Ihren nativen Code von Firebase Crashlytics aktivieren.
In dieser Anleitung wird beschrieben, wie Sie Absturzberichte mit dem Firebase Crashlytics SDK für NDK konfigurieren.
Wenn Sie nach den ersten Schritten mit Crashlytics in Ihren Unity-Projekten suchen, sehen Sie sich den Unity-Leitfaden „Erste Schritte“ an.
Bevor Sie beginnen
Fügen Sie Ihrem Android-Projekt Firebase hinzu , falls Sie dies noch nicht getan haben. Wenn Sie keine Android-App haben, können Sie eine Beispiel-App herunterladen.
Empfohlen : Um Funktionen wie absturzfreie Benutzer, Breadcrumb-Protokolle und Geschwindigkeitswarnungen zu erhalten, müssen Sie Google Analytics in Ihrem Firebase-Projekt aktivieren.
Wenn für Ihr vorhandenes Firebase-Projekt Google Analytics nicht aktiviert ist, können Sie Google Analytics über die Registerkarte „Integrationen“ Ihrer > Projekteinstellungen in der Firebase-Konsole aktivieren.
Wenn Sie ein neues Firebase-Projekt erstellen, aktivieren Sie Google Analytics während des Workflows zur Projekterstellung.
Schritt 1 : Fügen Sie Ihrer App das Crashlytics SDK für NDK hinzu
Fügen Sie in Ihrer Modul-Gradle-Datei (auf App-Ebene) (normalerweise<project>/<app-module>/build.gradle
) die Abhängigkeit für die Crashlytics NDK-Android-Bibliothek hinzu. Wir empfehlen die Verwendung der Firebase Android BoM zur Steuerung der Bibliotheksversionierung.Für ein optimales Erlebnis mit Crashlytics empfehlen wir, Google Analytics in Ihrem Firebase-Projekt zu aktivieren und Ihrer App das Firebase SDK für Google Analytics hinzuzufügen.
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:32.1.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-ktx' }
Durch die Verwendung der Firebase Android BoM verwendet Ihre App immer kompatible Versionen von Firebase Android-Bibliotheken.
(Alternative) Fügen Sie Firebase-Bibliotheksabhängigkeiten hinzu , ohne die Stückliste zu verwenden
Wenn Sie die Firebase-Stückliste nicht verwenden möchten, müssen Sie jede Firebase-Bibliotheksversion in ihrer Abhängigkeitszeile angeben.
Beachten Sie, dass wir bei Verwendung mehrerer Firebase-Bibliotheken in Ihrer App dringend empfehlen, die BoM zum Verwalten von Bibliotheksversionen zu verwenden, wodurch sichergestellt wird, dass alle Versionen kompatibel sind.
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.3.7' implementation 'com.google.firebase:firebase-analytics-ktx:21.3.0' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:32.1.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' }
Durch die Verwendung der Firebase Android BoM verwendet Ihre App immer kompatible Versionen von Firebase Android-Bibliotheken.
(Alternative) Fügen Sie Firebase-Bibliotheksabhängigkeiten hinzu , ohne die Stückliste zu verwenden
Wenn Sie die Firebase-Stückliste nicht verwenden möchten, müssen Sie jede Firebase-Bibliotheksversion in ihrer Abhängigkeitszeile angeben.
Beachten Sie, dass wir bei Verwendung mehrerer Firebase-Bibliotheken in Ihrer App dringend empfehlen, die BoM zum Verwalten von Bibliotheksversionen zu verwenden, wodurch sichergestellt wird, dass alle Versionen kompatibel sind.
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.3.7' implementation 'com.google.firebase:firebase-analytics:21.3.0' }
Schritt 2 : Fügen Sie das Crashlytics-Gradle-Plugin zu Ihrer App hinzu
Fügen Sie in Ihrer Gradle-Datei auf Stammebene (Projektebene) (
<project>/build.gradle
) das Crashlytics Gradle-Plugin als Buildscript-Abhängigkeit hinzu:buildscript { repositories { // Make sure that you have the following two repositories google() // Google's Maven repository mavenCentral() // Maven Central repository } dependencies { ... classpath 'com.android.tools.build:gradle:7.2.0' // Make sure that you have the Google services Gradle plugin dependency classpath 'com.google.gms:google-services:4.3.15' // Add the dependency for the Crashlytics Gradle plugin classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' } }
Fügen Sie in Ihrer Modul-Gradle-Datei (auf App-Ebene) (normalerweise
<project>/<app-module>/build.gradle
) das Crashlytics-Gradle-Plugin hinzu: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' ... }
Schritt 3 : Fügen Sie Ihrem Build die Erweiterung firebaseCrashlytics
hinzu
Fügen Sie in Ihrer Modul-Gradle-Datei (auf App-Ebene) (normalerweise app/build.gradle
) die Erweiterung firebaseCrashlytics
hinzu.
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 } } } }
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 } } } }
Schritt 4 : Richten Sie das automatische Hochladen von nativen Symbolen ein
Um lesbare Stacktraces von NDK-Abstürzen zu erstellen, muss Crashlytics die Symbole in Ihren nativen Binärdateien kennen. Das Crashlytics Gradle-Plug-in enthält die Aufgabe uploadCrashlyticsSymbolFile BUILD_VARIANT
um diesen Prozess zu automatisieren.
Damit Sie auf die Aufgabe für das automatisierte Hochladen von Symbolen zugreifen können, stellen Sie sicher, dass
nativeSymbolUploadEnabled
in Ihrer Gradle-Datei auf Modulebene (auf App-Ebene) auf „true
gesetzt ist.Damit Methodennamen in Ihren Stacktraces erscheinen, müssen Sie die Aufgabe
uploadCrashlyticsSymbolFile BUILD_VARIANT
nach jedem Build Ihrer NDK-Bibliothek explizit aufrufen. Zum Beispiel:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
Sowohl das Crashlytics-SDK für NDK als auch das Crashlytics-Gradle-Plug-in hängen vom Vorhandensein der GNU-Build-ID in den nativen gemeinsam genutzten Objekten ab.
Sie können das Vorhandensein dieser ID überprüfen, indem Sie
readelf -n
für jede Binärdatei ausführen. Wenn die Build-ID fehlt, fügen Sie-Wl,--build-id
zu den Flags Ihres Build-Systems hinzu, um das Problem zu beheben.
Schritt 5 : Erzwingen Sie einen Testabsturz, um die Einrichtung abzuschließen
Um die Einrichtung von Crashlytics abzuschließen und erste Daten im Crashlytics-Dashboard der Firebase-Konsole anzuzeigen, müssen Sie einen Testabsturz erzwingen.
Fügen Sie Ihrer App Code hinzu, mit dem Sie einen Testabsturz erzwingen können.
Sie können den folgenden Code in
MainActivity
Ihrer App verwenden, um Ihrer App eine Schaltfläche hinzuzufügen, die beim Drücken einen Absturz verursacht. Die Schaltfläche ist mit "Test Crash" beschriftet.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));
Erstellen Sie Ihre App und führen Sie sie aus.
Erzwingen Sie den Testabsturz, um den ersten Absturzbericht Ihrer App zu senden:
Öffnen Sie Ihre App auf Ihrem Testgerät oder Emulator.
Klicken Sie in Ihrer App auf die Schaltfläche „Test Crash“, die Sie mit dem obigen Code hinzugefügt haben.
Nachdem Ihre App abgestürzt ist, starten Sie sie neu, damit Ihre App den Absturzbericht an Firebase senden kann.
Rufen Sie das Crashlytics-Dashboard der Firebase-Konsole auf, um Ihren Testabsturz anzuzeigen.
Wenn Sie die Konsole aktualisiert haben und den Testabsturz nach fünf Minuten immer noch nicht sehen, aktivieren Sie die Debug-Protokollierung , um zu sehen, ob Ihre App Absturzberichte sendet.
Und das ist es! Crashlytics überwacht Ihre App jetzt auf Abstürze, und Sie können Absturzberichte und -statistiken im Crashlytics-Dashboard anzeigen und untersuchen.
Nächste Schritte
(Empfohlen) Holen Sie sich Hilfe beim Debuggen von Abstürzen, die durch Fehler im nativen Speicher verursacht werden, indem Sie GWP-ASan-Berichte sammeln . Diese speicherbezogenen Fehler können mit einer Speicherbeschädigung in Ihrer App zusammenhängen, die die Hauptursache für Sicherheitslücken in Apps ist. Um diese Funktion nutzen zu können, stellen Sie sicher, dass Ihre App GWP-ASan explizit aktiviert hat und das neueste Crashlytics SDK für NDK (v18.3.6+ oder Firebase BoM v31.3.0+) verwendet.
Passen Sie die Einrichtung Ihres Absturzberichts an , indem Sie Opt-in-Berichte, Protokolle, Schlüssel und die Verfolgung nicht schwerwiegender Fehler hinzufügen.
Integrieren Sie Google Play, damit Sie die Absturzberichte Ihrer Android-App direkt im Crashlytics-Dashboard nach Google Play-Track filtern können. Auf diese Weise können Sie Ihr Dashboard besser auf bestimmte Builds konzentrieren.
Fehlerbehebung
Wenn Sie unterschiedliche Stacktraces in der Firebase-Konsole und im Logcat sehen, lesen Sie den Leitfaden zur Fehlerbehebung .
Alternative Optionen zum Hochladen von Symbolen
Der Hauptarbeitsablauf auf dieser Seite oben gilt für Standard-Gradle-Builds. Einige Apps verwenden jedoch eine andere Konfiguration oder Tools (z. B. einen anderen Build-Prozess als Gradle). In diesen Situationen können die folgenden Optionen hilfreich sein, um Symbole erfolgreich hochzuladen.
Option : Symbole für Bibliotheksmodule und externe Abhängigkeiten hochladen
Diese Option kann in den folgenden Situationen hilfreich sein:
- Wenn Sie einen benutzerdefinierten NDK-Build-Prozess in Gradle verwenden
- Wenn Ihre nativen Bibliotheken in einem Bibliotheks-/Funktionsmodul integriert sind oder von einem Drittanbieter bereitgestellt werden
- Wenn die Aufgabe zum automatischen Hochladen von Symbolen fehlschlägt oder Sie nicht symbolisierte Abstürze im Dashboard sehen
Die standardmäßige Aufgabe zum Hochladen von Crashlytics-Symbolen geht davon aus, dass Sie Ihre nativen Bibliotheken als Teil des Gradle-Builds Ihres App-Moduls erstellen, indem Sie standardmäßige NDK-Build-Tools wie CMake verwenden.
Wenn Sie jedoch einen benutzerdefinierten NDK-Erstellungsprozess in Gradle verwenden oder Ihre nativen Bibliotheken in einem Bibliotheks-/Funktionsmodul erstellt oder von einem Drittanbieter bereitgestellt werden, müssen Sie möglicherweise den Pfad zu Ihren nicht entfernten Bibliotheken explizit angeben. Um dies zu erreichen, können Sie die unstrippedNativeLibsDir
Eigenschaft innerhalb der firebaseCrashlytics
-Erweiterung in Ihrer build.gradle
Datei hinzufügen.
Stellen Sie sicher, dass Sie die folgenden anfänglichen Aufgaben aus dem Hauptworkflow weiter oben auf dieser Seite abgeschlossen haben:
Damit die Aufgabe zum automatischen Hochladen von Symbolen Ihre Symbolinformationen finden kann, fügen Sie Folgendes zu Ihrer
build.gradle
Datei (auf App-Ebene) hinzu:// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Das Crashlytics-Plugin durchsucht das angegebene Verzeichnis rekursiv nach nativen Bibliotheken mit der Erweiterung
.so
. Crashlytics extrahiert dann Debugging-Symbole aus all diesen Bibliotheken und lädt sie auf die Firebase-Server hoch.Folgendes können Sie in der Eigenschaft
unstrippedNativeLibsDir
angeben:Jedes für
org.gradle.api.Project#files(Object...)
zulässige Argument, einschließlich:java.lang.String
,java.io.File
oderorg.gradle.api.file.FileCollection
Mehrere Verzeichnisse für eine einzelne Build-Variante durch Bereitstellen einer Listen- oder
FileCollection
Instanz
Erzwingen Sie abschließend einen Testabsturz, um die Einrichtung von Crashlytics abzuschließen und erste Daten im Crashlytics-Dashboard der Firebase-Konsole anzuzeigen.
Option : Hochladen von Symbolen für Nicht-Gradle-Builds oder unzugängliche native Bibliotheken ohne Strippen
Diese Option kann in den folgenden Situationen hilfreich sein:
Wenn Sie einen anderen Build-Prozess als Gradle verwenden
Wenn Ihnen Ihre nicht gestrippten nativen Bibliotheken auf irgendeine Weise bereitgestellt werden, dass sie während Gradle-Builds nicht zugänglich sind
Diese Option erfordert, dass Sie einen Firebase-CLI-Befehl ausführen, wenn Sie einen Release-Build oder einen beliebigen Build erstellen, für den Sie symbolisierte Stacktraces in der Firebase-Konsole anzeigen möchten.
Stellen Sie sicher, dass Sie die folgenden anfänglichen Aufgaben aus dem Hauptworkflow weiter oben auf dieser Seite abgeschlossen haben:
Das Crashlytics SDK für NDK und das Crashlytics Gradle-Plugin wurden hinzugefügt.
Beachten Sie, dass Sie bei dieser Option weder die
firebaseCrashlytics
Erweiterung hinzufügen noch das automatische Hochladen von Symbolen einrichten müssen, da Sie stattdessen die Firebase-Befehlszeilenschnittstelle (nächste Schritte unten) verwenden, um Ihre Symboldateien zu generieren und hochzuladen.Richten Sie Ihre Umgebung und Ihr Projekt für das Hochladen von Symbolen ein:
Befolgen Sie die Anweisungen zum Installieren der Firebase-CLI .
Wenn Sie die CLI bereits installiert haben, stellen Sie sicher, dass Sie auf die neueste Version aktualisieren .
(nur für Apps mit Android API Level 30+) Aktualisieren Sie
AndroidManifest.xml
Vorlage Ihrer App, um Pointer Tagging zu deaktivieren:Aktivieren Sie das Kontrollkästchen für Android Player Settings > Publishing Settings > Build > Custom Main Manifest .
Öffnen Sie die Manifestvorlage unter
Assets/Plugins/Android/AndroidManifest.xml
.Fügen Sie dem Anwendungs-Tag das folgende Attribut hinzu:
<application android:allowNativeHeapPointerTagging="false" ... />
Erstellen Sie Ihr Projekt.
Laden Sie Ihre Symbolinformationen hoch.
Generieren Sie nach Abschluss Ihres Builds eine Crashlytics-kompatible Symboldatei und laden Sie sie auf Firebase-Server hoch, indem Sie den folgenden Firebase-CLI-Befehl ausführen:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : Ihre Firebase-Android-App-ID (nicht Ihr Paketname)
Beispiel-Firebase-Android-App-ID:1:567383003300:android:17104a2ced0c9b9b
Hier sind zwei Möglichkeiten, um Ihre Firebase-App-ID zu finden:
In Ihrer Datei
google-services.json
ist Ihre App-ID der Wertmobilesdk_app_id
; oderGehen Sie in der Firebase-Konsole zu Ihren Projekteinstellungen . Scrollen Sie nach unten zur Karte Ihre Apps und klicken Sie dann auf die gewünschte Firebase-App, um ihre App-ID zu finden.
PATH/TO/SYMBOLS : Der Pfad zu der von der CLI generierten Symboldatei
In ein Android Studio-Projekt exportiert – PATH/TO/SYMBOLS kann ein beliebiges Verzeichnis sein. Die Firebase-CLI durchsucht das angegebene Verzeichnis rekursiv nach nativen Bibliotheken mit der Erweiterung
.so
.Erstellen Sie das APK direkt aus Unity heraus – PATH/TO/SYMBOLS ist der Pfad der gezippten Symboldatei, die im Stammverzeichnis des Projekts generiert wird, wenn Ihr Build abgeschlossen ist (z. B.:
myproject/myapp-1.0-v100.symbols.zip
).
Zeigen Sie erweiterte Optionen für die Verwendung des Firebase-CLI-Befehls zum Generieren und Hochladen von Symboldateien an
Flagge Beschreibung --generator=csym
Verwendet den alten cSYM-Symboldateigenerator anstelle des standardmäßigen Breakpad-Generators
Nicht zur Verwendung empfohlen. Wir empfehlen die Verwendung des standardmäßigen Breakpad-Symboldateigenerators.
--generator=breakpad
Verwendet den Breakpad-Symboldateigenerator
Beachten Sie, dass die Standardeinstellung für die Generierung von Symboldateien Breakpad ist. Verwenden Sie dieses Flag nur, wenn Sie
symbolGenerator { csym() }
in Ihrer Build-Konfiguration hinzugefügt haben und es überschreiben möchten, um stattdessen Breakpad zu verwenden.--dry-run
Generiert die Symboldateien, lädt sie aber nicht hoch
Dieses Flag ist nützlich, wenn Sie den Inhalt der gesendeten Dateien überprüfen möchten.
--debug
Stellt zusätzliche Debugging-Informationen bereit Erzwingen Sie abschließend einen Testabsturz, um die Einrichtung von Crashlytics abzuschließen und erste Daten im Crashlytics-Dashboard der Firebase-Konsole anzuzeigen.
Nachdem Sie Ihre App erstellt haben, um einen Absturz zu erzwingen, stellen Sie sicher, dass Sie den Firebase-CLI-Befehl
crashlytics:symbols:upload
ausführen, um Ihre Symboldatei hochzuladen.