Catch up on highlights from Firebase at Google I/O 2023. Learn more

Obtenez des rapports de plantage Android NDK

Si votre application Android contient des bibliothèques natives , vous pouvez activer les traces complètes de la pile et les rapports d'erreur détaillés pour votre code natif à partir de Firebase Crashlytics avec quelques petites mises à jour de la configuration de construction de votre application.

Ce guide décrit comment configurer les rapports d'incident avec le SDK Firebase Crashlytics pour NDK.

Si vous cherchez comment démarrer avec Crashlytics dans vos projets Unity, consultez le guide de démarrage Unity .

Avant que tu commences

  1. Si vous ne l'avez pas déjà fait, ajoutez Firebase à votre projet Android. Si vous n'avez pas d'application Android, vous pouvez télécharger un exemple d'application .

  2. Recommandé : pour obtenir des fonctionnalités telles que des utilisateurs sans plantage, des journaux de fil d'Ariane et des alertes de vélocité, vous devez activer Google Analytics dans votre projet Firebase.

    • Si Google Analytics n'est pas activé pour votre projet Firebase existant, vous pouvez activer Google Analytics à partir de l' onglet Intégrations de vos > Paramètres du projet dans la console Firebase.

    • Si vous créez un nouveau projet Firebase, activez Google Analytics lors du workflow de création de projet.

Étape 1 : Ajoutez le SDK Crashlytics pour NDK à votre application

Dans le fichier Gradle de votre module (au niveau de l'application) (généralement <project>/<app-module>/build.gradle.kts ou <project>/<app-module>/build.gradle ), ajoutez la dépendance pour le Crashlytics NDK Bibliothèque Android. Nous vous recommandons d'utiliser Firebase Android BoM pour contrôler la gestion des versions de la bibliothèque.

Pour une expérience optimale avec Crashlytics, nous vous recommandons d'activer Google Analytics dans votre projet Firebase et d'ajouter le SDK Firebase pour Google Analytics à votre application.

Kotlin+KTX

dependencies {
    // Import the BoM for the Firebase platform
    implementation(platform("com.google.firebase:firebase-bom:32.3.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-ktx")
}

En utilisant Firebase Android BoM , votre application utilisera toujours des versions compatibles des bibliothèques Firebase Android.

(Alternative) Ajouter des dépendances à la bibliothèque Firebase sans utiliser le BoM

Si vous choisissez de ne pas utiliser la nomenclature Firebase, vous devez spécifier chaque version de la bibliothèque Firebase dans sa ligne de dépendance.

Notez que si vous utilisez plusieurs bibliothèques Firebase dans votre application, nous vous recommandons vivement d'utiliser la BoM pour gérer les versions de bibliothèque, ce qui garantit que toutes les versions sont compatibles.

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.4.3")
    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.3.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")
}

En utilisant Firebase Android BoM , votre application utilisera toujours des versions compatibles des bibliothèques Firebase Android.

(Alternative) Ajouter des dépendances à la bibliothèque Firebase sans utiliser le BoM

Si vous choisissez de ne pas utiliser la nomenclature Firebase, vous devez spécifier chaque version de la bibliothèque Firebase dans sa ligne de dépendance.

Notez que si vous utilisez plusieurs bibliothèques Firebase dans votre application, nous vous recommandons vivement d'utiliser la BoM pour gérer les versions de bibliothèque, ce qui garantit que toutes les versions sont compatibles.

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.4.3")
    implementation("com.google.firebase:firebase-analytics:21.3.0")
}

Étape 2 : Ajoutez le plugin Crashlytics Gradle à votre application

  1. Dans votre fichier Gradle de niveau racine (au niveau du projet) ( <project>/build.gradle.kts ou <project>/build.gradle ), ajoutez le plug-in Crashlytics Gradle au bloc plugins :

    Kotlin

    plugins {
        id("com.android.application") version "7.2.0" apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin dependency
        id("com.google.gms.google-services") version "4.3.15" 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.2.0' apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin dependency
        id 'com.google.gms.google-services' version '4.3.15' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '2.9.9' apply false
    }
    
  2. Dans le fichier Gradle de votre module (au niveau de l'application) (généralement <project>/<app-module>/build.gradle.kts ou <project>/<app-module>/build.gradle ), ajoutez le plug-in Crashlytics Gradle :

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

Étape 3 : Ajoutez l'extension Crashlytics à votre build

Dans le fichier Gradle de votre module (au niveau de l'application) (généralement <project>/<app-module>/build.gradle.kts ou <project>/<app-module>/build.gradle ), configurez l'extension Crashlytics.

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

Étape 4 : Configurer le téléchargement automatique des symboles natifs

Pour produire des traces de pile lisibles à partir des plantages NDK, Crashlytics doit connaître les symboles de vos binaires natifs. Le plugin Crashlytics Gradle inclut la tâche uploadCrashlyticsSymbolFile BUILD_VARIANT pour automatiser ce processus.

  1. Afin que vous puissiez accéder à la tâche de téléchargement automatisé de symboles, assurez-vous que nativeSymbolUploadEnabled est défini sur true dans le fichier Gradle de votre module (au niveau de l'application).

  2. Pour que les noms de méthode apparaissent dans vos traces de pile, vous devez appeler explicitement la tâche uploadCrashlyticsSymbolFile BUILD_VARIANT après chaque génération de votre bibliothèque NDK. Par exemple:

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    
  3. Le SDK Crashlytics pour NDK et le plugin Crashlytics Gradle dépendent de la présence de l'ID de build GNU dans les objets partagés natifs.

    Vous pouvez vérifier la présence de cet ID en exécutant readelf -n sur chaque binaire. Si l'ID de construction est absent, ajoutez -Wl,--build-id aux drapeaux de votre système de construction pour résoudre le problème.

Étape 5 : Forcer un plantage de test pour terminer la configuration

Pour terminer la configuration de Crashlytics et afficher les données initiales dans le tableau de bord Crashlytics de la console Firebase, vous devez forcer un plantage de test.

  1. Ajoutez du code à votre application que vous pouvez utiliser pour forcer un plantage de test.

    Vous pouvez utiliser le code suivant dans MainActivity de votre application pour ajouter un bouton à votre application qui, lorsqu'il est enfoncé, provoque un blocage. Le bouton est étiqueté "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. Créez et exécutez votre application.

  3. Forcez le plantage du test afin d'envoyer le premier rapport de plantage de votre application :

    1. Ouvrez votre application à partir de votre appareil de test ou de votre émulateur.

    2. Dans votre application, appuyez sur le bouton "Test Crash" que vous avez ajouté à l'aide du code ci-dessus.

    3. Après le plantage de votre application, redémarrez-la afin que votre application puisse envoyer le rapport de plantage à Firebase.

  4. Accédez au tableau de bord Crashlytics de la console Firebase pour voir votre plantage de test.

    Si vous avez actualisé la console et que vous ne voyez toujours pas le plantage du test après cinq minutes, activez la journalisation de débogage pour voir si votre application envoie des rapports de plantage.


Et c'est tout! Crashlytics surveille désormais votre application pour détecter les plantages, et vous pouvez afficher et étudier les rapports et les statistiques sur les plantages dans le tableau de bord Crashlytics.

Prochaines étapes

  • (Recommandé) Obtenez de l'aide pour déboguer les plantages causés par des erreurs de mémoire native en collectant les rapports GWP-ASan . Ces erreurs liées à la mémoire peuvent être associées à une corruption de la mémoire au sein de votre application, qui est la principale cause de vulnérabilités de sécurité des applications. Pour tirer parti de cette fonctionnalité de débogage, assurez-vous que votre application a explicitement activé GWP-ASan et utilise le dernier SDK Crashlytics pour NDK (v18.3.6+ ou Firebase BoM v31.3.0+).

  • Personnalisez la configuration de votre rapport d'incident en ajoutant des rapports d'activation, des journaux, des clés et un suivi des erreurs non fatales.

  • Intégrez Google Play afin de pouvoir filtrer les rapports de plantage de votre application Android par suivi Google Play directement dans le tableau de bord Crashlytics. Cela vous permet de mieux concentrer votre tableau de bord sur des builds spécifiques.

Dépannage

Si vous voyez des traces de pile différentes dans la console Firebase et dans le logcat, reportez-vous au guide de dépannage .



Options alternatives pour télécharger des symboles

Le flux de travail principal sur cette page ci-dessus s'applique aux versions standard de Gradle. Cependant, certaines applications utilisent une configuration ou des outils différents (par exemple, un processus de génération autre que Gradle). Dans ces situations, les options suivantes peuvent être utiles pour télécharger avec succès des symboles.

Option : Télécharger des symboles pour les modules de bibliothèque et les dépendances externes

Cette option peut être utile dans les situations suivantes :

  • Si vous utilisez un processus de construction NDK personnalisé dans Gradle
  • Si vos bibliothèques natives sont intégrées dans un module de bibliothèque/de fonctionnalité ou fournies par un tiers
  • Si la tâche de téléchargement automatique de symboles échoue ou si vous constatez des plantages non symbolisés dans le tableau de bord

Option : Télécharger des symboles pour les versions non-Gradle ou les bibliothèques natives non dépouillées inaccessibles

Cette option peut être utile dans les situations suivantes :

  • Si vous utilisez un processus de construction autre que Gradle

  • Si vos bibliothèques natives non dépouillées vous sont fournies d'une manière telle qu'elles ne sont pas accessibles pendant les versions Gradle