Android NDK-Absturzberichte abrufen

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 diesem Leitfaden wird beschrieben, wie du Absturzberichte mit dem Firebase Crashlytics SDK für NDK konfigurieren kannst.

Informationen zum Einstieg in Crashlytics in Ihren Unity-Projekten finden Sie im Unity-Einstiegsleitfaden.

Hinweis

  1. Falls noch nicht geschehen, fügen Sie Firebase Ihrem Android-Projekt hinzu. Wenn Sie keine Android-App haben, können Sie eine Beispiel-App herunterladen.

  2. 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  > Projekteinstellungen in der Firebase Console aktivieren.

    • Wenn Sie ein neues Firebase-Projekt erstellen, aktivieren Sie Google Analytics während des Projekterstellungsworkflows.

  3. Ihre App muss die folgenden Mindestversionen haben:

    • Gradle 8.0
    • Android Gradle Plugin 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, die 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.5.1"))

    // 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) Fügen Sie Firebase-Bibliotheksabhängigkeiten ohne die BoM hinzu

Wenn Sie die Firebase BoM nicht verwenden, müssen Sie jede Firebase-Bibliotheksversion in der entsprechenden Abhängigkeitszeile angeben.

Wenn du in deiner App mehrere Firebase-Bibliotheken verwendest, empfehlen wir dringend, die BoM zum Verwalten von Bibliotheksversionen zu verwenden. So ist gewährleistet, 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.2.1")
    implementation("com.google.firebase:firebase-analytics:22.1.2")
}
Suchen Sie nach einem Kotlin-spezifischen Bibliotheksmodul? Ab Oktober 2023 (Firebase BoM 32.5.0) können Kotlin- und Java-Entwickler vom Modul der Hauptbibliothek abhängig sein. Weitere Informationen finden Sie in den FAQs zu dieser Initiative.

Schritt 2: Crashlytics Gradle-Plug-in zur App hinzufügen

  1. Fügen Sie in der Gradle-Datei auf Stammebene (Projektebene) (<project>/build.gradle.kts oder <project>/build.gradle) dem Block plugins das Gradle-Plug-in Crashlytics hinzu:

    Kotlin

    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.2" apply false
    }

    Groovy

    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.2' apply false
    }
  2. 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 Gradle-Plug-in Crashlytics hinzu:

    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'
    }

Schritt 3: Crashlytics-Erweiterung zum Build hinzufügen

Konfigurieren Sie die Crashlytics-Erweiterung in der Gradle-Datei des Moduls (auf Anwendungsebene) (in der Regel <project>/<app-module>/build.gradle.kts oder <project>/<app-module>/build.gradle).

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
          }
      }
  }
}

Schritt 4: Automatischen Upload nativer Symbole einrichten

Um lesbare Stacktraces nach NDK-Abstürzen zu erstellen, 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.

  1. 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 auf true festgelegt sein.

  2. 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:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
  3. Sowohl das Crashlytics SDK für NDK als auch das Gradle-Plug-in Crashlytics hängen davon ab, ob die GNU-Build-ID in den nativen freigegebenen Objekten vorhanden ist.

    Sie können die Anwesenheit dieser ID prüfen, indem Sie readelf -n für jedes Binärprogramm ausführen. Wenn die Build-ID fehlt, fügen Sie den Flags Ihres Build-Systems -Wl,--build-id hinzu, um das Problem zu beheben.

Schritt 5: Testabsturz erzwingen, um die Einrichtung abzuschließen

Wenn Sie die Einrichtung von Crashlytics abschließen und die ersten Daten im Crashlytics-Dashboard der Firebase-Konsole sehen möchten, müssen Sie einen Testabsturz erzwingen.

  1. 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“.

    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));
  2. Erstellen Sie Ihre App und führen Sie sie aus.

  3. Erzwingen Sie den Testabsturz, um den ersten Absturzbericht Ihrer App zu senden:

    1. Öffnen Sie Ihre App auf Ihrem Testgerät oder Emulator.

    2. Klicken Sie in Ihrer App auf die Schaltfläche „Test Crash“, die Sie mit dem Code oben hinzugefügt haben.

    3. Starten Sie die App nach dem Absturz neu, damit sie den Absturzbericht an Firebase senden kann.

  4. 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 deine App jetzt auf Abstürze. Du kannst Absturzberichte und Statistiken im Crashlytics-Dashboard ansehen 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.

  • Binde Google Play ein, damit du die Absturzberichte deiner Android-App direkt im Crashlytics-Dashboard nach dem Google Play-Track filtern kannst. So können Sie sich auf bestimmte Builds in Ihrem Dashboard konzentrieren.

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 Build-Prozess 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 folgenden Situationen hilfreich sein:

  • Wenn Sie in Gradle einen benutzerdefinierten NDK-Build-Prozess 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

Option: Symbole für Builds ohne Gradle oder nicht zugängliche nicht entfernbare native Bibliotheken hochladen

Diese Option kann in folgenden Situationen 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