Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Obtener informes de fallos del NDK de Android

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

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

  1. 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 .

  2. 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.

Java

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:31.1.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.2'
    implementation 'com.google.firebase:firebase-analytics:21.2.0'
}

Kotlin+KTX

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:31.1.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.2'
    implementation 'com.google.firebase:firebase-analytics-ktx:21.2.0'
}

Paso 2 : agregue el complemento Crashlytics Gradle a su aplicación

  1. 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.14'
    
            // Add the dependency for the Crashlytics Gradle plugin
            classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
        }
    }
  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 .

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

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

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.

  1. Para que pueda acceder a la tarea para la carga automática de símbolos, asegúrese de que nativeSymbolUploadEnabled esté configurado como true en el archivo Gradle de su módulo (nivel de aplicación).

  2. 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
    
  3. 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.

  1. 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".

    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));
    

    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))
    
  2. Cree y ejecute su aplicación.

  3. Fuerce el bloqueo de prueba para enviar el primer informe de bloqueo de su aplicación:

    1. Abra su aplicación desde su dispositivo de prueba o emulador.

    2. En su aplicación, presione el botón "Test Crash" que agregó usando el código anterior.

    3. Después de que su aplicación falle, reiníciela para que pueda enviar el informe de fallas a Firebase.

  4. 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

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



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.