Erhalten Sie Android NDK-Absturzberichte

Wenn Ihre Android-App native Bibliotheken enthält, können Sie mit ein paar kleinen Aktualisierungen der Build-Konfiguration Ihrer App vollständige Stack-Traces 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 erfahren möchten, wie Sie mit Crashlytics in Ihren Unity-Projekten beginnen können, schauen Sie sich den Unity-Leitfaden „Erste Schritte“ an.

Bevor Sie beginnen

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

  2. Empfohlen : Um automatisch Breadcrumb-Protokolle zu erhalten, um Benutzeraktionen zu verstehen, die zu einem Absturz, einem nicht schwerwiegenden Ereignis oder einem ANR-Ereignis führen, müssen Sie Google Analytics in Ihrem Firebase-Projekt aktivieren.

    • Wenn in Ihrem bestehenden Firebase-Projekt Google Analytics nicht aktiviert ist, können Sie Google Analytics über die Registerkarte „Integrationen“ Ihres Projekts aktivieren > Projekteinstellungen in der Firebase-Konsole.

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

Schritt 1 : Fügen Sie das Crashlytics SDK für NDK zu Ihrer App hinzu

Fügen Sie in Ihrer Modul-Gradle-Datei (auf App-Ebene) (normalerweise <project>/<app-module>/build.gradle.kts oder <project>/<app-module>/build.gradle ) die Abhängigkeit für das Crashlytics NDK hinzu Bibliothek für Android. 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 das Firebase SDK für Google Analytics zu Ihrer App hinzuzufügen.

dependencies {
    // Import the BoM for the Firebase platform
    implementation(platform("com.google.firebase:firebase-bom:32.7.3"))

    // 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 der 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: Wenn Sie mehrere Firebase-Bibliotheken in Ihrer App verwenden, empfehlen wir dringend, die BoM zum Verwalten der Bibliotheksversionen zu verwenden, um sicherzustellen, 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.6.2")
    implementation("com.google.firebase:firebase-analytics:21.5.1")
}
Suchen Sie nach einem Kotlin-spezifischen Bibliotheksmodul? Ab Oktober 2023 (Firebase BoM 32.5.0) können sich sowohl Kotlin- als auch Java-Entwickler auf das Hauptbibliotheksmodul verlassen (Einzelheiten finden Sie in den FAQ zu dieser Initiative ).

Schritt 2 : Fügen Sie das Crashlytics Gradle-Plugin zu Ihrer App hinzu

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

    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.1" 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.1' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '2.9.9' apply false
    }
    
  2. Fügen Sie in Ihrer Modul-Gradle-Datei (auf App-Ebene) (normalerweise <project>/<app-module>/build.gradle.kts oder <project>/<app-module>/build.gradle ) das Crashlytics Gradle-Plugin 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 : Fügen Sie die Crashlytics-Erweiterung zu Ihrem Build hinzu

Konfigurieren Sie in der Gradle-Datei Ihres Moduls (App-Ebene) (normalerweise <project>/<app-module>/build.gradle.kts oder <project>/<app-module>/build.gradle ) die Crashlytics-Erweiterung.

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 : Richten Sie das automatische Hochladen nativer Symbole ein

Um lesbare Stack-Traces von NDK-Abstürzen zu erstellen, muss Crashlytics die Symbole in Ihren nativen Binärdateien kennen. Das Crashlytics Gradle-Plugin enthält die Aufgabe uploadCrashlyticsSymbolFile BUILD_VARIANT um diesen Prozess zu automatisieren.

  1. Damit Sie auf die Aufgabe zum automatischen Hochladen von Symbolen zugreifen können, stellen Sie sicher, dass nativeSymbolUploadEnabled in der Gradle-Datei Ihres Moduls (App-Ebene) auf „ true gesetzt ist.

  2. Damit Methodennamen in Ihren Stack-Traces angezeigt werden, 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
    
  3. Sowohl das Crashlytics SDK für NDK als auch das Crashlytics Gradle-Plugin hängen vom Vorhandensein der GNU-Build-ID in den nativen freigegebenen Objekten ab.

    Sie können das Vorhandensein dieser ID überprüfen, indem Sie ausführen readelf -n für jede Binärdatei. Wenn die Build-ID fehlt, fügen Sie hinzu -Wl,--build-id zu den Flags Ihres Build-Systems hinzufügen, 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.

  1. 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));
    
  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 von Ihrem Testgerät oder Emulator.

    2. Klicken Sie in Ihrer App auf die Schaltfläche „Absturz testen“, die Sie mit dem obigen Code hinzugefügt haben.

    3. Nachdem Ihre App abgestürzt ist, starten Sie sie neu, damit Ihre App den Absturzbericht an Firebase senden kann.

  4. Gehen Sie zum Crashlytics-Dashboard der Firebase-Konsole, um Ihren Testabsturz zu sehen.

    Wenn Sie die Konsole aktualisiert haben und der Testabsturz nach fünf Minuten immer noch nicht auftritt, 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) Erhalten Sie Hilfe beim Debuggen von Abstürzen, die durch native Speicherfehler verursacht werden, indem Sie GWP-ASan-Berichte sammeln . Diese speicherbezogenen Fehler können mit einer Speicherbeschädigung in Ihrer App verbunden sein, die die Hauptursache für Sicherheitslücken in der App darstellt. Um diese Debugging-Funktion nutzen zu können, stellen Sie sicher, dass für Ihre App GWP-ASan explizit aktiviert ist 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 optionale Berichte, Protokolle, Schlüssel und die Verfolgung nicht schwerwiegender Fehler hinzufügen.

  • Integrieren Sie Google Play, sodass Sie die Absturzberichte Ihrer Android-App direkt im Crashlytics-Dashboard nach Google Play-Track filtern können. Dadurch können Sie Ihr Dashboard besser auf bestimmte Builds konzentrieren.

Fehlerbehebung

Wenn Sie in der Firebase-Konsole und im Logcat unterschiedliche Stack-Traces sehen, lesen Sie die Anleitung zur Fehlerbehebung .



Alternative Möglichkeiten zum Hochladen von Symbolen

Der Hauptworkflow auf dieser Seite oben gilt für Standard-Gradle-Builds. Einige Apps verwenden jedoch eine andere Konfiguration oder andere Tools (z. B. einen anderen Build-Prozess als Gradle). In diesen Situationen können die folgenden Optionen für das erfolgreiche Hochladen von Symbolen hilfreich sein.

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 im Dashboard nicht symbolisierte Abstürze angezeigt werden

Option : Laden Sie Symbole für Nicht-Gradle-Builds oder unzugängliche, nicht entfernte native Bibliotheken hoch

Diese Option kann in den folgenden Situationen hilfreich sein:

  • Wenn Sie einen anderen Build-Prozess als Gradle verwenden

  • Wenn Ihnen Ihre nicht entfernten nativen Bibliotheken auf eine Weise zur Verfügung gestellt werden, auf die Sie während Gradle-Builds nicht zugreifen können