Informes automatizados de fallas de Android con ACRA y Cloudant
Publicado: 2022-03-11Hacer una aplicación básica de Android es fácil. Por otro lado, crear una aplicación de Android confiable, escalable y robusta puede ser todo un desafío.
Con miles de dispositivos disponibles bombeados de toneladas de diferentes fabricantes, suponer que una sola pieza de código funcionará de manera confiable en todos los teléfonos es, en el mejor de los casos, ingenuo.
La segmentación es la mayor compensación por tener una plataforma abierta, y pagamos el precio en la moneda del mantenimiento del código, que continúa mucho después de que una aplicación haya pasado la etapa de producción.
Por qué es importante el informe de errores de Android
Entonces, ¿qué sucede cuando una aplicación de Android falla o deja de responder? Bueno, aparece el cuadro de diálogo "Forzar cierre", que le permite al usuario saber que algo salió mal. Si la aplicación se descargó a través de Google Play, se le pedirá al usuario que informe del bloqueo mediante el envío de un informe detallado del bloqueo de Android (que incluye la hora, el modelo de teléfono, la versión de Android, el seguimiento de la pila, etc.) que usted (el desarrollador) puede ver en la Consola del desarrollador, lo que le permite abordar el error culpable.
Todo esto suena muy bien, pero hay un gran problema con el uso del informe de errores predeterminado de Android: los usuarios tienden a no tomar medidas cuando sus aplicaciones fallan; de hecho, la mayoría elige no enviar informes de errores de Android. Entonces, ¿cómo puede usted, como desarrollador concienzudo, obtener información confiable sobre los bloqueos y fallas de su aplicación?
Introduciendo ACRA
ACRA significa "Informe automático de fallas para Android". Es una biblioteca gratuita que le permite resolver el problema del "informe manual de errores" con unas pocas líneas de código. Una vez que haya implementado la biblioteca y todo se haya inicializado correctamente, podrá extraer los mismos registros de error de Android que los predeterminados de Google (más un montón de opciones de personalización adicionales) automáticamente y sin necesidad de que el usuario tome medidas.
Más allá de eso, ACRA le permite elegir cómo le gustaría informar al usuario de un bloqueo de Android, siendo el informe de fondo silencioso el valor predeterminado y las alternativas incluyen cuadros de diálogo personalizados.
Hasta hace poco, ACRA estaba respaldado por Google Spreadsheet, lo que significaba que podía recibir todos sus informes en un solo archivo, alojado de forma gratuita en su cuenta de Google Drive. Desafortunadamente, Google solicitó que no usemos esta opción en el futuro, por lo que nos quedan un par de alternativas para enviar datos de informes de fallas, algunas de las cuales cubriremos en este tutorial:
- Correo electrónico estándar (todavía requiere la interacción del usuario).
- Correo electrónico personalizado/cliente HTTP (requiere una configuración extensa).
- Back-end personalizado (con opciones que van desde soluciones gratuitas hasta soluciones comerciales).
En este artículo, analizaremos una de estas soluciones: hospedar sus informes ACRA en un back-end de Cloudant y visualizar los datos con acralyzer.
Configuración de un back-end de Cloudant
Lo primero que debemos hacer es registrar una cuenta en Cloudant. Por supuesto, hay una trampa: los servicios de Cloudant no son completamente gratuitos, pero de acuerdo con su página de precios, es muy poco probable que exceda el límite mensual de $5 (a menos que tenga una gran base de usuarios y muchos errores en su código).
Una vez que nos hemos registrado, necesitamos entender cómo funcionan las cosas. A un alto nivel, nuestro back-end constará de dos componentes:
- Una base de datos de almacenamiento o, para ser más precisos, un Apache CouchDB. CouchDB almacena sus datos en formato JSON, lo que significa que todos los informes enviados desde el dispositivo Android deben coincidir con el formato para poder insertarse como una entrada. Una inserción de base de datos es una simple solicitud HTTP POST o PUT.
- Una aplicación web (para análisis) o, para ser más precisos, una CouchApp. Esta es una aplicación de JavaScript simple que le permite ejecutar consultas y mostrar los datos almacenados en la instancia de CouchDB.
Para que nuestro back-end funcione correctamente, necesitaremos configurar estos dos componentes. En teoría, podríamos construir la base de datos y la aplicación desde la fuente y luego usar una herramienta para implementarlas en nuestro back-end, pero la buena gente de ACRA ya lo hizo por nosotros. Entonces, el enfoque más fácil es replicar una base de datos remota y una aplicación remota.
Sigamos adelante y repliquemos un ACRA CouchDB vacío:
- Seleccione la sección 'Replicación' en su panel de Cloudant.
- Como base de datos de origen, seleccione 'Base de datos remota' con http://get.acralyzer.com/distrib-acra-storage como URL.
- Como base de datos de destino, seleccione 'Nueva base de datos' y asígnele el nombre "acra-{myapp}" (sin las comillas). Tenga en cuenta que el parámetro {myapp} debe ser exclusivo de su aplicación y que el nombre de la base de datos debe comenzar con "acra-".
- Haga clic en 'Replicar'.
Por lo tanto, hemos replicado con éxito la base de datos para el almacenamiento de informes. A continuación, necesitamos replicar el acralyzer CouchApp para que podamos visualizar los datos:
- Seleccione la sección 'Replicación' en su panel de Cloudant.
- Como base de datos de origen, seleccione 'Base de datos remota' con http://get.acralyzer.com/distrib-acralyzer como URL.
- Como base de datos de destino, seleccione 'Nueva base de datos' y asígnele el nombre "acralyzer".
- Haga clic en 'Replicar'.
Nota : replicar la aplicación acralyzer es opcional. No lo necesitará si solo está interesado en almacenar su informe de bloqueo de Android, en lugar de visualizar los datos (echaremos un vistazo más de cerca a acralyzer en la siguiente sección de este tutorial de Android). Si se siente lo suficientemente seguro con sus habilidades de JavaScript, ¡incluso podría escribir su propia aplicación de análisis! Pero eso está fuera del alcance de esta publicación de blog.
El último paso del proceso de configuración inicial es agregar permisos de seguridad. Cloudant proporciona su propia capa de seguridad sobre CouchDB con un control más preciso de los derechos individuales, por lo que para escribir un informe en nuestra base de datos necesitamos crear una cuenta de usuario con permisos de escritura:
- Seleccione la sección 'Base de datos' en su panel de Cloudant.
- Haga clic en la sección de permisos (icono de candado) para la base de datos acra-{myapp}.
- Haga clic en 'Generar claves API'.
- Anote el nombre de usuario y la contraseña generados (los usaremos más adelante).
- Agregue permisos de escritura para el nombre de usuario generado.
Visualización de informes de fallas de Android con acralyzer
Una vez replicado, se puede acceder fácilmente al panel de acralyzer siguiendo https://{myapp}.cloudant.com/acralyzer/_design/acralyzer/index.html#/dashboard
. Lo admito: no es la herramienta de análisis más bonita que existe, pero cumple su propósito.

Desde el menú superior, puede seleccionar qué base de datos desea visualizar (es posible alojar múltiples bases de datos para diferentes aplicaciones en un solo proyecto; esto afectará su cuota de uso) y obtener una vista previa de los datos en el tablero principal. Por ejemplo, puedes:
- Grafique el número de informes por unidad de tiempo (hora, día, mes, etc.).
- Vea la distribución de informes por métricas específicas de Android (versión de Android, versión de SDK, versión de la aplicación, dispositivo, etc.).
- Enumere todos los informes de fallas (con un seguimiento detallado de la pila) o vea todos los errores (aquí, un "error" es un grupo de informes idénticos provenientes de diferentes usuarios).
- Obtenga una vista previa de los detalles de un solo error y establezca su estado como resuelto (si se corrigió).
- Purgar entradas antiguas u obsoletas.
Tenga en cuenta que las métricas de fallas de Android disponibles para la visualización dependerán de los informes que elijamos enviar desde nuestra aplicación. ACRA ofrece una variedad de campos de informes, algunos de los cuales pueden ser bastante grandes o no ser completamente relevantes para la corrección de errores. Para la mayoría de los proyectos, los campos de informe requeridos serán suficientes. Éstos incluyen:
- APP_VERSION_CODE
- APLICACIÓN_VERSION_NOMBRE
- VERSIÓN DE ANDROID
- NOMBRE DEL PAQUETE
- REPORT_ID
- CONSTRUIR
- STACK_TRACE
Implementando ACRA en su proyecto de Android
Como se mencionó anteriormente en este tutorial, implementar ACRA es muy fácil y solo requiere unos pocos pasos rápidos.
Agregar dependencia
Primero, necesitamos incluir la biblioteca como una dependencia de una de las siguientes maneras:
- Como un archivo .jar en su carpeta /libs.
Como una dependencia experta:
<dependency> <groupId>ch.acra</groupId> <artifactId>acra</artifactId> <version>XYZ</version> </dependency>
Como una dependencia gradle:
compile 'ch.acra:acra:XYZ'
Agregar clase de aplicación
A continuación, debemos agregar una clase de aplicación de Android a nuestro proyecto (o actualizar una clase existente, ya que solo puede haber una instancia) y declararla en AndroidManifest.xml:
<application android:name=".MyApp" android:theme="@style/AppTheme"> ...
Y configure ACRA allí:
@ReportsCrashes( formUri = "https://{myusername}.cloudant.com/acra-{myapp}/_design/acra-storage/_update/report", reportType = HttpSender.Type.JSON, httpMethod = HttpSender.Method.POST, formUriBasicAuthLogin = "GENERATED_USERNAME_WITH_WRITE_PERMISSIONS", formUriBasicAuthPassword = "GENERATED_PASSWORD", formKey = "", // This is required for backward compatibility but not used customReportContent = { ReportField.APP_VERSION_CODE, ReportField.APP_VERSION_NAME, ReportField.ANDROID_VERSION, ReportField.PACKAGE_NAME, ReportField.REPORT_ID, ReportField.BUILD, ReportField.STACK_TRACE }, mode = ReportingInteractionMode.TOAST, resToastText = R.string.toast_crash ) public class MainApp extends Application { @Override public void onCreate() { super.onCreate(); // The following line triggers the initialization of ACRA ACRA.init(this); } }
¡Eso es todo! Por supuesto, deberá reemplazar todos los marcadores de posición {myapp} con valores reales, así como valores para formUriBasicAuthLogin
y formUriBasicAuthPassword
.
Como puede ver en el fragmento de código anterior, solo estamos usando los campos de informe obligatorios. Siéntase libre de agregar cualquier otro campo que pueda ser relevante para su aplicación.
También puede elegir usar PUT en lugar de POST. En ese caso, el REPORT_ID
se agregará al final del former
como parámetro.
Finalmente, también puede elegir cómo se informa al usuario sobre el bloqueo de la aplicación de Android, siendo el predeterminado un informe de fondo silencioso. En nuestro caso, elegimos mostrar un mensaje Toast que le informa al usuario que se informó el bloqueo y que pronto estará disponible una corrección de errores.
¿Necesitas ayuda? Aquí hay un proyecto de muestra
Para ver ACRA en acción, configuré el repositorio acra_example en GitHub. Cuenta con una aplicación simple que inicializa ACRA al inicio y le permite bloquearlo presionando un botón (que luego activa una excepción de puntero nulo). Los datos del bloqueo se envían a una base de datos Cloudant de ejemplo que se puede visualizar aquí.
Para ver los datos, inicie sesión con las siguientes credenciales:
- Nombre de usuario: medo
- Contraseña: acraejemplo
Alternativas a ACRA
ACRA no es la única opción para el informe automatizado de errores de Android. Dado que es probable que ocurran fallas, existe un gran mercado de empresa a desarrollador (B2D) que intenta monetizar su resolución.
Crittercism, por ejemplo, es una plataforma muy madura para informar sobre fallas. Se ve muy bien, ofrece un montón de opciones para el análisis de datos y es muy fácil de integrar. El único inconveniente: el precio, y la versión de prueba gratuita es bastante limitada en términos de número de usuarios activos, días de retención de datos y soporte). BugSense es un servicio similar.
En mi opinión, sin embargo, Crashlytics es una solución superior. Hasta hace poco, Crashlytics tenía un modelo freemium (con un nivel premium de pago); pero ahora (después de su adquisición por parte de Twitter), todas las funciones anteriormente premium están disponibles de forma gratuita. No hay costos de uso, tarifas o límites. Este es el medio preferido de informe de errores para muchas empresas y desarrolladores de alto perfil y alto rango, ya que es muy fácil de usar y ofrece potentes herramientas de análisis y visualización. Incluso se integra con los IDE más populares como un complemento (por ejemplo, Eclipse, Android Studio), por lo que agregar Crashlytics a su aplicación es tan simple como seleccionar un proyecto y presionar un botón. Estos complementos también le permiten realizar un seguimiento de los informes de fallas de su IDE sin tener que abrir un navegador.
Entonces, ¿por qué usar ACRA cuando existen otras alternativas que se ven mucho mejor y ofrecen más funciones para el mismo esfuerzo de implementación? Te daré dos razones.
Todas estas otras opciones son de código cerrado, software propietario . Incluso con una canasta llena de EULA, no puede estar seguro de cómo se recopilan y manejan sus datos exactamente. Por otro lado, ACRA y acralyzer son proyectos de código abierto alojados en GitHub que puede bifurcar y adaptar fácilmente a sus necesidades.
Movilidad de datos . Digamos que no está satisfecho con Cloudant. Es muy fácil replicar y migrar sus datos a otro back-end. Tiene la garantía de que los datos siguen siendo suyos .
Al igual que con muchas opciones, esta se reduce a la preferencia personal y la familiaridad. Consulte este hilo de Google+ para obtener más información sobre las diversas alternativas disponibles para hacer que su aplicación sea más confiable.
En conclusión
ACRA es una biblioteca altamente robusta y altamente personalizable que se puede utilizar junto con Cloudant y acralyzer para lograr informes de fallas automatizados y gratuitos y análisis básicos para su aplicación, todo con un esfuerzo de implementación mínimo.
Escribir un código confiable de Android requiere mucha experiencia y previsión, pero ninguno de nosotros es verdaderamente omnisciente. Esté preparado para fallas y errores inesperados, y esté listo para arreglar lo inesperado lo antes posible. Ese es el tipo de trabajo que se dedica a productos excelentes y experiencias de usuario excelentes.