Recevoir des rapports d'erreur du NDK Android

Si votre application Android contient des bibliothèques natives : Vous pouvez activer les traces de la pile complète et les rapports d'erreur détaillés pour votre code natif à partir de Firebase Crashlytics en apportant quelques petites mises à jour au build de votre application configuration.

Ce guide explique comment configurer les rapports d'erreur à l'aide de l'API SDK Firebase Crashlytics pour NDK

Si vous cherchez à vous familiariser avec Crashlytics dans Unity projets, consultez les Guide de démarrage Unity

Avant de commencer

  1. Si ce n'est pas encore fait, ajoutez Firebase à votre projet Android. Si vous n'avez pas d'application Android, vous pouvez télécharger Une application exemple

  2. Recommandé: Pour obtenir automatiquement journaux de fil d'Ariane pour comprendre les actions des utilisateurs ayant entraîné un plantage, une erreur non fatale ou une erreur ANR, vous devez activer Google Analytics dans votre projet Firebase.

    • Si votre projet Firebase existant ne comporte pas de ressources Google Analytics vous pouvez activer Google Analytics depuis la Intégrations de votre > Paramètres du projet dans la console Firebase.

    • Si vous créez un projet Firebase, activez Google Analytics pendant le workflow de création de projet.

  3. Assurez-vous que votre application dispose des versions minimales suivantes:

    • Gradle 8.0
    • Plug-in Android Gradle 8.1.0
    • Plug-in Gradle des services Google 4.4.1

É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 la bibliothèque NDK Crashlytics pour Android. Nous vous recommandons d'utiliser Firebase Android BoM pour contrôler la gestion des versions des bibliothèques.

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

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

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

(Alternative) Ajouter des dépendances de la bibliothèque Firebase sans utiliser l'BoM

Si vous choisissez de ne pas utiliser Firebase BoM, 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, recommandent d'utiliser BoM pour gérer les versions de la 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:19.0.3")
    implementation("com.google.firebase:firebase-analytics:22.1.0")
}
Vous recherchez un module de bibliothèque spécifique à Kotlin ? Début dans Octobre 2023 (Firebase BoM 32.5.0), les développeurs Kotlin et Java peuvent dépendent du module de bibliothèque principal (pour en savoir plus, consultez Questions fréquentes sur cette initiative).

Étape 2: Ajoutez le plug-in Gradle Crashlytics à votre application

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

    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. 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 Gradle Crashlytics:

    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 : Ajouter 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: Configurez l'importation automatique de symboles natifs

Pour produire des traces de pile lisibles à partir de plantages du NDK, Crashlytics doit connaître sur les symboles de vos binaires natifs. Plug-in Gradle Crashlytics inclut l'élément uploadCrashlyticsSymbolFileBUILD_VARIANT pour automatiser ce processus.

  1. Pour pouvoir accéder à la tâche d'importation automatique des symboles, assurez-vous que nativeSymbolUploadEnabled est défini sur true dans votre module (au niveau de l'application) ; Gradle.

  2. Pour que les noms des méthodes apparaissent dans les traces de la pile, vous devez appeler explicitement le uploadCrashlyticsSymbolFileBUILD_VARIANT après chaque compilation de votre bibliothèque NDK. Exemple :

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
  3. Le SDK Crashlytics pour le NDK et le plug-in Gradle Crashlytics dépend 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 build est absente, ajoutez -Wl,--build-id au fichier pour résoudre le problème.

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

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

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

    Vous pouvez utiliser le code suivant dans le fichier MainActivity de votre application pour ajouter un bouton à votre application qui, si vous appuyez dessus, provoque un plantage. Le bouton est étiqueté "Tester le plantage".

    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 de test afin d'envoyer le premier rapport de plantage de votre application :

    1. Ouvrez votre application depuis votre appareil de test ou votre émulateur.

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

    3. Après un plantage, redémarrez-la pour qu'elle puisse envoyer le plantage dans Firebase.

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

    Si vous avez actualisé la console et que le plantage du test ne s'affiche toujours pas après cinq minutes, Activer la journalisation du débogage pour voir si votre appli envoie des rapports d'erreur.


Et voilà ! Crashlytics surveille désormais votre application pour détecter les plantages, et vous pouvez consulter et analyser les rapports d'erreur et les statistiques dans le Tableau de bord Crashlytics.

Étapes suivantes

  • (Recommandé) Obtenez de l'aide pour déboguer les plantages causés par des erreurs de mémoire native en collecter Rapports GWP-ASan Ces erreurs liées à la mémoire peuvent être associées à une corruption de la mémoire dans votre application, qui est la principale cause de failles de sécurité des applications. Pour profiter de cette fonctionnalité de débogage, assurez-vous que votre application a GWP-ASan est explicitement activé et utilise le dernier SDK Crashlytics pour NDK (version 18.3.6+ ou ultérieure Firebase BoM v31.3.0+).

  • Personnalisez la configuration des rapports d'erreur en ajoutant des rapports, des journaux, des clés et un suivi des erreurs non fatales.

  • Procédez à l'intégration avec Google Play pour que Vous pouvez filtrer les rapports d'erreur de votre application Android à l'aide du suivi Google Play directement dans le Crashlytics. Vous pouvez ainsi 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 Logcat, consultez le guide de dépannage.



Autres options pour importer des symboles

Le workflow principal de cette page ci-dessus s'applique aux builds Gradle standards. Cependant, certaines applications utilisent une configuration ou des outils différents (par exemple, un build autre que Gradle). Dans ces situations, les options suivantes peuvent vous aider à importer des symboles.

Option: importer 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 compilation NDK personnalisé dans Gradle
  • Si vos bibliothèques natives sont compilées dans un module de bibliothèque/fonction ou fournies par un tiers
  • Si la tâche d'importation automatique des symboles ou que vous constatez des plantages non symbolisés dans le tableau de bord

Option: importer des symboles pour des builds non-Gradle ou des bibliothèques natives complètes inaccessibles

Cette option peut être utile dans les situations suivantes:

  • Si vous utilisez un processus de compilation autre que Gradle

  • Si vos bibliothèques natives complètes vous sont fournies d'une manière qui ils ne sont pas accessibles pendant les compilations Gradle