Wenn Ihre Android-App native Bibliotheken enthält, können Sie ab Firebase Crashlytics mit einigen kleinen Änderungen an der Build-Konfiguration Ihrer App vollständige Stack-Traces und detaillierte Absturzberichte für Ihren nativen Code aktivieren.
In dieser Anleitung wird beschrieben, wie Sie die Absturzberichte mit dem Firebase Crashlytics SDK for NDK konfigurieren.
Informationen dazu, wie du Crashlytics in deinen Unity-Projekten verwenden kannst, findest du im Unity-Einstiegsleitfaden.
Hinweis
Fügen Sie Ihrem Android-Projekt Firebase hinzu, falls noch nicht geschehen. Wenn Sie keine Android-App haben, können Sie eine Beispiel-App herunterladen.
Empfohlen: Wenn Sie automatisch Navigationspfadlogs erhalten möchten, um Nutzeraktionen zu verstehen, die zu einem Absturz, einem nicht schwerwiegenden Ereignis oder einem ANR-Ereignis geführt haben, müssen Sie Google Analytics in Ihrem Firebase-Projekt aktivieren.
Wenn Google Analytics in Ihrem vorhandenen Firebase-Projekt nicht aktiviert ist, können Sie Google Analytics auf dem Tab Integrationen unter
in der > ProjekteinstellungenFirebase Console aktivieren. Wenn Sie ein neues Firebase-Projekt erstellen, aktivieren Sie Google Analytics während des Projekterstellungsvorgangs.
Ihre App muss die folgenden Mindestversionen haben:
- Gradle 8.0
- Android Gradle-Plug-in 8.1.0
- Google-Dienste-Gradle-Plug-in 4.4.1
Schritt 1: Der App das Crashlytics SDK für das NDK hinzufügen
Fügen Sie in der Gradle-Datei des Moduls (auf App-Ebene) (in der Regel<project>/<app-module>/build.gradle.kts
oder <project>/<app-module>/build.gradle
) die Abhängigkeit für die Crashlytics NDK-Bibliothek für Android hinzu. Wir empfehlen, Firebase Android BoM zu verwenden, um die Versionierung der Bibliothek zu steuern.
Für eine optimale Nutzung von Crashlytics empfehlen wir, Google Analytics in Ihrem Firebase-Projekt zu aktivieren und Ihrer App das Firebase SDK für Google Analytics hinzuzufügen.
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") }
Mit der Firebase Android BoM haben Sie immer eine kompatible Version der Firebase Android-Bibliotheken in Ihrer App.
Alternative: Firebase-Bibliotheksabhängigkeiten ohne BoM hinzufügen
Wenn Sie die Firebase BoM nicht verwenden, müssen Sie jede Firebase-Bibliotheksversion in der entsprechenden Abhängigkeitszeile angeben.
Wenn Sie mehrere Firebase-Bibliotheken in Ihrer App verwenden, empfehlen wir Ihnen dringend, die Bibliotheksversionen mithilfe der BoM zu verwalten. So wird sichergestellt, 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:19.4.0") implementation("com.google.firebase:firebase-analytics:22.2.0") }
Schritt 2: Crashlytics-Gradle-Plug-in zur App hinzufügen
Fügen Sie in der Gradle-Datei auf Stammebene (Projektebene) (
<project>/build.gradle.kts
oder<project>/build.gradle
) dem Blockplugins
das Gradle-Plug-in Crashlytics hinzu: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 }
Fügen Sie in der Gradle-Datei des Moduls (auf App-Ebene) (in der Regel
<project>/<app-module>/build.gradle.kts
oder<project>/<app-module>/build.gradle
) das Crashlytics-Gradle-Plug-in 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") }
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: Crashlytics-Erweiterung zum Build hinzufügen
Konfigurieren Sie die Crashlytics-Erweiterung in der Gradle-Datei des Moduls (auf App-Ebene) (in der Regel <project>/<app-module>/build.gradle.kts
oder <project>/<app-module>/build.gradle
).
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 } } } }
Schritt 4: Automatischen Upload von nativen Symbolen einrichten
Damit lesbare Stack-Traces aus NDK-Abstürzen erstellt werden können, muss Crashlytics die Symbole in Ihren nativen Binärdateien kennen. Das Crashlytics Gradle-Plug-in enthält die Aufgabe uploadCrashlyticsSymbolFileBUILD_VARIANT
, um diesen Prozess zu automatisieren.
Damit Sie auf die Aufgabe für das automatische Hochladen von Symbolen zugreifen können, muss in der Gradle-Datei des Moduls (auf Anwendungsebene)
nativeSymbolUploadEnabled
auftrue
festgelegt sein.Damit Methodennamen in Ihren Stack-Traces angezeigt werden, müssen Sie nach jedem Build Ihrer NDK-Bibliothek den
uploadCrashlyticsSymbolFileBUILD_VARIANT
-Task explizit aufrufen. Beispiel:>./gradlew app:assemble
BUILD_VARIANT \ app:uploadCrashlyticsSymbolFileBUILD_VARIANT Sowohl das Crashlytics SDK für das NDK als auch das Crashlytics Gradle-Plug-in sind auf die Anwesenheit der GNU-Build-ID in den nativen freigegebenen Objekten angewiesen.
Sie können die Anwesenheit dieser ID prüfen, indem Sie
für jedes Binärprogramm ausführen. Wenn die Build-ID fehlt, fügen Sie den Flags Ihres Build-Systemsreadelf -n
hinzu, um das Problem zu beheben.-Wl,--build-id
Schritt 5: Testabsturz erzwingen, um die Einrichtung abzuschließen
Wenn Sie die Einrichtung von Crashlytics abschließen und erste Daten im Crashlytics-Dashboard der Firebase-Konsole sehen möchten, müssen Sie einen Testabsturz erzwingen.
Fügen Sie Ihrer App Code hinzu, mit dem Sie einen Testabsturz erzwingen können.
Mit dem folgenden Code in der
MainActivity
-Datei Ihrer App können Sie eine Schaltfläche hinzufügen, die beim Drücken einen Absturz verursacht. Die Schaltfläche trägt die Bezeichnung „Test Crash“.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));
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 Code oben hinzugefügt haben.
Starten Sie die App nach dem Absturz neu, damit sie den Absturzbericht an Firebase senden kann.
Rufen Sie das Crashlytics-Dashboard der Firebase-Konsole auf, um den Absturz des Tests zu sehen.
Wenn Sie die Konsole aktualisiert haben und der Test nach fünf Minuten immer noch nicht abgestürzt ist, aktivieren Sie die Debug-Protokollierung, um zu sehen, ob Ihre App Absturzberichte sendet.
Das war's auch schon. Crashlytics überwacht jetzt Ihre App auf Abstürze. Sie können Absturzberichte und Statistiken im Crashlytics-Dashboard aufrufen und untersuchen.
Nächste Schritte
(Empfohlen) Sie können Hilfe beim Beheben von Abstürzen erhalten, die durch native Arbeitsspeicherfehler verursacht wurden. Dazu müssen Sie GWP-ASan-Berichte erfassen. Diese speicherbezogenen Fehler können mit Speicherbeschädigungen in Ihrer App zusammenhängen, die die Hauptursache für Sicherheitslücken in Apps sind. Damit Sie diese Funktion zur Fehlerbehebung nutzen können, muss GWP-ASan explizit in Ihrer App aktiviert sein und die neueste Version des Crashlytics SDK für NDK (Version 18.3.6 oder höher bzw. Firebase BoM Version 31.3.0 oder höher) verwendet werden.
Passen Sie die Einrichtung von Absturzberichten an, indem Sie optionale Berichte, Protokolle, Schlüssel und das Tracking nicht kritischer Fehler hinzufügen.
Google Play einbinden, damit Sie die Absturzberichte Ihrer Android-App direkt im Crashlytics-Dashboard nach Google Play-Track filtern können So können Sie Ihr Dashboard besser auf bestimmte Builds ausrichten.
Fehlerbehebung
Wenn Sie in der Firebase-Konsole und im Logcat unterschiedliche Stack-Traces sehen, lesen Sie den Leitfaden zur Fehlerbehebung.
Alternative Optionen zum Hochladen von Symbolen
Der Hauptablauf auf dieser Seite gilt für standardmäßige Gradle-Builds. Einige Apps verwenden jedoch eine andere Konfiguration oder andere Tools, z. B. einen anderen Buildprozess als Gradle. In diesen Fällen 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 Fällen hilfreich sein:
- Wenn Sie einen benutzerdefinierten NDK-Buildprozess in Gradle verwenden
- Wenn Ihre nativen Bibliotheken in einem Bibliotheks-/Funktionsmodul eingebunden oder von einem Drittanbieter bereitgestellt werden
- Wenn die Aufgabe zum automatischen Hochladen von Symbolen fehlschlägt oder im Dashboard nicht symbolisierte Abstürze angezeigt werden
Anleitung für diese Option ansehen
Bei der Standardaufgabe zum Hochladen von Crashlytics-Symbolen wird davon ausgegangen, dass Sie Ihre nativen Bibliotheken im Rahmen des Gradle-Builds Ihres App-Moduls mithilfe von Standard-NDK-Build-Tools wie CMake erstellen.
Wenn Sie jedoch einen benutzerdefinierten NDK-Buildprozess 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 entfernen Bibliotheken explizit angeben. Dazu können Sie das Attribut unstrippedNativeLibsDir
in der Crashlytics-Erweiterung in Ihrer Gradle-Builddatei hinzufügen.
Sie müssen die folgenden ersten Aufgaben aus dem Hauptworkflow oben auf dieser Seite ausgeführt haben:
Damit die Aufgabe zum automatischen Hochladen von Symbolen Ihre Symbolinformationen finden kann, fügen Sie der Gradle-Datei des Moduls (auf App-Ebene) (in der Regel
<project>/<app-module>/build.gradle.kts
oder<project>/<app-module>/build.gradle
) Folgendes hinzu: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 ") } } } }Das Crashlytics-Plug-in durchsucht das angegebene Verzeichnis rekursiv nach nativen Bibliotheken mit der Erweiterung
.so
. Crashlytics extrahiert dann Debugsymbole aus allen solchen Bibliotheken und lädt sie auf die Firebase-Server hoch.Folgendes können Sie in der Property
unstrippedNativeLibsDir
angeben:Beliebiges Argument, das für
org.gradle.api.Project#files(Object...)
zulässig ist, z. B. ,java.lang.String
oderjava.io.File
org.gradle.api.file.FileCollection
Mehrere Verzeichnisse für einen einzelnen Build-Flavor durch Angabe einer Liste oder
FileCollection
-Instanz(Ab Crashlytics Gradle-Plug-in 3.0.0) Mehrere Verzeichnisse in einzelnen Produkten und Build-Varianten zusammenfassen.
Beispiel mit mehreren Verzeichnissen ansehen
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 ") } } } }Mit der Aufgabe
uploadCrashlyticsSymbolFilesBasicRelease
werden nur die Symbole inMY/NATIVE/LIBS
hochgeladen. MituploadCrashlyticsSymbolFilesFeatureXRelease
werden dagegen Symbole sowohl inMY/NATIVE/LIBS
als auch inMY/FEATURE_X/LIBS
hochgeladen.Erzwingen Sie einen Testabsturz, um die Einrichtung von Crashlytics abzuschließen und die ersten Daten im Crashlytics-Dashboard der Firebase-Konsole zu sehen.
Option: Symbole für Builds ohne Gradle oder nicht zugängliche nicht entfernbare native Bibliotheken hochladen
Diese Option kann in den folgenden Fällen hilfreich sein:
Wenn Sie einen anderen Build-Prozess als Gradle verwenden
Wenn Ihre nicht entfernen nativen Bibliotheken Ihnen auf eine Weise zur Verfügung gestellt werden, dass sie während Gradle-Builds nicht zugänglich sind
Anleitung für diese Option ansehen
Für diese Option müssen Sie einen Firebase-Befehl ausführen, wenn Sie einen Release-Build oder einen Build erstellen, für den Sie symbolische Stack-Traces in der Firebase-Konsole sehen möchten.
Sie müssen die folgenden ersten Aufgaben aus dem Hauptworkflow oben auf dieser Seite ausgeführt haben:
Das Crashlytics SDK für das NDK und das Crashlytics Gradle-Plug-in wurden hinzugefügt.
Bei dieser Option müssen Sie die
firebaseCrashlytics
-Erweiterung nicht hinzufügen und auch keinen automatischen Symbolupload einrichten, da Sie stattdessen die Firebase-Befehlszeile (siehe nächste Schritte unten) zum Generieren und Hochladen Ihrer Symboldateien verwenden.Richten Sie Ihre Umgebung und Ihr Projekt für das Hochladen von Symbolen ein:
Folgen Sie der Anleitung zum Installieren der Firebase CLI.
Wenn Sie die Befehlszeile bereits installiert haben, aktualisieren Sie sie auf die neueste Version.
(nur für Apps mit Android API-Level 30 und höher) Aktualisieren Sie die
AndroidManifest.xml
-Vorlage Ihrer App, um das Zeiger-Tagging zu deaktivieren:Klicke das Kästchen bei Android-Player-Einstellungen > Einstellungen für die Veröffentlichung > Build > Benutzerdefiniertes Hauptmanifest an.
Ö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 die Symbolinformationen hoch.
Nachdem der Build abgeschlossen ist, generieren Sie eine Crashlytics-kompatible Symboldatei und laden Sie sie mit dem folgenden Firebase-Befehl auf die Firebase-Server hoch:
firebase crashlytics:symbols:upload --app=
FIREBASE_APP_ID PATH/TO/SYMBOLS FIREBASE_APP_ID: Ihre Firebase-Android-App-ID (nicht Ihr Paketname)
Beispiel für eine Firebase-Android-App-ID:1:567383003300:android:17104a2ced0c9b9b
Sie benötigen Ihre Firebase App-ID?
So finden Sie Ihre Firebase App-ID:
In Ihrer
google-services.json
-Datei ist Ihre App-ID der Wertmobilesdk_app_id
.Rufen Sie in der Firebase Console die Projekteinstellungen auf. Scrollen Sie nach unten zur Karte Meine Apps und klicken Sie auf die gewünschte Firebase-App, um die App-ID zu sehen.
PATH/TO/SYMBOLS: Pfad zur Symboldatei, die von der Befehlszeile generiert wurde
In ein Android Studio-Projekt exportiert – PATH/TO/SYMBOLS kann jedes Verzeichnis sein. Die Firebase-Befehlszeile sucht rekursiv im angegebenen Verzeichnis nach nativen Bibliotheken mit der Erweiterung
.so
.Das APK wurde direkt in Unity erstellt. PATH/TO/SYMBOLS ist der Pfad der komprimierten Symboldatei, die im Stammverzeichnis des Projekts generiert wurde, als der Build abgeschlossen wurde (z. B.
).myproject/myapp-1.0-v100.symbols.zip
Erweiterte Optionen für die Verwendung des Firebase-Befehls zur Generierung und zum Hochladen von Symboldateien aufrufen
Flag Beschreibung --generator=csym
Der alte cSYM-Symboldateigenerator wird anstelle des standardmäßigen Breakpad-Generators verwendet.
Nicht empfohlen. Wir empfehlen, den Standardgenerator für Breakpad-Symboldateien zu verwenden.
--generator=breakpad
Verwendet den Breakpad-Symboldateigenerator
Standardmäßig wird Breakpad für die Symboldateigenerierung verwendet. Verwenden Sie dieses Flag nur, wenn Sie
in Ihre Build-Konfiguration eingefügt haben und es überschreiben möchten, um stattdessen Breakpad zu verwenden.symbolGenerator { csym() }
--dry-run
Die Symboldateien werden generiert, aber nicht hochgeladen.
Dieses Flag ist nützlich, wenn Sie den Inhalt der gesendeten Dateien prüfen möchten.
--debug
Bietet zusätzliche Informationen zur Fehlerbehebung Erzwingen Sie einen Testabsturz, um die Einrichtung von Crashlytics abzuschließen und die ersten Daten im Crashlytics-Dashboard der Firebase-Konsole zu sehen.
Nachdem Sie Ihre App erstellt haben, um einen Absturz zu erzwingen, müssen Sie den Befehl Firebase CLI
crashlytics:symbols:upload
ausführen, um die Symboldatei hochzuladen.