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:
-
- Recoge los informes de fallos y proporciona información contextual al tiempo que destaca la gravedad y la prevalencia de los fallos.
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.- Integrado con
Analytics
. - 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 |