Erste Schritte mit Crashlytics für Android NDK

Plattform auswählen: iOS+ Android Android NDK Flutter Unity


Wenn Sie native Bibliotheken in Ihrer Android-App verwenden, können Sie mit ein paar kleinen Änderungen an der Build-Konfiguration Ihrer App vollständige Stacktraces und detaillierte Absturzberichte für Ihren nativen Code aus Firebase Crashlytics aktivieren.

In diesem Leitfaden wird beschrieben, wie Sie die Absturzberichte mit dem Firebase Crashlytics SDK für NDK konfigurieren.

Wenn Sie wissen möchten, wie Sie Crashlytics in Ihren Unity-Projekten verwenden, lesen Sie den Startleitfaden für Unity.

Hinweis

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

  2. Empfohlen: Wenn Sie automatisch Navigationspfad-Logs erhalten möchten, um die Nutzeraktionen zu verstehen, die zu einem Absturz, einem nicht schwerwiegenden Fehler oder einem ANR-Ereignis geführt haben, müssen Sie Google Analytics in Ihrem Firebase-Projekt aktivieren.

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

    • Wenn Sie ein vorhandenes Firebase-Projekt verwenden, für das Google Analytics nicht aktiviert ist, können Sie es in der Firebase Console auf der Seite Einstellungen > Integrationen aktivieren.

  3. 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: Crashlytics SDK für NDK zu Ihrer App hinzufügen

Fügen Sie in der Gradle-Datei Ihres Moduls (auf App-Ebene) (normalerweise <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 Bibliotheksversionierung zu steuern.

Für eine optimale Nutzung von Crashlytics empfehlen wir, Google Analytics in Ihrem Firebase-Projekt zu aktivieren und das Firebase SDK für Google Analytics in Ihre App einzubinden.

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

    // 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 Verwendung der BoM hinzufügen

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

Wenn Sie mehrere Firebase-Bibliotheken in Ihrer App verwenden, empfehlen wir dringend, die BoM zur Verwaltung der Bibliotheksversionen zu verwenden. 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:21.0.0")
    implementation("com.google.firebase:firebase-analytics:24.0.0")
}

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) das Gradle-Plug-in Crashlytics zum Block plugins 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.5.0" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "3.0.8" 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.5.0' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '3.0.8' apply false
    }
  2. Fügen Sie in der Gradle-Datei Ihres Moduls (auf App-Ebene) (normalerweise <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 Ihres Moduls (auf App-Ebene) (normalerweise <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: Automatisches Hochladen nativer Symbole einrichten

Damit lesbare Stacktraces von 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 uploadCrashlyticsSymbolFileBUILD_VARIANT-Aufgabe, um diesen Prozess zu automatisieren.

  1. Damit Sie auf die Aufgabe für das automatische Hochladen von Symbolen zugreifen können, muss nativeSymbolUploadEnabled in der Gradle-Datei Ihres Moduls (auf App-Ebene) auf true gesetzt sein.

  2. Damit Methodennamen in Ihren Stacktraces angezeigt werden, müssen Sie die Aufgabe uploadCrashlyticsSymbolFileBUILD_VARIANT nach jedem Build Ihrer NDK-Bibliothek explizit aufrufen. Beispiel:

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
  3. Sowohl das Crashlytics SDK für NDK als auch das Crashlytics Gradle-Plug-in sind davon abhängig, dass die GNU-Build-ID in den nativen freigegebenen Objekten vorhanden ist.

    Sie können das Vorhandensein dieser ID prüfen, indem Sie readelf -n für jede Binärdatei 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 erste Daten im Crashlytics-Dashboard der Firebase Console 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.

    Sie können den folgenden Code in der MainActivity-Datei Ihrer App verwenden, um Ihrer App eine Schaltfläche hinzuzufügen, die bei Betätigung einen Absturz verursacht. Die Schaltfläche ist mit „Test Crash“ beschriftet.

    Kotlin

    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 die App auf Ihrem Testgerät oder Emulator.

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

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

  4. Rufen Sie in der Firebase-Konsole das Dashboard DevOps & Engagement > Crashlytics auf, um nach dem Testabsturzbericht zu suchen.

    Wenn Sie die Konsole aktualisiert haben und der Testabsturz nach fünf Minuten immer noch nicht angezeigt wird, aktivieren Sie das Debugging-Logging, um zu sehen, ob Ihre App Absturzberichte sendet.


Das wars auch schon. Crashlytics überwacht Ihre App jetzt auf Abstürze. Sie können Absturzberichte und ‑statistiken im Crashlytics-Dashboard ansehen und untersuchen.

Nächste Schritte

  • (Empfohlen) Holen Sie sich Hilfe beim Debuggen von Abstürzen, die durch native Speicherfehler verursacht wurden, indem Sie GWP-ASan-Berichte erfassen. Diese speicherbezogenen Fehler können mit Speicherschäden in deiner App zusammenhängen, die die Hauptursache für Sicherheitslücken in Apps sind. Damit Sie diese Debugging-Funktion nutzen können, muss GWP-ASan in Ihrer App explizit aktiviert sein und das neueste Crashlytics SDK für NDK (Version 18.3.6 oder höher oder Firebase BoM Version 31.3.0 oder höher) verwendet werden.

  • Absturzberichte anpassen, indem Sie die Berichterstellung per Opt-in, Logs, Schlüssel und das Tracking 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. So können Sie Ihr Dashboard besser auf bestimmte Builds ausrichten.

Fehlerbehebung

Wenn Sie in der Firebase-Konsole und in Logcat unterschiedliche Stacktraces sehen, lesen Sie den Leitfaden zur Fehlerbehebung.



Alternative Optionen zum Hochladen von Symbolen

Der oben beschriebene Hauptworkflow 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 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 einen benutzerdefinierten NDK-Build-Prozess in Gradle verwenden
  • Wenn deine nativen Bibliotheken in einem Bibliotheks-/Funktionsmodul erstellt oder von einem Drittanbieter bereitgestellt werden
  • Wenn die Aufgabe zum automatischen Hochladen von Symbolen fehlschlägt oder im Crashlytics-Dashboard nicht symbolisierte Abstürze angezeigt werden,

Option: Symbole für Nicht-Gradle-Builds oder nicht zugängliche, nicht entfernte native Bibliotheken hochladen

Diese Option kann in folgenden Situationen hilfreich sein:

  • Wenn Sie einen anderen Build-Prozess als Gradle verwenden

  • Wenn Ihre nicht entfernten nativen Bibliotheken so bereitgestellt werden, dass sie während Gradle-Builds nicht zugänglich sind