Cómo informar fallos en Android

Firebase Crash Reporting crea informes detallados sobre los errores de tu app. Los errores se agrupan en problemas que tienen seguimientos de pila similares y se clasifican según la gravedad del impacto en tus usuarios. Además de recibir informes automáticos, puedes registrar eventos personalizados que te ayuden a capturar los pasos que conducen a una falla.

Configuración de Crash Reporting

Sigue estos pasos para configurar Crash Reporting en Android:

  1. Si aún no lo hiciste, configura Firebase en tu proyecto Android.
  2. En Firebase console, agrega tu app al proyecto de Firebase.
  3. Agrega la dependencia para Crash Reporting al archivo build.gradle de nivel de la app:
    compile 'com.google.firebase:firebase-crash:11.4.0'

Cómo crear tu primer error

Firebase Crash Reporting genera informes de errores fatales (o excepciones no detectadas) en forma automática. Sin embargo, también puedes generar informes en instancias en las que detectes una excepción, pero de todas maneras quieras generar un informe sobre el caso. Puedes seguir estos pasos para generar un informe sobre un error de este tipo:

  1. Agrega una llamada al método estático report en la actividad principal:
    FirebaseCrash.report(new Exception("My first Android non-fatal error"));
  2. Inicia la app.
  3. En adb logcat o en los registros de Android Studio, busca el mensaje que confirma que Crash Reporting está habilitado.
  4. Consulta la sección Crash Reporting de Firebase console para ver el error. Ten en cuenta que los errores demoran entre 1 y 2 minutos en aparecer.

Cómo crear registros personalizados

Puedes usar Crash Reporting para registrar eventos personalizados en los informes de errores y, de manera opcional, el logcat. Si quieres registrar un evento y no quieres resultados de logcat, solo tienes que pasar una string como argumento, tal como se muestra en este ejemplo:

FirebaseCrash.log("Activity created");

Si quieres generar resultados de logcat, también debes proporcionar el nivel de registro y una etiqueta.

Cómo desofuscar etiquetas ProGuard

ProGuard genera un archivo mapping.txt que asigna símbolos ofuscados por ProGuard a sus nombres originales. Si habilitaste ProGuard, subir los archivos de asignación te permite ver seguimientos de pila desofuscados en la interfaz de Crash Reporting.

Para hacer pruebas, puedes configurar ProGuard para tipos de compilación de depuración y después compilar con el comando ./gradlew assembleDebug, como se muestra a continuación:

debug {
   minifyEnabled true
   proguardFiles getDefaultProguardFile('proguard-android.txt'),
     'proguard-rules.pro'
}

Cómo subir archivos de asignación ProGuard con Gradle

Para ver seguimientos de pila desofuscados en Firebase console, puedes usar una tarea Gradle creada por el complemento de Crash Reporting para subir tu archivo de asignación ProGuard a Firebase.

Para configurar el complemento de Crash Reporting:

  1. Agrega reglas a tu archivo build.gradle de nivel de raíz para incluir el complemento de Crash Reporting:
        buildscript {
          repositories {
            jcenter()
            // ...
          }
    
          dependencies {
            // ...
            classpath 'com.google.firebase:firebase-plugins:1.1.1'
          }
        }
    
  2. En el archivo Gradle del proyecto de tu app (por lo general, app/build.gradle), agrega la línea que se muestra a continuación, debajo de `ADD THIS`, para habilitar el complemento de Crash Reporting:
        apply plugin: 'com.android.application'
        // ADD THIS
        apply plugin: 'com.google.firebase.firebase-crash'
    
        android {
          // ...
        }
    
        dependencies {
          // ...
        }
    
  3. Luego, crea una cuenta de servicio y una clave privada:

    Descarga una clave de cuenta de servicio para autenticar tus cargas. En Firebase console, selecciona tu proyecto y haz clic en Generar nueva clave privada.

  4. Agrega una propiedad llamada FirebaseServiceAccountFilePath con la ruta de acceso $HOME/.gradle/gradle.properties o especifica otra ruta en la línea de comandos con la marca -P. Más adelante, puedes actualizar la propiedad FirebaseServiceAccountFilePath para que ejecute una tarea con otro archivo de cuenta de servicio.

    Otra posibilidad es especificar la ruta del archivo de asignación en la línea de comandos con la marca -P para configurar la propiedad de la siguiente manera:

    ./gradlew -PFirebaseServiceAccountFilePath=/usr/ServiceAccount/MyApp-a287fsd34.json ...
  5. Desde el directorio de tu proyecto, puedes ejecutar un comando gradlew para compilar el APK y subir su archivo de asignación al mismo tiempo. Por ejemplo:

    ./gradlew :app:firebaseUploadReleaseProguardMapping

    El nombre exacto de la tarea de carga varía según el nombre de tu variante de compilación y sigue este patrón: firebaseUpload<VariantName>ProguardMapping. Para ver una lista completa de posibles nombres de tareas de carga, ejecuta el siguiente comando gradlew:

    ./gradlew :app:tasks

    También puedes especificar las propiedades Gradle que se usarán cuando se suba un archivo de asignación ProGuard mediante la tarea firebaseUploadArchivedProguardMapping. Puedes usar esta tarea para especificar las propiedades Gradle para FirebaseCrashMappingFilePath, FirebaseCrashVersionCode y FirebaseCrashPackageName, como se muestra en el siguiente ejemplo:

    FirebaseCrashMappingFilePath=path/to/mapping/file
    FirebaseCrashVersionCode=2
    FirebaseCrashPackageName=example.package.name
    
    En este ejemplo, tu proyecto usa el archivo predeterminado google-services.json que se encuentra en la carpeta del módulo de tu proyecto, por lo general en app/. Si prefieres no utilizar un archivo google-services.json, también deberás especificar propiedades Gradle para FirebaseCrashApiKey y FirebaseCrashAppId.

Cómo trabajar con apps que compilan varios APK

El complemento también funciona para aplicaciones que utilizan la compatibilidad con varios APK. Para cada tarea de variante de compilación, la tarea subirá archivos de asignación para todos los APK de esa variante.

Por ejemplo, supongamos que tienes una variante de compilación con el nombre fullRelease y varios APK, como app-full-armeabi-v7a-release.apk y app-full-armeabi-release.apk, para ofrecer compatibilidad con diferentes arquitecturas, según se muestra en el siguiente ejemplo.

    productFlavors {
        full {
            applicationId "com.google.firebase.sample.testapp"
            versionName "1.0-full"
        }
    }

    splits {
        abi {
            enable true
            reset()
            include 'armeabi', 'armeabi-v7a'
            universalApk true
        }
    }

Ejecutar la tarea ./gradlew :app:firebaseUploadReleaseProguardMapping sube los archivos de asignación ProGuard para app-armeabi-v7a-release.apk y app-armeabi-release.apk al servidor. La salida de la consola muestra lo siguiente para estas cargas:

Successfully uploaded proguard mapping file for app fullArmeabiRelease with versionCode: 1!
Successfully uploaded proguard mapping file for app fullArmeabi-v7aRelease with versionCode: 2!

Cómo subir archivos de asignación ProGuard manualmente

Como alternativa, puedes subir manualmente un archivo mapping.txt a Firebase console. Para hacerlo, explora Crash Reporting y elige la pestaña Archivos de asignación.

Puedes encontrar el archivo para subir en una ruta similar a la siguiente, pero específica de tu app:

<project root>/<module name>/build/outputs/mapping/<build type>/<appname>-proguard-mapping.txt

Por ejemplo:

app/build/outputs/mapping/debug/app-proguard-mapping.txt

Problema conocido

Si encuentras el siguiente error cuando usas la versión 1.1.0 o 1.1.1 del complemento de Crash Reporting, debes usar en su lugar la versión 1.1.0-alpha1 del complemento en el archivo build.gradle del nivel de raíz de tu app:

Cannot create tasks to upload ProGuard Mapping File.java.lang.IllegalStateException: Resolving configuration 'androidTestAnnotationProcessor' directly is not allowed

Pasos siguientes

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.