Si su aplicación de Android contiene bibliotecas nativas , puede habilitar seguimientos de pila completos e informes de errores detallados para su código nativo de Firebase Crashlytics con algunas pequeñas actualizaciones en la configuración de compilación de su aplicación.
En esta guía, se describe cómo configurar los informes de fallas con Firebase Crashlytics SDK for NDK.
Si está buscando cómo comenzar a utilizar Crashlytics en sus proyectos de Unity, consulte la guía de introducción a Unity.
Antes de que empieces
Si aún no lo ha hecho, agregue Firebase a su proyecto de Android. Si no tiene una aplicación de Android, puede descargar una aplicación de muestra .
Recomendado : para obtener funciones como usuarios sin bloqueos, registros de migas de pan y alertas de velocidad, debe habilitar Google Analytics en su proyecto de Firebase.
Si su proyecto de Firebase existente no tiene habilitado Google Analytics, puede habilitar Google Analytics desde la pestaña Integraciones de su > Configuración del proyecto en la consola de Firebase.
Si está creando un nuevo proyecto de Firebase, habilite 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 tu módulo (nivel de aplicación) (generalmente<project>/<app-module>/build.gradle
), agrega la dependencia para la biblioteca de Android Crashlytics NDK. Recomendamos usar 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.
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.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-ktx' }
Al usar Firebase Android BoM , su aplicación siempre usará versiones compatibles de las bibliotecas de Firebase Android.
(Alternativa) Agregar dependencias de la biblioteca de Firebase sin usar el BoM
Si elige no usar Firebase BoM, 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 enfáticamente que use la lista de materiales 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.3.3' implementation 'com.google.firebase:firebase-analytics-ktx:21.2.0' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.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' }
Al usar Firebase Android BoM , su aplicación siempre usará versiones compatibles de las bibliotecas de Firebase Android.
(Alternativa) Agregar dependencias de la biblioteca de Firebase sin usar el BoM
Si elige no usar Firebase BoM, 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 enfáticamente que use la lista de materiales 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.3.3' implementation 'com.google.firebase:firebase-analytics:21.2.0' }
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
), agregue el complemento Crashlytics Gradle como una dependencia de buildscript:buildscript { repositories { // Make sure that you have the following two repositories google() // Google's Maven repository mavenCentral() // Maven Central repository } dependencies { ... classpath 'com.android.tools.build:gradle:7.2.0' // Make sure that you have the Google services Gradle plugin dependency classpath 'com.google.gms:google-services:4.3.15' // Add the dependency for the Crashlytics Gradle plugin classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2' } }
En el archivo Gradle de tu módulo (nivel de aplicación) (generalmente
<project>/<app-module>/build.gradle
), agrega el complemento Crashlytics Gradle: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 : agregue la extensión firebaseCrashlytics
a su compilación
En el archivo Gradle de tu módulo (nivel de aplicación) (generalmente app/build.gradle
), agrega la extensión firebaseCrashlytics
.
Kotlin+KTX
// ... 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 } } } }
Java
// ... 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 : configure la carga automática de símbolos nativos
Para producir seguimientos de pila legibles a partir de bloqueos de 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 para la carga automática de símbolos, asegúrese de que
nativeSymbolUploadEnabled
esté configurado comotrue
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 su pila, debe invocar explícitamente la tarea
uploadCrashlyticsSymbolFile BUILD_VARIANT
después de cada compilación de su biblioteca NDK. Por ejemplo:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
Tanto el SDK de Crashlytics para NDK como el complemento de Gradle de Crashlytics dependen de la presencia del ID de compilación de GNU dentro de los objetos compartidos nativos.
Puede verificar la presencia de este 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 un bloqueo de prueba para finalizar la configuración
Para terminar de configurar Crashlytics y ver los datos iniciales en el panel de Crashlytics de Firebase console, debe forzar un bloqueo de prueba.
Agregue código a su aplicación que pueda usar para forzar un bloqueo 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, provoque un bloqueo. El botón está etiquetado como "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.
Fuerce el bloqueo de prueba para enviar el primer informe de bloqueo de su aplicación:
Abra su aplicación desde su dispositivo de prueba o emulador.
En su aplicación, presione el botón "Test Crash" 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 control de Crashlytics de la consola de Firebase para ver su bloqueo de prueba.
Si actualizó la consola y aún no ve el bloqueo de prueba después de cinco minutos, habilite el registro de depuración para ver si su aplicación envía informes de bloqueo.
¡Y eso es! Crashlytics ahora está monitoreando su aplicación en busca de fallas, y puede ver e investigar informes y estadísticas de fallas en el panel de control de Crashlytics.
Opciones alternativas para cargar símbolos
El flujo de trabajo principal en 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 ser útiles para cargar símbolos con éxito.
Opción : cargar símbolos para módulos de biblioteca y dependencias externas
Esta opción puede ser útil en las siguientes situaciones:
- Si usa un proceso de compilación de NDK personalizado dentro de Gradle
- Si sus bibliotecas nativas están integradas en un módulo de función/biblioteca o las proporciona un tercero
- Si la tarea de carga automática de símbolos está fallando o está viendo fallas no simbolizadas en el tablero
La tarea estándar de carga de símbolos de Crashlytics asume que está compilando sus bibliotecas nativas como parte de la compilación de Gradle del módulo de su aplicación, utilizando herramientas de compilación estándar de NDK, 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 integradas en un módulo de biblioteca/características 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 firebaseCrashlytics
en su archivo build.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 a su archivo
build.gradle
de módulo (nivel de aplicación):// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
El complemento Crashlytics buscará recursivamente el directorio especificado para 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...)
, incluidos:java.lang.String
,java.io.File
uorg.gradle.api.file.FileCollection
Múltiples directorios para un solo tipo de compilación al proporcionar una lista o una instancia de
FileCollection
Por último, fuerce un bloqueo de prueba para terminar de configurar Crashlytics y ver los datos iniciales en el panel de control 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 ser útil en las siguientes situaciones:
Si usa un proceso de compilación que no sea Gradle
Si sus bibliotecas nativas no eliminadas se le proporcionan de alguna manera que no son accesibles durante las compilaciones de Gradle
Esta opción requiere que ejecute un comando de la CLI de Firebase cuando cree una compilación de lanzamiento o cualquier compilación para la que desee ver seguimientos de pila simbolizados en la consola de Firebase.
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 de Gradle de Crashlytics .
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 la carga de 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 de Android > Configuración de publicación > Generar > 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 su compilación, genere un archivo de símbolos compatible con Crashlytics y cárguelo en los servidores de Firebase ejecutando el siguiente comando de la CLI de Firebase:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : su ID de aplicación de Android de Firebase (no el nombre de su paquete)
Ejemplo de ID de la aplicación Android de Firebase:1:567383003300:android:17104a2ced0c9b9b
Aquí hay dos formas de encontrar su ID de aplicación de Firebase:
En su archivo
google-services.json
, su ID de aplicación es el valormobilesdk_app_id
; oEn la consola de Firebase, vaya a la configuración de su 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 el directorio especificado para 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ó su 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 Breakpad predeterminado.
--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. Solo use esta bandera 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
Este indicador es útil si desea inspeccionar el contenido de los archivos que se envían.
--debug
Proporciona información de depuración adicional Por último, fuerce un bloqueo de prueba para terminar de configurar Crashlytics y ver los datos iniciales en el panel de control de Crashlytics de Firebase console.
Después de compilar su aplicación como parte de forzar un bloqueo, asegúrese de ejecutar el
crashlytics:symbols:upload
de Firebase CLI para cargar su archivo de símbolos.
Solución de problemas
Si ve diferentes seguimientos de pila en Firebase console y en logcat, consulte la guía de solución de problemas.
Próximos pasos
Personalice la configuración de su informe de fallas agregando informes opcionales, registros, claves y seguimiento de errores no fatales.
Integre con Google Play para que pueda filtrar los informes de fallas de su aplicación de Android por pista de Google Play directamente en el tablero de Crashlytics. Esto le permite enfocar mejor su tablero en compilaciones específicas.