Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Obtenez des rapports de plantage Android NDK

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

Ce guide explique comment configurer les rapports de plantage avec le SDK Firebase Crashlytics pour NDK.

Avant que tu commences

  1. Si vous avez pas déjà, ajoutez Firebase à votre projet Android. Si vous ne disposez pas d' une application Android, vous pouvez télécharger une application de l' échantillon .

  2. Recommandé: Pour obtenir des fonctionnalités comme les utilisateurs sans accident, les journaux panés et les alertes de vitesse, vous devez activer Google Analytics dans votre projet Firebase.

    • Si votre projet Firebase existant ne pas Google Analytics activé, 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 pendant le workflow de création de projet.

  3. Assurez - vous que vous avez cliqué sur le bouton Activer Crashlytics pour votre application dans le tableau de bord Crashlytics de la console Firebase.

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

Utilisation de la Firebase Android BoM , déclarer la dépendance de la bibliothèque Crashlytics NDK Android dans votre module (app-niveau) de fichier Gradle (généralement app/build.gradle ).

Pour une expérience optimale avec Crashlytics, nous vous recommandons de permettre à Google Analytics dans votre projet Firebase et en ajoutant le SDK Firebase Google Analytics à votre application.

Java

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

    // Declare 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 le Firebase Android BoM , votre application utilise toujours des versions compatibles des bibliothèques Firebase Android.

(Alternative) déclarer des dépendances de bibliothèque firebase sans utiliser la nomenclature

Si vous choisissez de ne pas utiliser la nomenclature de 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 fortement d' utiliser la BoM pour gérer les versions bibliothèque, ce qui garantit que toutes les versions sont compatibles.

dependencies {
    // Declare 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.2.3'
    implementation 'com.google.firebase:firebase-analytics:19.0.2'
}

Kotlin+KTX

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

    // Declare 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 le Firebase Android BoM , votre application utilise toujours des versions compatibles des bibliothèques Firebase Android.

(Alternative) déclarer des dépendances de bibliothèque firebase sans utiliser la nomenclature

Si vous choisissez de ne pas utiliser la nomenclature de 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 fortement d' utiliser la BoM pour gérer les versions bibliothèque, ce qui garantit que toutes les versions sont compatibles.

dependencies {
    // Declare 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.2.3'
    implementation 'com.google.firebase:firebase-analytics-ktx:19.0.2'
}

Étape 2: Ajouter le plugin Firebase Crashlytics à votre application

  1. Dans votre niveau de projet build.gradle fichier, ajoutez le plugin Crashlytics Gradle en tant que dépendance de buildscript.

    buildscript {
        repositories {
            // Check that you have Google's Maven repository (if not, add it).
            google()
        }
    
        dependencies {
            // ...
    
            // Check that you have the Google services Gradle plugin v4.3.2 or later
            // (if not, add it).
            classpath 'com.google.gms:google-services:4.3.10'
    
            // Add the Crashlytics Gradle plugin
            classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
        }
    }
    
    allprojects {
        repositories {
            // Check that you have Google's Maven repository (if not, add it).
            google()
        }
    }
  2. Dans votre niveau d'application build.gradle fichier, appliquez le plugin Crashlytics Gradle:

    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services' // Google services Gradle plugin
    
    // Apply the Crashlytics Gradle plugin
    apply plugin: 'com.google.firebase.crashlytics'
    

Étape 3: Ajouter la firebaseCrashlytics extension à votre construction

Dans votre module (app-niveau) de fichier Gradle (généralement app/build.gradle ), ajoutez le firebaseCrashlytics l' extension.

Java

// ...

android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Crashlytics 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
          }
      }
  }
}

Kotlin+KTX

// ...

android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Crashlytics 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
          }
      }
  }
}

Requis pour targetSdkLevel 30 et ci - dessus: Vous devez désactiver Tagging pointeur dans votre application en ajoutant ce qui suit à votre AndroidManifest.xml :

<application android:allowNativeHeapPointerTagging="false">
...
</application>

Pour plus d' informations, consultez le soutien du développeur pour Tagged Pointeurs .

Étape 4: Mettre en place votre projet pour télécharger des symboles natifs à temps la construction

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

  1. Pour que vous puissiez accéder à cette tâche, assurez - vous que nativeSymbolUploadEnabled est définie sur true dans votre module (niveau d'application) de fichier Gradle.

  2. Pour les noms de méthodes apparaissent dans vos traces de pile, vous devez appeler explicitement la uploadCrashlyticsSymbolFile BUILD_VARIANT tâche après chaque version 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.

Etape 5 (facultatif): Ajouter des symboles pour les modules de bibliothèque et des dépendances externes

La tâche de téléchargement de symboles Crashlytics suppose que vous créez vos bibliothèques natives dans le cadre de la génération Gradle de votre module d'application, à l'aide d'outils de génération NDK standard tels que CMake.

Cependant, si vous utilisez un processus de construction NDK personnalisé dans Gradle, ou si vos bibliothèques natives sont construites dans un module de bibliothèque/fonctionnalité ou fournies par un tiers, vous devrez peut-être spécifier explicitement le chemin d'accès à vos bibliothèques non supprimées. La firebaseCrashlytics extension fournit la propriété unstrippedNativeLibsDir pour le faire.

Ajouter ce qui suit à votre module (app-niveau) build.gradle fichier:

// ...

android {
    // ...
    buildTypes {
        release {
            firebaseCrashlytics {
                nativeSymbolUploadEnabled true
                unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY")
            }
        }
    }
}

Le plugin Crashlytics recherchera dans le répertoire spécifié et tous ses sous - répertoires pour les bibliothèques natives avec .so l' extension. Crashlytics extrait ensuite les symboles de débogage de toutes ces bibliothèques et les télécharge sur les serveurs Firebase.

Notez les points suivants au sujet de la unstrippedNativeLibsDir propriété:

  • Vous pouvez spécifier un argument admissible pour les org.gradle.api.Project#files(Object...) , y compris: java.lang.String , java.io.File ou org.gradle.api.file.FileCollection .

  • Vous pouvez spécifier plusieurs répertoires pour une version unique saveur en fournissant une liste ou FileCollection instance.

Étape 6 (optionnel): fichier de symboles Breakpad pour symbolication

Le plug-in Crashlytics Gradle fournit les fonctionnalités suivantes :

  • Traite vos binaires natifs non dépouillés pour générer des fichiers de symboles.
  • Télécharge les fichiers de symboles générés sur nos serveurs pour être utilisés plus tard lors de la symbolisation des plantages natifs.

Le plugin Crashlytics Gradle prend en charge deux types de formats de fichiers de symboles :
le fichier symbole Crashlytics (cSYM) et le Breakpad fichier symbole.

Un fichier de symboles généré par Breakpad contient plus d'informations qu'un fichier de symboles généré par Crashlytics, y compris les informations de trame d'appel (CFI) qui sont utilisées dans le processus de déroulement pour aider à calculer les trames de pile. L'utilisation de CFI se traduira par des traces de pile plus fidèles, en particulier pour les applications hautement optimisées telles que les jeux et les applications multimédias.

Vous pouvez activer l'utilisation du générateur de fichiers de symboles basé sur Breakpad de l'une des deux manières suivantes :

  • Option 1: Activer par l' firebaseCrashlytics extension dans votre build.gradle fichier

    Ajouter ce qui suit à votre niveau d'application build.gradle fichier:

    android {
      // ...
      buildTypes {
        // ...
        release {
          // ...
          firebaseCrashlytics {
            // existing; required for either symbol file generator
            nativeSymbolUploadEnabled true
            // Add this optional new block to specify breakpad() or csym()
            symbolGenerator {
               breakpad()
            }
          }
        }
      }
    }
    

    Pour revenir au générateur de fichiers de symboles Crashlytics par défaut, vous pouvez effectuer l'une des opérations suivantes :

    • Omettre le symbolGenerator entièrement bloc, comme le plug - in utilise le générateur de fichier symbole Crashlytics par défaut.

    • Gardez le bloc, mais le changement breakpad() à csym() .

  • Option 2: Activer via une ligne de propriété dans votre fichier propriétés Gradle

    Vous pouvez utiliser la com.google.firebase.crashlytics.symbolGenerator propriété de contrôle qui générateur de fichier de symboles à utiliser. Les valeurs valides pour la propriété sont breakpad ou csym . Si non spécifié, la valeur par défaut actuelle équivaut à csym , bien que cela puisse changer dans les versions futures.

    Vous pouvez mettre à jour manuellement votre fichier de propriétés Gradle ou mettre à jour le fichier via la ligne de commande. Par exemple, pour activer le générateur de fichier symbole Breakpad, indiquez la valeur de breakpad comme indiqué dans la commande suivante:

    ./gradlew -Pcom.google.firebase.crashlytics.symbolGenerator=breakpad \
    app:assembleRelease app:uploadCrashlyticsSymbolFileRelease
    

Étape 7: Voir vos rapports d'erreur

Vérifiez que Crashlytics est correctement signale NDK se bloque par la construction de votre application, symboles téléchargement et forçant un accident natif . Vous devrez redémarrer l'application après son blocage pour que Crashlytics envoie le rapport. Vous devriez voir l'accident dans votre console Firebase en quelques minutes.

Dépannage

Si vous voyez les différentes traces de pile dans la console Firebase et dans le logcat, consultez le Guide de dépannage .

Prochaines étapes