Si su aplicación de Android contiene bibliotecas nativas , puede habilitar seguimientos de pila completos e informes de fallas detallados para su código nativo desde Firebase Crashlytics con algunas pequeñas actualizaciones en la configuración de compilación de su aplicación.
Esta guía describe cómo configurar los informes de fallos con Firebase Crashlytics SDK para NDK.
Si está buscando cómo comenzar con Crashlytics en sus proyectos de Unity, consulte la guía de introducción a Unity .
Antes de que empieces
Si aún no lo has hecho, agrega Firebase a tu proyecto de Android. Si no tiene una aplicación para Android, puede descargar una aplicación de muestra .
Recomendado : para obtener automáticamente registros de ruta de navegación para comprender las acciones del usuario que conducen a un evento de falla, no fatal o ANR, debe habilitar Google Analytics en su proyecto de Firebase.
Si su proyecto Firebase existente no tiene Google Analytics habilitado, puede habilitar Google Analytics desde la pestaña Integraciones de su
Si estás creando un nuevo proyecto de Firebase, habilita Google Analytics durante el flujo de trabajo de creación del proyecto.
Paso 1 : agregue el SDK de Crashlytics para NDK a su aplicación
En el archivo Gradle de su módulo (nivel de aplicación) (generalmente<project>/<app-module>/build.gradle.kts
o <project>/<app-module>/build.gradle
), agregue la dependencia para Crashlytics NDK biblioteca para Android. Recomendamos utilizar Firebase Android BoM para controlar el control de versiones de la biblioteca.Para una experiencia óptima con Crashlytics, recomendamos habilitar Google Analytics en su proyecto de Firebase y agregar el SDK de Firebase para Google Analytics a su aplicación.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:32.8.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") }
Al usar Firebase Android BoM , su aplicación siempre usará versiones compatibles de las bibliotecas de Firebase Android.
(Alternativa) Agregue dependencias de la biblioteca de Firebase sin usar la BoM
Si elige no utilizar la BoM de Firebase, debe especificar cada versión de la biblioteca de Firebase en su línea de dependencia.
Tenga en cuenta que si usa varias bibliotecas de Firebase en su aplicación, le recomendamos encarecidamente usar la BoM para administrar las versiones de la biblioteca, lo que garantiza que todas las versiones sean 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.6.3") implementation("com.google.firebase:firebase-analytics:21.6.1") }
Paso 2 : agregue el complemento Crashlytics Gradle a su aplicación
En su archivo Gradle de nivel raíz (nivel de proyecto) (
<project>/build.gradle.kts
o<project>/build.gradle
), agregue el complemento Crashlytics Gradle al bloqueplugins
:Kotlin
plugins { id("com.android.application") version "7.3.0" apply false // ... // Make sure that you have the Google services Gradle plugin dependency id("com.google.gms.google-services") version "4.4.1" 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.3.0' apply false // ... // Make sure that you have the Google services Gradle plugin dependency id 'com.google.gms.google-services' version '4.4.1' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '2.9.9' apply false }
En el archivo Gradle de su módulo (nivel de aplicación) (generalmente
<project>/<app-module>/build.gradle.kts
o<project>/<app-module>/build.gradle
), agregue el complemento 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' }
Paso 3 : agrega la extensión Crashlytics a tu compilación
En el archivo Gradle de su módulo (nivel de aplicación) (generalmente <project>/<app-module>/build.gradle.kts
o <project>/<app-module>/build.gradle
), configure la extensión 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 } } } }
Paso 4 : Configura la carga automática de símbolos nativos
Para producir seguimientos de pila legibles a partir de fallas del NDK, Crashlytics necesita conocer los símbolos en sus archivos binarios nativos. El complemento Crashlytics Gradle incluye la tarea uploadCrashlyticsSymbolFile BUILD_VARIANT
para automatizar este proceso.
Para que pueda acceder a la tarea de carga automática de símbolos, asegúrese de que
nativeSymbolUploadEnabled
esté configurado entrue
en el archivo Gradle de su módulo (nivel de aplicación).Para que los nombres de los métodos aparezcan en los seguimientos de la pila, debes invocar explícitamente la tarea
uploadCrashlyticsSymbolFile BUILD_VARIANT
después de cada compilación de tu biblioteca NDK. Por ejemplo:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
Tanto el SDK de Crashlytics para NDK como el complemento Crashlytics Gradle dependen de la presencia del ID de compilación de GNU dentro de los objetos compartidos nativos.
Puede verificar la presencia de esta ID ejecutando
readelf -n
en cada binario. Si el ID de compilación está ausente, agregue-Wl,--build-id
a los indicadores de su sistema de compilación para solucionar el problema.
Paso 5 : fuerce una prueba de bloqueo para finalizar la configuración
Para terminar de configurar Crashlytics y ver los datos iniciales en el panel de Crashlytics de Firebase console, debes forzar una prueba de bloqueo.
Agregue código a su aplicación que pueda usar para forzar una falla de prueba.
Puede usar el siguiente código en
MainActivity
de su aplicación para agregar un botón a su aplicación que, cuando se presiona, provoca un bloqueo. El botón tiene la etiqueta "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));
Cree y ejecute su aplicación.
Fuerza el bloqueo de prueba para enviar el primer informe de bloqueo de tu aplicación:
Abra su aplicación desde su dispositivo de prueba o emulador.
En su aplicación, presione el botón "Probar bloqueo" que agregó usando el código anterior.
Después de que su aplicación falle, reiníciela para que pueda enviar el informe de fallas a Firebase.
Vaya al panel de Crashlytics de Firebase console para ver el fallo de su prueba.
Si actualizó la consola y aún no ve el fallo de prueba después de cinco minutos, habilite el registro de depuración para ver si su aplicación envía informes de fallos.
¡Y eso es! Crashlytics ahora monitorea su aplicación en busca de fallas y usted puede ver e investigar informes y estadísticas de fallas en el panel de Crashlytics.
Próximos pasos
(Recomendado) Obtenga ayuda para depurar fallas causadas por errores de memoria nativa recopilando informes de GWP-ASan . Estos errores relacionados con la memoria pueden estar asociados con daños en la memoria dentro de su aplicación, que es la causa principal de las vulnerabilidades de seguridad de las aplicaciones. Para aprovechar esta función de depuración, asegúrese de que su aplicación tenga GWP-ASan explícitamente habilitado y use el último SDK de Crashlytics para NDK (v18.3.6+ o Firebase BoM v31.3.0+).
Personalice la configuración de su informe de fallos agregando informes, registros, claves y seguimiento de errores no fatales.
Integre con Google Play para que pueda filtrar los informes de fallos de su aplicación de Android por seguimiento de Google Play directamente en el panel de Crashlytics. Esto le permite centrar mejor su panel en compilaciones específicas.
Solución de problemas
Si ves diferentes seguimientos de pila en Firebase console y en logcat, consulta la guía de solución de problemas .
Opciones alternativas para cargar símbolos
El flujo de trabajo principal de esta página anterior se aplica a las compilaciones estándar de Gradle. Sin embargo, algunas aplicaciones utilizan una configuración o herramientas diferentes (por ejemplo, un proceso de compilación distinto de Gradle). En estas situaciones, las siguientes opciones pueden resultar útiles para cargar símbolos correctamente.
Opción : cargar símbolos para módulos de biblioteca y dependencias externas
Esta opción puede resultar útil en las siguientes situaciones:
- Si utiliza un proceso de compilación de NDK personalizado dentro de Gradle
- Si sus bibliotecas nativas están integradas en una biblioteca/módulo de funciones o las proporciona un tercero
- Si la tarea de carga automática de símbolos falla o ves fallas no simbolizadas en el panel
La tarea de carga de símbolos estándar de Crashlytics supone que estás creando tus bibliotecas nativas como parte de la compilación Gradle del módulo de tu aplicación, utilizando herramientas de compilación NDK estándar como CMake.
Sin embargo, si está utilizando un proceso de compilación de NDK personalizado dentro de Gradle, o si sus bibliotecas nativas están compiladas en una biblioteca/módulo de funciones o las proporciona un tercero, es posible que deba especificar explícitamente la ruta a sus bibliotecas no eliminadas. Para lograr esto, puede agregar la propiedad unstrippedNativeLibsDir
dentro de la extensión Crashlytics en su archivo de compilación de Gradle.
Asegúrese de haber completado las siguientes tareas iniciales del flujo de trabajo principal anteriormente en esta página:
Para que la tarea de carga automática de símbolos pueda encontrar la información de su símbolo, agregue lo siguiente al archivo Gradle de su módulo (nivel de aplicación) (generalmente
<project>/<app-module>/build.gradle.kts
o<project>/<app-module>/build.gradle
):Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Groovy
// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
El complemento Crashlytics buscará recursivamente en el directorio especificado bibliotecas nativas con una extensión
.so
. Luego, Crashlytics extrae los símbolos de depuración de todas esas bibliotecas y los carga en los servidores de Firebase.Esto es lo que puede especificar en la propiedad
unstrippedNativeLibsDir
:Cualquier argumento permitido para
org.gradle.api.Project#files(Object...)
, incluido:java.lang.String
,java.io.File
, oorg.gradle.api.file.FileCollection
Varios directorios para un único tipo de compilación proporcionando una lista o una instancia
FileCollection
Finalmente, fuerce una prueba de bloqueo para terminar de configurar Crashlytics y ver los datos iniciales en el panel de Crashlytics de Firebase console.
Opción : cargar símbolos para compilaciones que no sean de Gradle o bibliotecas nativas no eliminadas inaccesibles
Esta opción puede resultar útil en las siguientes situaciones:
Si utiliza un proceso de compilación que no sea Gradle
Si sus bibliotecas nativas no eliminadas se le proporcionan de alguna manera a la que no se puede acceder durante las compilaciones de Gradle
Esta opción requiere que ejecutes un comando de Firebase CLI cuando creas una compilación de lanzamiento o cualquier compilación para la que quieras ver seguimientos de pila simbólicos en Firebase console.
Asegúrese de haber completado las siguientes tareas iniciales del flujo de trabajo principal anteriormente en esta página:
Se agregó el SDK de Crashlytics para NDK y el complemento Crashlytics Gradle .
Tenga en cuenta que con esta opción, no necesita agregar la extensión
firebaseCrashlytics
ni configurar la carga automática de símbolos porque, en su lugar, utilizará Firebase CLI (siguientes pasos a continuación) para generar y cargar sus archivos de símbolos.Configure su entorno y proyecto para cargar símbolos:
Siga las instrucciones para instalar Firebase CLI .
Si ya instaló la CLI, asegúrese de actualizar a su última versión .
(solo para aplicaciones que usan Android API nivel 30+) Actualice la plantilla
AndroidManifest.xml
de su aplicación para deshabilitar el etiquetado de puntero:Marque la casilla de Configuración del reproductor Android > Configuración de publicación > Compilación > Manifiesto principal personalizado .
Abra la plantilla de manifiesto ubicada en
Assets/Plugins/Android/AndroidManifest.xml
.Agregue el siguiente atributo a la etiqueta de la aplicación:
<application android:allowNativeHeapPointerTagging="false" ... />
Construye tu proyecto.
Sube la información de tus símbolos.
Una vez que haya finalizado la compilación, genere un archivo de símbolos compatible con Crashlytics y cárguelo en los servidores de Firebase ejecutando el siguiente comando de Firebase CLI:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : el ID de tu aplicación Firebase para Android (no el nombre de tu paquete)
Ejemplo de ID de aplicación de Firebase para Android:1:567383003300:android:17104a2ced0c9b9b
Aquí hay dos formas de encontrar el ID de su aplicación Firebase:
En su archivo
google-services.json
, su ID de aplicación es el valormobilesdk_app_id
; oEn Firebase console, ve a la configuración de tu proyecto . Desplácese hacia abajo hasta la tarjeta Sus aplicaciones , luego haga clic en la aplicación Firebase deseada para encontrar su ID de aplicación.
PATH/TO/SYMBOLS : La ruta al archivo de símbolos generado por la CLI
Exportado a un proyecto de Android Studio: PATH/TO/SYMBOLS puede ser cualquier directorio. Firebase CLI buscará recursivamente en el directorio especificado bibliotecas nativas con una extensión
.so
.Compiló el APK directamente desde Unity: PATH/TO/SYMBOLS es la ruta del archivo de símbolos comprimido generado en el directorio raíz del proyecto cuando finalizó la compilación (por ejemplo:
myproject/myapp-1.0-v100.symbols.zip
).
Ver opciones avanzadas para usar el comando Firebase CLI para generar y cargar archivos de símbolos
Bandera Descripción --generator=csym
Utiliza el generador de archivos de símbolos cSYM heredado en lugar del generador Breakpad predeterminado
No recomendado para su uso. Recomendamos utilizar el generador de archivos de símbolos predeterminado de Breakpad.
--generator=breakpad
Utiliza el generador de archivos de símbolos Breakpad
Tenga en cuenta que el valor predeterminado para la generación de archivos de símbolos es Breakpad. Utilice esta bandera solo si ha agregado
symbolGenerator { csym() }
en su configuración de compilación y desea anularlo para usar Breakpad en su lugar.--dry-run
Genera los archivos de símbolos pero no los carga.
Esta bandera es útil si desea inspeccionar el contenido de los archivos que se envían.
--debug
Proporciona información de depuración adicional. Finalmente, fuerce una prueba de bloqueo para terminar de configurar Crashlytics y ver los datos iniciales en el panel de Crashlytics de Firebase console.
Después de crear su aplicación como parte de forzar un bloqueo, asegúrese de ejecutar el comando
crashlytics:symbols:upload
Firebase CLI para cargar su archivo de símbolos.