Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Obtén informes de fallas del NDK de Android

Si tu app para Android contiene bibliotecas nativas, puedes habilitar los seguimientos de pila completa y los informes de fallas detallados para tu código nativo desde Firebase Crashlytics con solo hacer unas pequeñas actualizaciones en la configuración de compilación de tu app. En esta guía se describe cómo configurar los informes de fallas con el nuevo SDK de Firebase Crashlytics.

Antes de comenzar

  1. Para comenzar, configura Crashlytics.

  2. Como parte del paso 2 (agrega Firebase Crashlytics a tu app), asegúrate de que tu app use la versión 2.4.0 (o una posterior) del complemento de Crashlytics para Gradle, que te permite subir símbolos usando solo tus objetos binarios sin eliminar a fin de generar fallas simbolizadas.

Paso 1: Actualiza la configuración de Gradle

En el archivo build.gradle de nivel de la app, declara la dependencia del entorno de ejecución del NDK de Crashlytics:

Java

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
  // ...

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

  // Declare the dependency for the Firebase Crashlytics NDK library.
  // If you previously declared the Firebase Crashlytics dependency, replace it.
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation 'com.google.firebase:firebase-crashlytics'
  implementation 'com.google.firebase:firebase-crashlytics-ndk'
  implementation 'com.google.firebase:firebase-analytics'
}

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

Si usas la BoM de Firebase para Android, tu app siempre utilizará versiones compatibles de las bibliotecas de Firebase para Android.

Como alternativa, puedes declarar las dependencias de la biblioteca de Firebase sin usar la BoM.

Si eliges no usar la BoM de Firebase, debes especificar cada versión de la biblioteca de Firebase en su línea de dependencia.

Ten en cuenta que, si usas varias bibliotecas de Firebase en tu app, te recomendamos que utilices la BoM para administrar las versiones de las bibliotecas, lo que garantiza que todas las versiones sean compatibles.

  dependencies {
      // Declare the dependency for the Firebase Crashlytics NDK library.
      // If you previously declared the Firebase Crashlytics dependency, replace it.
      // When NOT using the BoM, you must specify versions in Firebase library dependencies
      implementation 'com.google.firebase:firebase-crashlytics:17.4.1'
      implementation 'com.google.firebase:firebase-crashlytics-ndk:17.4.1'
      implementation 'com.google.firebase:firebase-analytics:18.0.2'
  }
  

Kotlin+KTX

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
  // ...

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

  // Declare the dependency for the Firebase Crashlytics NDK library.
  // If you previously declared the Firebase Crashlytics dependency, replace it.
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation 'com.google.firebase:firebase-crashlytics-ktx'
  implementation 'com.google.firebase:firebase-crashlytics-ndk'
  implementation 'com.google.firebase:firebase-analytics-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
          }
      }
  }
}

Si usas la BoM de Firebase para Android, tu app siempre utilizará versiones compatibles de las bibliotecas de Firebase para Android.

Como alternativa, puedes declarar las dependencias de la biblioteca de Firebase sin usar la BoM.

Si eliges no usar la BoM de Firebase, debes especificar cada versión de la biblioteca de Firebase en su línea de dependencia.

Ten en cuenta que, si usas varias bibliotecas de Firebase en tu app, te recomendamos que utilices la BoM para administrar las versiones de las bibliotecas, lo que garantiza que todas las versiones sean compatibles.

  dependencies {
      // Declare the dependency for the Firebase Crashlytics NDK library.
      // If you previously declared the Firebase Crashlytics dependency, replace it.
      // When NOT using the BoM, you must specify versions in Firebase library dependencies
      implementation 'com.google.firebase:firebase-crashlytics-ktx:17.4.1'
      implementation 'com.google.firebase:firebase-crashlytics-ndk:17.4.1'
      implementation 'com.google.firebase:firebase-analytics-ktx:18.0.2'
  }
  

Obligatorio para la versión 17.3.0 del NDK de Crashlytics: Si tu aplicación usa targetSdkLevel 30 o posterior, también debes inhabilitar la función de etiquetado de punteros en la app agregando lo siguiente a tu AndroidManifest.xml:

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

Si necesitas más información, consulta la asistencia para desarrolladores sobre punteros etiquetados.

Paso 2: Habilita la carga de símbolos nativos

Para producir seguimientos de pila legibles de las fallas del NDK, Crashlytics debe conocer los símbolos de tus objetos binarios nativos. Nuestro complemento de Gradle incluye la tarea uploadCrashlyticsSymbolFileBUILD_VARIANT a fin de automatizar este proceso (para acceder a esta tarea, asegúrate de que nativeSymbolUploadEnabled esté configurado como verdadero).

Para que los nombres de los métodos aparezcan en los seguimientos de pila, debes invocar de manera explícita la tarea uploadCrashlyticsSymbolFileBUILD_VARIANT después de cada compilación de la biblioteca del NDK. Por ejemplo:

>./gradlew app:assembleBUILD_VARIANT\
           app:uploadCrashlyticsSymbolFileBUILD_VARIANT

El NDK de Crashlytics v17.3.0 o versiones posteriores y el complemento de Gradle v2.4.1 o versiones posteriores dependen de la presencia del ID de compilación de GNU dentro de los objetos compartidos nativos. Puedes verificar la presencia de este ID ejecutando readelf -n en cada objeto binario. Si no aparece el ID de compilación, agrega -Wl,--build-id a las marcas del sistema de compilación para solucionar el problema.

Paso 3 (opcional): Sube símbolos para dependencias externas

Nuestra tarea de carga de símbolos supone que compilas tus bibliotecas nativas como parte de la compilación de Gradle con herramientas de compilación estándares del NDK, como CMake. Si tienes bibliotecas nativas compiladas externamente o usas un proceso de compilación personalizado del NDK en Gradle, es posible que debas especificar de forma explícita la ruta de acceso a tus bibliotecas no eliminadas. Para ello, la extensión firebaseCrashlytics proporciona la propiedad unstrippedNativeLibsDir.

// …
android {
    // ...
    buildTypes {
        release {
            firebaseCrashlytics {
                nativeSymbolUploadEnabled true
                unstrippedNativeLibsDir ‘path/to/unstripped/parent/dir’
            }
        }
    }
}

Nuestro complemento supone que las bibliotecas se ubican en subdirectorios específicos de la arquitectura en el directorio especificado. En el siguiente ejemplo, los subdirectorios x86 y arm64 contienen las bibliotecas libfoo.so y libbar.so.

unstrippedNativeLibsDir/
 +- x86/
      |
      +- libfoo.so
      +- libbar.so
 +- arm64/
      |
      +- libfoo.so
      +- libbar.so

Si tu sistema de compilación no cumple con el esquema de estructura o nombre anterior, crea esta estructura manualmente en tu disco local antes de invocar la tarea uploadCrashlyticsSymbolFileBUILD_VARIANT.

Paso 4 (opcional): Personaliza los informes de fallas del NDK

De manera opcional, puedes incluir el encabezado crashlytics.h en tu código de C++ para agregar metadatos a los informes de fallas del NDK, como registros, ID de usuarios y claves personalizadas. crashlytics.h está disponible como una biblioteca C++ de solo encabezado en el repositorio de GitHub del SDK de Firebase Android. Lee los comentarios del archivo de encabezado para obtener instrucciones sobre el uso de las API de C++ del NDK.

Paso 5: Consulta tus informes de fallas

Verifica que Crashlytics informe adecuadamente las fallas del NDK. Para ello, compila tu app, sube los símbolos y fuerza una falla por error en código nativo. Deberás reiniciar la app después de la falla a fin de que Crashlytics envíe el informe. En pocos minutos, la falla debería aparecer en Firebase console.

Soluciona problemas

Si ves diferentes seguimientos de pila en Firebase console y en logcat, consulta la guía para solucionar problemas.