Rapporti di crash Android automatizzati con ACRA e Cloudant
Pubblicato: 2022-03-11Creare un'app Android di base è facile. Realizzare un'app Android affidabile, scalabile e robusta, d'altra parte, può essere piuttosto impegnativo.
Con migliaia di dispositivi disponibili pompati da tonnellate di produttori diversi, presumere che un singolo pezzo di codice funzionerà in modo affidabile su tutti i telefoni è nella migliore delle ipotesi ingenuo.
La segmentazione è il più grande compromesso per avere una piattaforma aperta e paghiamo il prezzo nella valuta della manutenzione del codice, che continua molto tempo dopo che un'app ha superato la fase di produzione.
Perché la segnalazione degli errori Android è importante
Quindi, cosa succede quando un'app Android si arresta in modo anomalo o non risponde? Bene, viene visualizzata la finestra di dialogo "Chiusura forzata", che informa l'utente che qualcosa è andato storto. Se l'app è stata scaricata tramite Google Play, all'utente verrà chiesto di segnalare l'arresto anomalo inviando un rapporto dettagliato sull'arresto anomalo di Android (inclusi ora, modello di telefono, versione Android, traccia dello stack, ecc.) che tu (lo sviluppatore) puoi visualizzare in la Developer's Console, che ti consente di risolvere il bug colpevole.
Sembra tutto molto bello, ma c'è un grosso problema con l'utilizzo della segnalazione degli errori predefinita di Android: gli utenti tendono a non agire quando le loro app si arrestano in modo anomalo; infatti, la maggioranza sceglie di non inviare segnalazioni di errori Android. Come puoi allora, come sviluppatore coscienzioso, ottenere informazioni affidabili sugli arresti anomali e sugli errori della tua app?
Presentazione di ACRA
ACRA sta per "Segnalazione automatica degli arresti anomali per Android". È una libreria gratuita che ti consente di risolvere il problema della "segnalazione manuale degli errori" con poche righe di codice. Una volta che hai implementato la libreria e tutto è stato inizializzato correttamente, sarai in grado di estrarre gli stessi log degli errori Android come quelli predefiniti di Google (più un sacco di opzioni di personalizzazione aggiunte) automaticamente e senza richiedere all'utente di agire.
Oltre a ciò, ACRA ti consente di scegliere come informare l'utente di un arresto anomalo di Android, con l'impostazione predefinita di segnalazione in background silenziosa e alternative tra cui finestre di dialogo personalizzate.
Fino a poco tempo, ACRA era supportato da Google Spreadsheet, il che significava che potevi ricevere tutti i tuoi rapporti in un unico file, ospitato gratuitamente sul tuo account Google Drive. Sfortunatamente, Google ha richiesto di non utilizzare questa opzione in futuro, quindi ci rimangono un paio di alternative per inviare i dati dei rapporti sugli arresti anomali, alcuni dei quali tratteremo in questo tutorial:
- Email standard (richiede ancora l'interazione dell'utente).
- Client email/HTTP personalizzato (richiede una configurazione completa).
- Back-end personalizzato (con opzioni che vanno da soluzioni gratuite a soluzioni commerciali).
In questo articolo analizzeremo una di queste soluzioni: ospitare i tuoi report ACRA su un back-end Cloudant e visualizzare i dati con acralyzer.
Configurazione di un back-end Cloudant
La prima cosa che dobbiamo fare è registrare un account Cloudant. Naturalmente, c'è un problema: i servizi di Cloudant non sono del tutto gratuiti, ma in base alla loro pagina dei prezzi è molto improbabile che supererai il limite mensile di $ 5 (a meno che tu non abbia un'enorme base di utenti e un sacco di bug nel tuo codice).
Una volta registrati, dobbiamo capire come funzionano le cose. Ad alto livello, il nostro back-end sarà composto da due componenti:
- Un database di archiviazione o, per essere più precisi, un Apache CouchDB. CouchDB memorizza i suoi dati in formato JSON, il che significa che tutti i report inviati dal dispositivo Android devono corrispondere al formato per poter essere inseriti come voce. Un inserimento nel database è una semplice richiesta HTTP POST o PUT.
- Una web app (per analisi) o, per essere più precisi, una CouchApp. Questa è una semplice applicazione JavaScript che ti consente di eseguire query e visualizzare i dati archiviati nell'istanza CouchDB.
Affinché il nostro back-end funzioni correttamente, dovremo configurare questi due componenti. In teoria, potremmo creare il database e l'app dal sorgente e quindi utilizzare uno strumento per distribuirli al nostro back-end, ma la brava gente di ACRA lo ha già fatto per noi. Quindi l'approccio più semplice è replicare un database remoto e un'app remota.
Andiamo avanti e replichiamo un ACRA CouchDB vuoto:
- Seleziona la sezione "Replica" nella dashboard di Cloudant.
- Come database di origine, seleziona "Database remoto" con http://get.acralyzer.com/distrib-acra-storage come URL.
- Come database di destinazione, seleziona "Nuovo database" e chiamalo "acra-{myapp}" (senza virgolette). Tieni presente che il parametro {myapp} deve essere univoco per la tua app e che il nome del database deve iniziare con "acra-".
- Fare clic su "Replica".
Pertanto, abbiamo replicato correttamente il database per l'archiviazione dei report. Successivamente, dobbiamo replicare l'acralyzer CouchApp in modo da poter visualizzare i dati:
- Seleziona la sezione "Replica" nella dashboard di Cloudant.
- Come database di origine, seleziona "Database remoto" con http://get.acralyzer.com/distrib-acralyzer come URL.
- Come database di destinazione, seleziona "Nuovo database" e chiamalo "acralyzer".
- Fare clic su "Replica".
Nota : la replica dell'app acralyzer è facoltativa. Non ti servirà se sei interessato solo a memorizzare il rapporto sugli arresti anomali Android, piuttosto che visualizzare i dati (daremo un'occhiata più da vicino a acralyzer nella prossima sezione di questo tutorial Android). Se ti senti abbastanza sicuro delle tue abilità JavaScript, potresti persino scrivere la tua app di analisi! Ma questo esula dallo scopo di questo post sul blog.
L'ultimo passaggio del processo di configurazione iniziale consiste nell'aggiungere le autorizzazioni di sicurezza. Cloudant fornisce il proprio livello di sicurezza su CouchDB con un controllo più preciso sui diritti individuali, quindi per scrivere un report nel nostro database è necessario creare un account utente con autorizzazioni di scrittura:
- Seleziona la sezione "Database" nella dashboard di Cloudant.
- Fare clic sulla sezione dei permessi (icona del lucchetto) per il database acra-{myapp}.
- Fai clic su "Genera chiavi API".
- Annota il nome utente e la password generati (li useremo in seguito).
- Aggiungi i permessi di scrittura per il nome utente generato.
Visualizzazione dei rapporti sugli arresti anomali Android con acralyzer
Una volta replicato, è possibile accedere facilmente alla dashboard di acralyzer seguendo https://{myapp}.cloudant.com/acralyzer/_design/acralyzer/index.html#/dashboard
. Lo ammetto: non è lo strumento di analisi più carino in circolazione, ma serve al suo scopo.

Dal menu in alto, puoi selezionare quale database vuoi visualizzare (è possibile ospitare più database per diverse app in un unico progetto; questo influirà sulla tua quota di utilizzo) e visualizzare in anteprima i dati nella dashboard principale. Ad esempio, puoi:
- Tracciare il numero di rapporti per unità di tempo (ora, giorno, mese, ecc.).
- Visualizza la distribuzione dei rapporti in base a metriche specifiche per Android (versione Android, versione SDK, versione app, dispositivo e così via).
- Elenca tutti i rapporti sugli arresti anomali (con una traccia dettagliata dello stack) o visualizza tutti i bug (qui, un "bug" è un gruppo di rapporti identici provenienti da utenti diversi).
- Visualizza in anteprima i dettagli per un singolo bug e impostane lo stato come risolto (se corretto).
- Elimina le voci vecchie o obsolete.
Tieni presente che le metriche di arresto anomalo di Android disponibili per la visualizzazione dipenderanno dai rapporti che scegliamo di inviare dalla nostra app. ACRA offre una varietà di campi di report, alcuni dei quali possono essere di dimensioni piuttosto grandi o non completamente rilevanti per la correzione dei bug. Per la maggior parte dei progetti, i campi del report richiesti saranno sufficienti. Questi includono:
- APP_VERSION_CODE
- APP_VERSION_NAME
- ANDROID_VERSIONE
- NOME DEL PACCHETTO
- REPORT_ID
- COSTRUIRE
- STACK_TRACE
Implementazione di ACRA nel tuo progetto Android
Come accennato in precedenza in questo tutorial, l'implementazione di ACRA è molto semplice e richiede solo pochi rapidi passaggi.
Aggiungi dipendenza
Innanzitutto, dobbiamo includere la libreria come dipendenza in uno dei seguenti modi:
- Come file .jar nella tua cartella /libs.
Come dipendenza da esperti:
<dependency> <groupId>ch.acra</groupId> <artifactId>acra</artifactId> <version>XYZ</version> </dependency>
Come dipendenza gradle:
compile 'ch.acra:acra:XYZ'
Aggiungi la classe dell'applicazione
Successivamente, dobbiamo aggiungere una classe di applicazione Android al nostro progetto (o aggiornare una classe esistente, poiché può esserci solo un'istanza) e dichiararla in AndroidManifest.xml:
<application android:name=".MyApp" android:theme="@style/AppTheme"> ...
E imposta ACRA lì:
@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); } }
Questo è tutto! Ovviamente, dovrai sostituire tutti i segnaposto {myapp} con valori effettivi, oltre ai valori per formUriBasicAuthLogin
e formUriBasicAuthPassword
.
Come puoi vedere dallo snippet di codice sopra, stiamo utilizzando solo i campi del rapporto obbligatori. Sentiti libero di aggiungere qualsiasi altro campo che potrebbe essere rilevante per la tua applicazione.
Puoi anche scegliere di utilizzare PUT invece di POST. In tal caso, il REPORT_ID
verrà aggiunto alla fine del former
come parametro.
Infine, puoi anche scegliere in che modo l'utente viene informato dell'arresto anomalo dell'app Android, l'impostazione predefinita è un rapporto in background silenzioso. Nel nostro caso, scegliamo di visualizzare un messaggio Toast per informare l'utente che l'arresto anomalo è stato segnalato e che dovrebbe essere presto disponibile una correzione del bug.
Ho bisogno di aiuto? Ecco un progetto di esempio
Per vedere ACRA in azione, ho impostato il repository acra_example su GitHub. È dotato di una semplice app che inizializza ACRA all'avvio e ti consente di bloccarlo premendo un pulsante (che quindi attiva un'eccezione del puntatore nullo). I dati del crash vengono inviati a un database Cloudant di esempio che può essere visualizzato qui.
Per visualizzare i dati, effettuare il login con le seguenti credenziali:
- Nome utente: medo
- Password: acraesempio
Alternative all'ACRA
ACRA non è l'unica opzione per la segnalazione automatica degli errori Android. Poiché è inevitabile che si verifichino arresti anomali, esiste un grande mercato B2D (business-to-developer) che tenta di monetizzare la loro risoluzione.
Crittercism, ad esempio, è una piattaforma molto matura per la segnalazione di arresti anomali. Ha un bell'aspetto, offre un sacco di opzioni per l'analisi dei dati ed è molto facile da integrare. L'unico aspetto negativo: il prezzo e la prova gratuita è abbastanza limitata in termini di numero di utenti attivi, giorni di conservazione dei dati e supporto). BugSense è un servizio simile.
A mio parere, tuttavia, Crashlytics è una soluzione superiore. Fino a poco tempo, Crashlytics aveva un modello freemium (con un livello premium a pagamento); ma ora (dopo la loro acquisizione da parte di Twitter), tutte le funzionalità precedentemente premium sono disponibili gratuitamente. Non ci sono costi di utilizzo, commissioni o limiti. Questo è il mezzo preferito per la segnalazione degli errori per molte aziende e sviluppatori di alto profilo e di alto livello, poiché è molto facile da usare e offre potenti strumenti di analisi e visualizzazione. Si integra anche con gli IDE più diffusi come plug-in (ad es. Eclipse, Android Studio), quindi aggiungere Crashlytics alla tua app è semplice come selezionare un progetto e premere un pulsante. Questi plugin ti consentono anche di tenere traccia dei rapporti sugli arresti anomali dal tuo IDE senza dover aprire un browser.
Allora, perché usare ACRA quando ci sono altre alternative là fuori che sembrano molto migliori e offrono più funzionalità per lo stesso sforzo di implementazione? Ti do due ragioni.
Tutte queste altre opzioni sono software proprietario e closed source . Anche con un carrello pieno di EULA, non puoi essere sicuro di come vengono raccolti e gestiti i tuoi dati. D'altra parte, ACRA e acralyzer sono progetti open source ospitati su GitHub che puoi facilmente forkare e adattare alle tue esigenze.
Mobilità dei dati . Diciamo che non sei soddisfatto di Cloudant. È un gioco da ragazzi replicare e migrare i tuoi dati su un altro back-end. Hai la garanzia che i dati rimarranno tuoi .
Come per molte scelte, questa si riduce alle preferenze e alla familiarità personali. Dai un'occhiata a questo thread di Google+ per ulteriori discussioni sulle varie alternative disponibili per rendere la tua app più affidabile.
In conclusione
ACRA è una libreria altamente robusta e altamente personalizzabile che può essere utilizzata insieme a Cloudant e acralyzer per ottenere rapporti sugli arresti anomali gratuiti e automatizzati e analisi di base per la tua app, il tutto con il minimo sforzo di implementazione.
Scrivere codice Android affidabile richiede molta esperienza e lungimiranza, ma nessuno di noi è veramente onnisciente. Preparati agli arresti anomali e agli errori imprevisti e preparati a correggere gli imprevisti il prima possibile. Questo è il tipo di lavoro che riguarda ottimi prodotti e ottime esperienze utente.