La suite Firebase tiene un módulo que le permite obtener información clara y procesable e informes sobre los problemas que su aplicación puede estar teniendo. Esto es poderoso especialmente si estás construyendo una aplicación de producción que es crítica para los usuarios. Cada segundo que se pierde indagando en los archivos de registro probablemente se traduzca en usuarios insatisfechos o en pérdidas de ingresos.

Por lo tanto, Firebase Crashlytics, un reportero ligero y en tiempo real que le ayuda a rastrear, priorizar y solucionar los problemas de estabilidad que erosionan la calidad de su aplicación, es fundamental. Le ahorra tiempo de resolución de problemas al agrupar de forma inteligente los fallos y destacar las circunstancias que los provocan.

Puedes averiguar si un fallo concreto está afectando a muchos usuarios. Puede recibir alertas cuando un problema aumenta repentinamente su gravedad e incluso señalar qué líneas de código están causando los fallos.

Estas son sus principales características:

    1. Recoge los informes de fallos y proporciona información contextual al tiempo que destaca la gravedad y la prevalencia de los fallos.
  1. Crashlytics ofrece Crash Insights, consejos útiles que resaltan los problemas de estabilidad más comunes y proporcionan recursos que facilitan su localización, clasificación y resolución.
  2. Integrado con Analytics.
  3. Alertas en tiempo real

Veamos ahora cómo configurar y utilizar Crashlytics.

Paso 1: Añadir Firebase a tu proyecto

Debido a que Crashlytics es uno de los productos de la suite de productos firebase, necesitas añadir firebase a tu proyecto. Cubrimos en detalle cómo hacerlo aquí.

Paso 2: Habilitar Crashlytics en la Consola de Firebase.

  • Ve al tablero de Crashlytics en la Consola de Firebase.
  • Asegúrese de que su aplicación está seleccionada en el menú desplegable junto a Crashlytics en la parte superior de la página.
  • Haga clic en Habilitar Crashlytics.

Paso 3: Añadir el plugin Firebase Crashlytics a su aplicación

Esto se hace en el archivo projects/build.gradle. Revisa el siguiente código para ver cómo:

buildscript {
    repositories {
        // Check that you have Google's Maven repository (if not, add it).
        google()
    }

    dependencies {
        // ...

        // Check that you have the Google services Gradle plugin v4.3.2 or later
        // (if not, add it).
        classpath 'com.google.gms:google-services:4.3.10'

        // Add the Crashlytics Gradle plugin
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
    }
}

allprojects {
    repositories {
        // Check that you have Google's Maven repository (if not, add it).
        google()
    }
}

Después de eso, ve a app/build.gradle y aplica el plugin crashlytics, en la parte superior de ese archivo:

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services' // Google services Gradle plugin

// Apply the Crashlytics Gradle plugin
apply plugin: 'com.google.firebase.crashlytics'

Paso 4: Añadir dependencias

Ahora necesitas añadir el SDK de Firebase Crashlytics a tu aplicación. Esto se hace dentro del archivo app/build.gradle bajo el cierre dependencies:

Para un proyecto Kotlin:

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:28.4.1')

    // Declare the dependencies for the Crashlytics and Analytics libraries
    // When using the BoM, you don't specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-crashlytics-ktx'
    implementation 'com.google.firebase:firebase-analytics-ktx'
}

Para un proyecto Java:

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:28.4.1')

    // Declare the dependencies for the Crashlytics and Analytics libraries
    // When using the BoM, you don't specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-crashlytics'
    implementation 'com.google.firebase:firebase-analytics'
}

Paso 5: Forzar una prueba

Sí, es necesario forzar un test para terminar de configurar Crashlytics. Esto implica que forzaremos intencionadamente un crash para ver los resultados en nuestro tablero de Crashlytics.

Para hacer esto, por ejemplo, podemos añadir un botón a nuestra aplicación, que al ser pulsado colapse la aplicación. Aquí hay ejemplos de código:

En Kotlin:

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

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

Ahora ejecuta la aplicación. Luego presione el botón, la aplicación se estrellará. Simplemente navega hasta el Crashlytics dashboard de la Consola de Firebase para ver el fallo de tu prueba.

Eso es todo.

Veamos ahora algunos ejemplos aislados simples.

Ejemplo 1: Firebase Crashlytics Ejemplo – Kotlin y Java

Este es un simple ejemplo de crashlytics de Firebase. Hay dos actividades, una escrita en Kotlin, la otra en Java.

Paso 1: Añadir Firebase a tu proyecto

Añade Firebase a tu proyecto como se detalla aquí.

Paso 2: Añadir dependencias

Necesitamos añadir dependencias a nuestro proyecto. Necesitamos dependencias para nuestro Crashlytics. En tu app/build.gradle añade las dependencias como sigue:

dependencies {
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.appcompat:appcompat:1.3.1'

    implementation 'com.google.firebase:firebase-crashlytics:18.2.0'
    implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.0'

    // For an optimal experience using Crashlytics, add the Firebase SDK
    // for Google Analytics. This is recommended, but not required.
    implementation 'com.google.firebase:firebase-analytics:19.0.0'
}

Paso 3: Añadir el permiso de Internet

Para conectarnos a Firebase necesitamos un permiso de Internet. Añade el siguiente permiso en tu archivo AndroidManifest.xml:

  <uses-permission android:name="android.permission.INTERNET"/>

Paso 4: Crear Layout

Realmente no necesitamos este diseño. Ni siquiera lo utilizamos. Sin embargo lo incluimos aquí para mostrarte todo el código del proyecto:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        tools:context=".MainActivity">

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"/>
</RelativeLayout>

Paso 5: Escribir el código

Tendremos tanto código Kotlin como Java. Aquí está la actividad principal para Kotlin:

MainActivity.kt

import android.os.Bundle
import android.view.ViewGroup
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.crashlytics.ktx.crashlytics
import com.google.firebase.crashlytics.ktx.setCustomKeys
import com.google.firebase.ktx.Firebase

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    fun setKeysBasic() {
        // [START crash_set_keys_basic]
        val crashlytics = Firebase.crashlytics
        crashlytics.setCustomKeys {
            key("my_string_key", "foo") // String value
            key("my_bool_key", true)    // boolean value
            key("my_double_key", 1.0)   // double value
            key("my_float_key", 1.0f)   // float value
            key("my_int_key", 1)        // int value
        }
        // [END crash_set_keys_basic]
    }

    fun resetKey() {
        // [START crash_re_set_key]
        val crashlytics = Firebase.crashlytics
        crashlytics.setCustomKeys {
            key("current_level", 3)
            key("last_UI_action", "logged_in")
        }
        // [END crash_re_set_key]
    }

    fun logReportAndPrint() {
        // [START crash_log_report_and_print]
        Firebase.crashlytics.log("message")
        // [END crash_log_report_and_print]
    }

    fun logReportOnly() {
        // [START crash_log_report_only]
        Firebase.crashlytics.log("message")
        // [END crash_log_report_only]
    }

    fun enableAtRuntime() {
        // [START crash_enable_at_runtime]
        Firebase.crashlytics.setCrashlyticsCollectionEnabled(true)
        // [END crash_enable_at_runtime]
    }

    fun setUserId() {
        // [START crash_set_user_id]
        Firebase.crashlytics.setUserId("user123456789")
        // [END crash_set_user_id]
    }

    @Throws(Exception::class)
    fun methodThatThrows() {
        throw Exception()
    }

    fun logCaughtEx() {
        // [START crash_log_caught_ex]
        try {
            methodThatThrows()
        } catch (e: Exception) {
            Firebase.crashlytics.recordException(e)
            // handle your exception here
        }
        // [END crash_log_caught_ex]
    }

    fun forceACrash() {
        // [START crash_force_crash]
        val crashButton = Button(this)
        crashButton.text = "Crash!"
        crashButton.setOnClickListener {
            throw RuntimeException() // Force a crash
        }

        addContentView(crashButton, ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT))
        // [END crash_force_crash]
    }
}

Y aquí está el código para java:

MainActivity.java

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import com.google.firebase.crashlytics.FirebaseCrashlytics;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public void setKeysBasic() {
        // [START crash_set_keys_basic]
        FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

        crashlytics.setCustomKey("my_string_key", "foo" /* string value */);

        crashlytics.setCustomKey("my_bool_key", true /* boolean value */);

        crashlytics.setCustomKey("my_double_key", 1.0 /* double value */);

        crashlytics.setCustomKey("my_float_key", 1.0f /* float value */);

        crashlytics.setCustomKey("my_int_key", 1 /* int value */);
        // [END crash_set_keys_basic]
    }

    public void resetKey() {
        // [START crash_re_set_key]
        FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

        crashlytics.setCustomKey("current_level", 3);
        crashlytics.setCustomKey("last_UI_action", "logged_in");
        // [END crash_re_set_key]
    }

    public void logReportAndPrint() {
        // [START crash_log_report_and_print]
        FirebaseCrashlytics.getInstance().log("message");
        // [END crash_log_report_and_print]
    }

    public void logReportOnly() {
        // [START crash_log_report_only]
        FirebaseCrashlytics.getInstance().log("message");
        // [END crash_log_report_only]
    }

    public void enableAtRuntime() {
        // [START crash_enable_at_runtime]
        FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);
        // [END crash_enable_at_runtime]
    }

    public void setUserId() {
        // [START crash_set_user_id]
        FirebaseCrashlytics.getInstance().setUserId("user123456789");
        // [END crash_set_user_id]
    }

    public void methodThatThrows() throws Exception {
        throw new Exception();
    }

    public void logCaughtEx() {
        // [START crash_log_caught_ex]
        try {
            methodThatThrows();
        } catch (Exception e) {
            FirebaseCrashlytics.getInstance().recordException(e);
            // handle your exception here
        }
        // [END crash_log_caught_ex]
    }

    public void forceACrash() {
        // [START crash_force_crash]
        Button crashButton = new Button(this);
        crashButton.setText("Crash!");
        crashButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                throw new RuntimeException(); // Force a crash
            }
        });

        addContentView(crashButton, new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        // [END crash_force_crash]
    }
}

Eso es todo.

Download

Descargue el proyecto a continuación:

Número Enlace
1. Código de descarga