Actualiza al SDK de Firebase Crashlytics

Ahora puedes configurar Crashlytics en tu app con el nuevo SDK oficial de Firebase Crashlytics, que ofrece API mejoradas que son más coherentes con otros productos de Firebase y más intuitivas de usar. En esta guías se describe cómo actualizar al nuevo SDK de Crashlytics de Fabric. También se describen los cambios que traen las nuevas API, el motivo de los cambios y cómo actualizar tu código, si es necesario.

Si migraste tu app desde Fabric recientemente, revisa cómo la actualización al SDK de Firebase Crashlytics afecta tus datos de estadísticas de fallas.

Antes de comenzar

El SDK de Firebase Crashlytics usa AndroidX como una dependencia, por lo que si tu app usa versiones anteriores de la biblioteca de compatibilidad de apps, primero migra tu app a AndroidX.

Paso 1: Agrega un archivo de configuración de Firebase

Agrega el archivo de configuración de Firebase para Android a la app:

  1. Abre la Configuración del proyecto. En la tarjeta Tus apps, selecciona el nombre del paquete de la app cuyo archivo de configuración necesitas.
  2. Haz clic en Descargar google-services.json a fin de obtener el archivo de configuración de Firebase para Android.
    • Puedes volver a descargar el archivo de configuración de Firebase para Android cuando quieras.
    • Asegúrate de que no se hayan agregado caracteres adicionales, como (2), al archivo de configuración.
  3. Transfiere tu archivo de configuración al directorio del módulo (nivel de app) de tu app.

Paso 2: Agrega el SDK de Firebase Crashlytics

  1. En el nivel de raíz de tu app (nivel de proyecto) build.gradle:
    • Reemplaza el repositorio Maven de Fabric con el repositorio Maven de Google.
    • Reemplaza el complemento Gradle de Fabric con el complemento Gradle de Firebase Crashlytics.
    buildscript {
      // ...
    
      repositories {
        // ...
    
        // Remove Fabric's Maven repository.
        maven { url 'https://maven.fabric.io/public' }
    
        // Add Google's Maven repository (if it's not there already).
        google()
      }
    
      dependencies {
        // ..
    
        // Add the Google Services Gradle plugin (if it's not there already).
        classpath 'com.google.gms:google-services:4.3.3'
    
        // Remove the Fabric Gradle plugin.
        classpath 'io.fabric.tools:gradle:1.31.2'
    
        // Add the Firebase Crashlytics Gradle plugin.
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.1'
      }
    }
  2. En tu build.gradle de nivel de app, reemplaza el complemento de Fabric con el complemento de Firebase Crashlytics:
    apply plugin: 'com.android.application'
    
    // Apply the Google Services plugin (if it's not there already).
    apply plugin: 'com.google.gms.google-services'
    
    // Remove the Fabric plugin.
    apply plugin: 'io.fabric'
    
    // Add the Firebase Crashlytics plugin.
    apply plugin: 'com.google.firebase.crashlytics'
  3. Por último, agrega el SDK de Firebase Crashlytics. En tu build.gradle de nivel de app, reemplaza el SDK de Crashlytics heredado de Fabric por el nuevo SDK de Firebase Crashlytics. Asegúrate de agregar la versión 17.0.0 o posterior. (A partir del 15 de noviembre de 2020, esto es necesario para que se muestren tus informes de fallas en Firebase console).
    dependencies {
      // Remove the Fabric Crashlytics SDK.
      implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
    
      // Add the Firebase Crashlytics SDK.
      implementation 'com.google.firebase:firebase-crashlytics:17.2.1'
    
      // Recommended: Add the Google Analytics SDK.
      implementation 'com.google.firebase:firebase-analytics:17.5.0'
    }

Paso opcional: Configura los informes de fallas del NDK

Firebase Crashlytics ofrece informes de fallas para apps compiladas con el kit de desarrollo nativo (NDK) de Android. Para detectar y, luego, informar las fallas por errores en el código nativo, debes hacer lo siguiente:

  1. En tu build.gradle de nivel de app, reemplaza la dependencia del NDK de Fabric con la dependencia del NDK de Firebase Crashlytics. Luego, agrega la extensión firebaseCrashlytics y asegúrate de habilitar la marca nativeSymbolUploadEnabled. Esto permite que tu app procese y suba símbolos nativos a Crashlytics para que puedas ver los seguimientos de pila correctamente simbolizados en el panel de Crashlytics.
    dependencies {
      // Remove the Fabric NDK dependency.
      implementation 'com.crashlytics.sdk.android:crashlytics-ndk:2.1.1'
    
      // Add the Firebase Crashlytics NDK dependency.
      implementation 'com.google.firebase:firebase-crashlytics-ndk:17.2.1'
    }
    // ...
    
    android {
        // ...
    
        buildTypes {
            release {
                /* Add the firebaseCrashlytics extension (by default,
                * it's disabled to improve build speeds) and set
                * nativeSymbolUploadEnabled to true. */
    
                firebaseCrashlytics {
                    nativeSymbolUploadEnabled true
                }
            }
        }
    }
    
    // Remove this extension (it previously enabled Crashlytics NDK reporting in Fabric).
    crashlytics {
      enableNdk true
    }
      
  2. Ejecuta las siguientes tareas de Gradle específicas del NDK:
    > ./gradlew app:assembleBUILD_VARIANT
    > ./gradlew app:uploadCrashlyticsSymbolFileBUILD_VARIANT
      
  3. Para obtener más información sobre cómo usar Crashlytics para los informes de fallas del NDK, consulta la documentación del NDK de Crashlytics.

Paso 3: Actualiza tu código

Revisa los siguientes cambios del SDK y realiza las actualizaciones correspondientes en tu código:


El nuevo paquete y nombre de clase para Crashlytics es com.google.firebase.crashlytics.FirebaseCrashlytics.

Ahora puedes invocar funciones de Crashlytics con métodos de instancia en el singleton de FirebaseCrashlytics en lugar de funciones estáticas en la clase de FirebaseCrashlytics. Se puede acceder de forma global al singleton de FirebaseCrashlytics mediante la función estática getInstance().

SDK de Fabric

Java

import com.crashlytics.android.Crashlytics;

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

Kotlin+KTX

import com.crashlytics.android.Crashlytics

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

SDK de Firebase Crashlytics

Java

import com.google.firebase.crashlytics.FirebaseCrashlytics;

// ...

// Operations on FirebaseCrashlytics.
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
crashlytics.someAction();

Kotlin+KTX

import com.google.firebase.crashlytics.FirebaseCrashlytics

// ...

// Operations on FirebaseCrashlytics.
val crashlytics = FirebaseCrashlytics.getInstance()
crashlytics.someAction()

Motivo del cambio

El paquete de raíz y el punto de entrada del nuevo SDK ahora son coherentes con otros SDK de Firebase. Además, los métodos de instancia son más fáciles de simular que las funciones estáticas y crean menos desafíos de prueba.


FirebaseCrashlytics ya no funciona con el SDK de Fabric.

Ahora, FirebaseCrashlytics se inicia automáticamente con un ContentProvider definido en el nuevo SDK de Firebase Crashlytics. Quita las llamadas a Fabric.with() si es que las hay. Si ya usas Firebase Crashlytics, es posible que tu app ya esté usando el inicio automático y no contenga una llamada a Fabric.with().

El SDK nuevo ya no usa la clave de API de Fabric. En su lugar, Crashlytics ahora usa el archivo google-services.json de tu app para asociarla con tu proyecto de Firebase y conservar tus datos de fallas históricas. Si declaraste una io.fabric.ApiKey en el archivo AndroidManifest.xml, quítala.

Si quieres inhabilitar los informes automáticos de fallas y habilitarlos solo para usuarios seleccionados, usa la etiqueta meta-data de Android en el archivo AndroidManifest.xml. Luego, puedes habilitar los informes de fallas con el nuevo método de instancia setCrashlyticsCollectionEnabled.

SDK de Fabric

Java

import com.crashlytics.android.Crashlytics;
import io.fabric.sdk.android.Fabric;

// ...

Fabric.with(getContext(), new Crashlytics());

Kotlin+KTX

import com.crashlytics.android.Crashlytics
import io.fabric.sdk.android.Fabric

// ...

Fabric.with(getContext(), Crashlytics())

SDK de Firebase Crashlytics

Java

import com.google.firebase.crashlytics.FirebaseCrashlytics;

// ...

// Explicit initialization of Crashlytics is no longer required.

// OPTIONAL: If crash reporting has been explicitly disabled previously, add:
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);

Kotlin+KTX

import com.google.firebase.crashlytics.FirebaseCrashlytics

// ...

// Explicit initialization of Crashlytics is no longer required.

// OPTIONAL: If crash reporting has been explicitly disabled previously, add:
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)

Si agregaste Crashlytics a tu app mediante el sitio web de Fabric, quita la clave de API de Fabric de tu archivo AndroidManifest.xml (si es que existe):

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.your_app_package">

   <application>
      <activity android:name=".MainActivity"/>

      <!-- Remove this line if it exists -->
      <meta-data android:name="io.fabric.ApiKey"
          android:value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />

   </application>
</manifest>

Motivo del cambio

Para ser coherente con otros SDK de Firebase, Crashlytics ahora se inicia automáticamente a través de un ContentProvider. Al igual que con otros SDK, ahora proporciona una marca de manifiesto para inhabilitar la recopilación automática de datos, la cual puedes anular en cualquier momento mediante setCrashlyticsCollectionEnabled. El método te brinda más control sobre el comportamiento de los informes de fallas de tu app.


Ahora Crashlytics.log es un método de instancia.

El SDK nuevo ya no incluye un método Crashlytics.log estático. Para agregar mensajes de registro personalizados, usa el nuevo método de instancia crashlytics.log. Ten en cuenta que el nuevo método ya no se repite en logcat (recomendamos que escribas un wrapper si deseas mantener este comportamiento). Para obtener más información, visita Agrega mensajes de registro personalizados.

SDK de Fabric

Java

Crashlytics.log("my message");

Crashlytics.log(
 Log.ERROR,
 "TAG",
 "my message");

Kotlin+KTX

Crashlytics.log("my message")

Crashlytics.log(
 Log.ERROR,
 "TAG",
 "my message")

SDK de Firebase Crashlytics

Java

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.log("my message");

// To log a message to a crash report, use the following syntax:
crashlytics.log("E/TAG: my message");

Kotlin+KTX

val crashlytics = FirebaseCrashlytics.getInstance()

crashlytics.log("my message")

// To log a message to a crash report, use the following syntax:
crashlytics.log("E/TAG: my message")

Motivo del cambio

A pedido de los usuarios, dejamos de repetir los registros de Crashlytics en logcat. El uso de métodos de instancia también facilita probar el código.


setBool, setDouble, setFloat, setInt, setLong y setString se agregaron a setCustomKey.

Agregamos los métodos set de claves personalizadas al método setCustomKey. Anteriormente, se podían usar los métodos set de claves personalizadas para establecer pares clave-valor y enviarlos junto con el informe de fallas. Ahora, puedes usar setCustomKey(String, value), que se sobrecarga para aceptar tipos básicos y de string. Para obtener más información, consulta Agrega claves personalizadas.

SDK de Fabric

Java

Crashlytics.setBool("bool_key",true);

Crashlytics.setDouble("double_key",42.0);

Crashlytics.setFloat("float_key",42.0F);

Crashlytics.setInt("int_key",42);

Crashlytics.setLong("long_key",42L);

Crashlytics.setString("str_key","str_value");

Kotlin+KTX

Crashlytics.setBool("bool_key",true)

Crashlytics.setDouble("double_key",42.0)

Crashlytics.setFloat("float_key",42.0F)

Crashlytics.setInt("int_key",42)

Crashlytics.setLong("long_key",42L)

Crashlytics.setString("str_key","str_value")

SDK de Firebase Crashlytics

Java

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.setCustomKey("bool_key",true);

crashlytics.setCustomKey("double_key",42.0);

crashlytics.setCustomKey("float_key",42.0F);

crashlytics.setCustomKey("int_key",42);

crashlytics.setCustomKey("long_key",42L);

crashlytics.setCustomKey("str_key","42");

Kotlin+KTX

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance()

crashlytics.setCustomKey("bool_key",true)

crashlytics.setCustomKey("double_key",42.0)

crashlytics.setCustomKey("float_key",42.0F)

crashlytics.setCustomKey("int_key",42)

crashlytics.setCustomKey("long_key",42L)

crashlytics.setCustomKey("str_key","42")

Motivo del cambio

El nombre del método nuevo es exclusivo de Crashlytics y deja en claro que Crashlytics no cumple con el formato clave-valor.


setUserIdentifier ahora es setUserId. Se quitaron setUserName y setUserEmail.

Anteriormente podías configurar un nombre o correo electrónico asociado con una falla mediante setUserName y setUserEmail, pero estos métodos ya no están definidos. A fin de establecer ID para los usuarios ahora se prefiere el método setUserId. Para obtener más información, visita Configura identificadores de usuario.

SDK de Fabric

Java

Crashlytics.setUserIdentifier("myAppUserId");

Crashlytics.setUserEmail("abc@example.com");

Crashlytics.setUserName("John Doe");

Kotlin+KTX

Crashlytics.setUserIdentifier("myAppUserId")

Crashlytics.setUserEmail("abc@example.com")

Crashlytics.setUserName("John Doe")

SDK de Firebase Crashlytics

Java

crashlytics.setUserId("myAppUserId");

Kotlin+KTX

crashlytics.setUserId("myAppUserId")

Motivo del cambio

Adoptamos el nombre de método setUserId para que sea coherente con otras API de Firebase y quitamos setUserName y setUserEmail a fin de evitar el registro de PII a través de Crashlytics.


Crashlytics.logException(Throwable) se reemplazó por FirebaseCrashlytics.recordException(Throwable).

Crashlytics ahora también admite el registro de los tipos de errores y excepciones integrados para iOS y Android.

SDK de Fabric

Java

try {
/* Code that can throw checked
exceptions. */

// ...

} catch (Exception e) {
Crashlytics.logException(e);
}

Kotlin+KTX

try {
/* Code that can throw checked
exceptions. */

// ...

catch (e: Exception) {
Crashlytics.logException(e)
}

SDK de Firebase Crashlytics

Java

try {
/* Code that can throw checked
exceptions. */

// ...

} catch (Exception e) {
FirebaseCrashlytics.getInstance().recordException(e);
}

Kotlin+KTX

try {
/* Code that can throw checked
exceptions. */

// ...

catch (e: Exception) {
FirebaseCrashlytics.getInstance().recordException(e)
}

Motivo del cambio

El nuevo método recordException(Throwable) se distingue más fácilmente de log(String), que se comporta de manera diferente. Además, cambiamos el nombre de la nueva API para que sea más coherente en todas las plataformas.


CrashlyticsListener se reemplazó por didCrashOnPreviousExecution().

Anteriormente, CrashlyticsListener permitía que Crashlytics indicara cuando una sesión de app anterior terminaba por una falla, lo cual es útil para las apps que muestran mensajes posteriores a una falla al momento de reiniciarlas. Ahora, su devolución de llamada se reemplaza por la llamada síncrona didCrashOnPreviousExecution() a la API.

SDK de Fabric

Java

CrashlyticsListener crashlyticsListener =
new CrashlyticsListener() {
  @Override
  public void crashlyticsDidDetectCrashDuringPreviousExecution() {
    // ...App code to execute if a crash occurred during previous execution.
  }
};

CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
                                      .listener(crashlyticsListener)
                                      .build();

Crashlytics crashlytics = new Crashlytics.Builder().core(crashlyticsCore).build();

Fabric.with(getContext(), crashlytics);

Kotlin+KTX

val crashlyticsListener = CrashlyticsListener {
  // ...App code to execute if a crash occurred during previous execution.
}
val crashlyticsCore = CrashlyticsCore.Builder()
  .listener(crashlyticsListener)
  .build()
val crashlytics = Crashlytics.Builder().core(crashlyticsCore).build()
Fabric.with(getContext(), crashlytics)

SDK de Firebase Crashlytics

Java

if (FirebaseCrashlytics.getInstance().didCrashOnPreviousExecution()) {
// ...App code to execute if a crash occurred during previous execution.
}

Kotlin+KTX

if (FirebaseCrashlytics.getInstance().didCrashOnPreviousExecution()) {
// ...App code to execute if a crash occurred during previous execution.
}

Motivo del cambio

La API nueva es más concisa y más sencilla de usar que CrashlyticsListener, porque no requiere texto estándar ni una devolución de llamada. Anteriormente, la devolución de llamada asíncrona no garantizaba cuándo se invocaría la devolución de llamada.


Se quitó el método de falla.

El nuevo SDK ya no incluye el método de falla, en el cual podías forzar una falla en tu app para validar la configuración de Crashlytics. Para generar una falla, arroja un RuntimeException.

SDK de Fabric

Java

Crashlytics.getInstance().crash();

Kotlin+KTX

Crashlytics.getInstance().crash()

SDK de Firebase Crashlytics

Java

throw new RuntimeException("Test Crash");

Kotlin+KTX

throw RuntimeException("Test Crash")

Motivo del cambio

Los nuevos métodos especifican claramente si las fallas resultantes de tu app ocurrieron durante el tiempo de ejecución o en el SDK nativo de la app.


El complemento Gradle de Crashlytics contiene marcas nuevas.

El complemento de Gradle aún configura y ejecuta automáticamente tareas de Gradle específicas de Crashlytics. Si tu compilación requiere invocar tareas del complemento Gradle de Crashlytics, ejecuta ./gradlew app:tasks para consultar las tareas de Firebase Crashlytics disponibles. Si tu app usa un NDK, debes invocar explícitamente la tarea de Gradle uploadCrashlyticsSymbolFile[BUILD_VARIANT] para continuar subiendo símbolos nativos a Crashlytics.

Las marcas de compilación específicas de Crashlytics ext.alwaysUpdateBuildId y ext.enableCrashlytics ya no son compatibles. Si existen, quítalas de la configuración de Gradle. Si tu app usa un ofuscador de código de bytes (p. ej., R8 o Proguard) y no quieres subir el archivo de mapeo de la compilación a Crashlytics, usa la nueva marca mappingFileUploadEnabled de la extensión de Gradle firebaseCrashlytics. Cuando se configura como false, Crashlytics no puede desofuscar los seguimientos de pila de la app. Para configuraciones de ofuscación no estándar, usa el parámetro mappingFile a fin de establecer una ubicación nueva para el archivo de asignación. Estas marcas se pueden usar para defaultConfig, así como para cualquier tipo de compilación o variante.

SDK de Firebase Crashlytics

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.gms.google-services'

android {
    // ...

    buildTypes {
        debug {
            minifyEnabled true
            firebaseCrashlytics {
                // If you don't need crash reporting for your debug build,
                // you can speed up your build by disabling mapping file uploading.
                mappingFileUploadEnabled false
            }
        }

        release {
            minifyEnabled true
            // When minifyEnabled is set to true, Crashlytics automatically
            // uploads mapping files because the plugin detects that obfuscation
            // is enabled. mappingFileUploadEnabled defaults to true if
            // minifyEnabled is true.
        }
    }
}

Motivo del cambio

Actualizamos las tareas y opciones de configuración de Gradle para que sean más coherentes con las convenciones de Gradle.


Crashlytics solo puede usar los datos que recopila Google Analytics.

Una vez que actualices al SDK de Firebase Crashlytics, ya no podrás recopilar datos con Fabric Answers. Para obtener métricas de rutas de navegación y usuarios que no experimentaron fallas, cambia a Google Analytics. Ten en cuenta que los datos históricos de Answers no se pueden migrar a Firebase.

Visita Comienza a usar Google Analytics para obtener información sobre cómo agregar Google Analytics a tu app. Si utilizaste previamente Fabric Answers, descubre cómo convertir los eventos de Answers en eventos de Analytics.

Motivo del cambio

Ahora ofrecemos Google Analytics para ayudarte a recopilar datos de fallas más detallados. Con Analytics, puedes seguir recopilando estadísticas de tu app en Firebase console.


Próximos pasos