Informes de fallos. ACRA.

Tienes tu app lista, has hecho todas las pruebas posibles y, antes de lanzarla al mercado, quieres que se pruebe en varios dispositivos diferentes. Salvo que tengas un pastón como para comprarte muchos móviles y tablets, se la pasarás por correo a amigos para que la prueben, la usen, te digan lo que les parece, etc. Y entonces sucede: en unos dispositivos la app va bien y en otros directamente falla. Falla de Cierre Forzado. El vulgar ‘ha petado’, vamos.

Por supuesto, esto nos puede pasar a todos – y nos pasará no pocas veces. ¿Qué hacer? Si tienes suerte y tus amigos también desarrollan, puedes pedirles que conecten con Eclipse y te envíen los logs del error. Pero lo mas habitual es que no lo sean. ¿Cómo saber qué ha sucedido? La respuesta es Informes de Fallos.

Qué es

ACRA es una librería perfecta para este problema. Nos permite que nuestra aplicación Android envíe informes de fallos configurables a dónde queramos. Por defecto, podemos hacer que una hoja de cálculo de gDocs reciba dichos datos y mostrarlos en un formulario.

Cómo usarlo

En cualquier app que tengamos, nos bastará con añadir la versión estable de la librería de esta lista – el jar que buscamos está en la carpeta build, no en la src, no os volváis locos como me pasó a mi – a la carpeta libs de nuestro proyecto. De no tenerla, se deberá crear una carpeta con dicho nombre en la raíz del proyecto. Tras ello habrá que añadirlo al Build Path con click derecho >  Build Path > add to Build Path.

Ahora que ya tenemos lista la librería, crearemos una clase nueva que herede de Application. El código sería tal que el siguiente:

package com.alberovalley.acratutorial;

import org.acra.ACRA;
import org.acra.ReportField;
import org.acra.ReportingInteractionMode;
import org.acra.annotation.ReportsCrashes;

import android.app.Application;

@ReportsCrashes(formKey = "la_clave_de_mi_formulario" ,
customReportContent = {  ReportField.REPORT_ID, ReportField.APP_VERSION_CODE   ,ReportField.APP_VERSION_NAME,
		ReportField.PACKAGE_NAME,
		ReportField.PHONE_MODEL, ReportField.BRAND, ReportField.ANDROID_VERSION,
		ReportField.BUILD, ReportField.TOTAL_MEM_SIZE, ReportField.AVAILABLE_MEM_SIZE,
		ReportField.STACK_TRACE, ReportField.INITIAL_CONFIGURATION,
		ReportField.CRASH_CONFIGURATION, ReportField.LOGCAT },
logcatArguments = { "-t", "100", "-v", "long","test:I" ,"*:D","*:S"},
mode = ReportingInteractionMode.TOAST,
resToastText = R.string.crash_toast_text)

public class MyApplication extends Application {
	@Override
    public void onCreate() {
        // The following line triggers the initialization of ACRA
        ACRA.init(this);
        super.onCreate();
    }

}

En este ejemplo estamos diciéndole a ACRA que nuestros informes de fallos los queremos con Version Code y Version Name y nombre de paquete de la app; modelo y marca del dispositivo (dice PHONE, pero las tablets existen); versión de Android del dispositivo; información de la configuración del dispositivo; memoria total y memoria libre del dispositivo; la pila o StackTrace; la configuración inicial y las trazas del LOGCAT.
Además, en los parámetros del LOGCAT establecemos, entre otras cosas, que nos mande hasta 100 líneas de las trazas. Podemos usar los mismos parámetros que el logcat de consola, añadiéndolos como elementos del array de cadenas.

Lo último que indicamos es que queremos que saque una notificación Toast cuando (si) se produce un fallo y el texto que queremos que tenga el mismo.

“la_clave_de_mi_formulario” la obtenemos, en nuestro caso, de google docs. Siguiendo las instrucciones de google, importaremos el fichero CrashReports-template.csv que traía el zip dónde obtuvimos el jar renombrándolo a nuestro criterio. Creamos un formulario con Herramientas > Formulario > Crear Formulario del menú de gDocs y guardamos el formulario. En la parte inferior de la ventana emergente nos saldrá un enlace que contiene, entre otras cosas, “formkey=la_clave_del_formulario”. Esa clave es la que deberemos incluir en el código de nuestra clase tipo Application.

Nota: El template trae mas campos de los que estoy usando aquí. ACRA hace muchas cosas, pero no pone los campos en el sitio que te esperas, sino que los pone por orden de petición, esto es, en el orden en el que los hemos puesto en el código. Es conveniente modificar el template para que se ajuste a nuestras necesidades y no nos volvamos locos preguntándonos por qué en el campo LOGCAT nos figura el nombre del paquete de la aplicación.

Tras todo ello, se inicializa ACRA en el onCreate de la aplicación.

En el Manifest tendremos que hacer un ligero cambio. En la etiqueta <application> tendremos que poner el atributo name y darle el valor del nombre de nuestra clase Application en la que configuramos ACRA. Un ejemplo:

<application
        android:icon="@drawable/launcher_icon"
        android:label="@string/app_name" android:name="MyApplication">

Ni que decir tiene que nuestra aplicación deberá tener permisos de acceso a Internet para poder enviarnos los datos, claro.

Con todo esto listo, ya sólo nos queda distribuir la aplicación y observar de tanto en tanto el formulario o la hoja de cálculo. Aquí podemos ver opciones adicionales: los distintos modos de interacción (mostrar o no una notificación y de qué tipo al enviar el informe); otros destinos para los datos que no sea gDocs; lo que puede contener el informe, etc.

Con esto ya tendremos acceso a las trazas y otros datos que consideremos pertinentes para el caso en que nuestra app fallara ‘misteriosamente’ en ciertos dispositivos, y podremos intentar desentrañar el problema para arreglarlo.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: