Informa fallas en Android

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

Configura Crash Reporting

Sigue estos pasos para configurar Crash Reporting en Android:

  1. Si aún no lo has hecho, configura Firebase en tu proyecto de 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 app de la siguiente manera:
    implementation 'com.google.firebase:firebase-crash:16.2.1'

Crea el 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 de la siguiente forma:
    FirebaseCrash.report(new Exception("My first Android non-fatal error"));
  2. Inicia la app.
  3. En los registros de adb logcat o 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.

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

Desofusca 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 realizar pruebas, puedes configurar ProGuard para tipos de compilación de depuración y, luego, compilar con el comando ./gradlew assembleDebug como se muestra a continuación:

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

Sube 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 el archivo de asignación ProGuard a Firebase.

Para configurar el complemento de Crash Reporting:

  1. Agrega reglas a tu archivo de nivel raíz build.gradle para incluir el complemento de Crash Reporting:
        buildscript {
          repositories {
            jcenter()
            // ...
          }
    
          dependencies {
            // ...
            // For Android Studio 2.x, use firebase-plugins version 1.1.1
            classpath 'com.google.firebase:firebase-plugins:1.1.1'
            // For Android Studio 3.0, use firebase-plugins version 1.1.5
            //classpath 'com.google.firebase:firebase-plugins:1.1.5'
          }
        }
    
  2. En el archivo Gradle del proyecto de app (generalmente app/build.gradle), agrega la línea que se muestra en “AGREGAR ESTO” 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, luego, haz clic en Generar nueva clave privada.

  4. Agrega una propiedad llamada FirebaseServiceAccountFilePath con la ruta de acceso a $HOME/.gradle/gradle.properties, o especifica otra ruta en la línea de comandos mediante la bandera -P. Más adelante, puedes actualizar la propiedad FirebaseServiceAccountFilePath para ejecutar una tarea con un archivo de cuenta de servicio diferente.

    También puedes especificar la ruta del archivo de asignación en la línea de comandos mediante la marca -P para establecer la propiedad de esta manera:

    ./gradlew -PFirebaseServiceAccountFilePath=/usr/ServiceAccount/MyApp-a287fsd34.json :app:firebaseUploadReleaseProguardMapping
  5. En el directorio de tu proyecto, puedes ejecutar un comando gradlew para construir el APK y subir su archivo de asignación. Por ejemplo:

    ./gradlew :app:firebaseUploadReleaseProguardMapping

    El nombre exacto de la tarea de carga varía según el nombre de la 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 de 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 utiliza el archivo predeterminado google-services.json que está en la carpeta del módulo de tu proyecto, que es generalmente app/. Si prefieres no usar un archivo google-services.json, también deberás especificar las propiedades de 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 llamada fullRelease y varios APK, como app-full-armeabi-v7a-release.apk y app-full-armeabi-release.apk para ofrecer compatibilidad con diferentes arquitecturas, como se muestra en el siguiente ejemplo de Gradle.

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

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

La ejecución de la tarea ./gradlew :app:firebaseUploadReleaseProguardMapping sube los archivos de asignación de 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 de forma manual

De forma alternativa, puedes subir manualmente un archivo mapping.txt en la consola de Firebase. Para ello, ve a Crash Reporting y, luego, selecciona la pestaña Archivos de mapeo.

Puedes encontrar el archivo en una ruta de acceso 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 usas Android Studio 3.0, verás el siguiente error cuando utilices la versión 1.1.0 o 1.1.1 del complemento de Crash Reporting, por lo que, en su lugar, debes usar la versión 1.1.5 de archivo del nivel de raíz de tu app build.gradle:

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

Próximos pasos