Automatisierte Android-Absturzberichte mit ACRA und Cloudant
Veröffentlicht: 2022-03-11Das Erstellen einer einfachen Android-App ist einfach. Andererseits kann es eine ziemliche Herausforderung sein, eine zuverlässige, skalierbare und robuste Android-App zu erstellen.
Angesichts Tausender verfügbarer Geräte von unzähligen verschiedenen Herstellern ist es bestenfalls naiv anzunehmen, dass ein einziger Codeabschnitt zuverlässig auf allen Telefonen funktioniert.
Die Segmentierung ist der größte Kompromiss für eine offene Plattform, und wir zahlen den Preis in Form der Codepflege, die noch lange nach der Produktionsphase einer App anhält.
Warum Android-Fehlermeldungen wichtig sind
Was passiert also, wenn eine Android-App abstürzt oder nicht mehr reagiert? Nun, das Dialogfeld „Schließen erzwingen“ erscheint und lässt den Benutzer wissen, dass etwas schief gelaufen ist. Wenn die App über Google Play heruntergeladen wurde, wird der Benutzer aufgefordert, den Absturz zu melden, indem er einen detaillierten Android-Absturzbericht (einschließlich Uhrzeit, Telefonmodell, Android-Version, Stacktrace usw.) sendet, den Sie (der Entwickler) einsehen können die Developer's Console, mit der Sie den Schuldigen Fehler beheben können.
Das klingt alles sehr nett – aber es gibt ein großes Problem bei der Verwendung der Standard-Fehlerberichterstattung von Android: Benutzer neigen dazu, nichts zu unternehmen, wenn ihre Apps abstürzen; Tatsächlich entscheidet sich die Mehrheit dafür, keine Android-Fehlerberichte zu senden. Wie können Sie als gewissenhafter Entwickler zuverlässige Einblicke in die Abstürze und Fehler Ihrer App gewinnen?
Wir stellen ACRA vor
ACRA steht für „Automated Crash Reporting for Android“. Es ist eine kostenlose Bibliothek, mit der Sie das Problem der „manuellen Fehlerberichterstattung“ mit ein paar Codezeilen lösen können. Sobald Sie die Bibliothek implementiert haben und alles ordnungsgemäß initialisiert wurde, können Sie dieselben Android-Fehlerprotokolle wie die Google-Standardeinstellung (plus eine Reihe zusätzlicher Anpassungsoptionen) automatisch und ohne dass der Benutzer Maßnahmen ergreifen muss, extrahieren.
Darüber hinaus können Sie mit ACRA auswählen, wie Sie den Benutzer über einen Android-Absturz informieren möchten, wobei die Standardeinstellung eine stille Hintergrundmeldung und Alternativen einschließlich benutzerdefinierter Dialoge sind.
Bis vor kurzem wurde ACRA von Google Spreadsheet unterstützt, was bedeutete, dass Sie alle Ihre Berichte in einer einzigen Datei erhalten konnten, die kostenlos auf Ihrem Google Drive-Konto gehostet wurde. Leider hat Google darum gebeten, diese Option in Zukunft nicht mehr zu verwenden, daher bleiben uns ein paar Alternativen zum Einsenden von Absturzberichtsdaten, von denen wir einige in diesem Tutorial behandeln werden:
- Standard-E-Mail (erfordert weiterhin Benutzerinteraktion).
- Benutzerdefinierter E-Mail-/HTTP-Client (erfordert umfangreiche Einrichtung).
- Benutzerdefiniertes Back-End (mit Optionen, die von kostenlosen bis hin zu kommerziellen Lösungen reichen).
In diesem Artikel analysieren wir eine dieser Lösungen: das Hosten Ihrer ACRA-Berichte auf einem Cloudant-Back-End und das Visualisieren der Daten mit acralyzer.
Einrichten eines Cloudant-Backends
Als erstes müssen wir ein Cloudant-Konto registrieren. Natürlich gibt es einen Haken: Die Dienste von Cloudant sind nicht völlig kostenlos, aber laut ihrer Preisseite ist es sehr unwahrscheinlich, dass Sie das monatliche Limit von 5 $ überschreiten (es sei denn, Sie haben eine riesige Benutzerbasis und eine Menge Fehler in Ihrem Code).
Sobald wir uns registriert haben, müssen wir verstehen, wie die Dinge funktionieren. Auf hoher Ebene wird unser Backend aus zwei Komponenten bestehen:
- Eine Speicherdatenbank oder genauer gesagt eine Apache CouchDB. CouchDB speichert seine Daten im JSON-Format, was bedeutet, dass alle Berichte, die vom Android-Gerät gesendet werden, dem Format entsprechen müssen, um als Eintrag eingefügt zu werden. Eine Datenbankeinfügung ist eine einfache HTTP POST- oder PUT-Anfrage.
- Eine Web-App (zur Analyse) oder genauer gesagt eine CouchApp. Dies ist eine einfache JavaScript-Anwendung, mit der Sie Abfragen ausführen und die in der CouchDB-Instanz gespeicherten Daten anzeigen können.
Damit unser Back-End ordnungsgemäß funktioniert, müssen wir diese beiden Komponenten einrichten. Theoretisch könnten wir die Datenbank und die App aus dem Quellcode erstellen und sie dann mit einem Tool in unserem Back-End bereitstellen – aber die guten Leute von ACRA haben das bereits für uns erledigt. Der einfachste Ansatz besteht also darin, eine Remote-Datenbank und eine Remote-App zu replizieren.
Machen wir weiter und replizieren eine leere ACRA CouchDB:
- Wählen Sie in Ihrem Cloudant-Dashboard den Abschnitt „Replikation“ aus.
- Wählen Sie als Quelldatenbank „Remote database“ mit http://get.acralyzer.com/distrib-acra-storage als URL aus.
- Wählen Sie als Zieldatenbank „Neue Datenbank“ und nennen Sie sie „acra-{myapp}“ (ohne Anführungszeichen). Beachten Sie, dass der Parameter {myapp} für Ihre App eindeutig sein sollte und dass der Datenbankname mit „acra-“ beginnen muss.
- Klicken Sie auf „Replizieren“.
Somit haben wir die Datenbank für die Berichtspeicherung erfolgreich repliziert. Als nächstes müssen wir die acralyzer CouchApp replizieren, damit wir die Daten visualisieren können:
- Wählen Sie in Ihrem Cloudant-Dashboard den Abschnitt „Replikation“ aus.
- Wählen Sie als Quelldatenbank „Remote database“ mit http://get.acralyzer.com/distrib-acralyzer als URL aus.
- Wählen Sie als Zieldatenbank „Neue Datenbank“ und nennen Sie sie „acralyzer“.
- Klicken Sie auf „Replizieren“.
Hinweis : Das Replizieren der acralyzer-App ist optional. Sie werden es nicht brauchen, wenn Sie nur daran interessiert sind, Ihren Android-Absturzbericht zu speichern, anstatt die Daten zu visualisieren (wir werden uns acralyzer im nächsten Abschnitt dieses Android-Tutorials genauer ansehen). Wenn Sie sich mit Ihren JavaScript-Kenntnissen sicher genug fühlen, könnten Sie sogar Ihre eigene Analyse-App schreiben! Aber das würde den Rahmen dieses Blogposts sprengen.
Der letzte Schritt des Ersteinrichtungsprozesses besteht darin, Sicherheitsberechtigungen hinzuzufügen. Cloudant bietet eine eigene Sicherheitsebene über CouchDB mit einer feineren Kontrolle über individuelle Rechte. Um also einen Bericht in unsere Datenbank zu schreiben, müssen wir ein Benutzerkonto mit Schreibberechtigungen erstellen:
- Wählen Sie in Ihrem Cloudant-Dashboard den Abschnitt „Datenbank“ aus.
- Klicken Sie auf den Berechtigungsabschnitt (Schlosssymbol) für die acra-{myapp}-Datenbank.
- Klicken Sie auf „API-Schlüssel generieren“.
- Notieren Sie sich den generierten Benutzernamen und das Passwort (wir werden sie später verwenden).
- Fügen Sie Schreibberechtigungen für den generierten Benutzernamen hinzu.
Visualisierung von Android-Absturzberichten mit acralyzer
Nach der Replikation kann auf das acralyzer-Dashboard einfach zugegriffen werden, indem https://{myapp}.cloudant.com/acralyzer/_design/acralyzer/index.html#/dashboard
. Ich gebe zu: Es ist nicht das schönste Analysetool da draußen, aber es erfüllt seinen Zweck.

Im oberen Menü können Sie auswählen, welche Datenbank Sie visualisieren möchten (es ist möglich, mehrere Datenbanken für verschiedene Apps in einem einzigen Projekt zu hosten; dies wirkt sich auf Ihre Nutzungsquote aus) und eine Vorschau der Daten im Haupt-Dashboard anzeigen. Sie können beispielsweise:
- Zeichnen Sie die Anzahl der Berichte nach Zeiteinheit (Stunde, Tag, Monat usw.).
- Zeigen Sie die Verteilung von Berichten nach Android-spezifischen Metriken an (Android-Version, SDK-Version, App-Version, Gerät usw.).
- Listen Sie alle Absturzberichte auf (mit einem detaillierten Stack-Trace) oder zeigen Sie alle Fehler an (hier ist ein „Fehler“ eine Gruppe identischer Berichte, die von verschiedenen Benutzern stammen).
- Zeigen Sie Details für einen einzelnen Fehler an und setzen Sie seinen Status auf behoben (falls behoben).
- Löschen Sie alte oder veraltete Einträge.
Beachten Sie, dass die für die Visualisierung verfügbaren Android-Absturzmetriken von den Berichten abhängen, die wir von unserer App senden. ACRA bietet eine Vielzahl von Berichtsfeldern, von denen einige ziemlich groß oder für die Fehlerbehebung nicht vollständig relevant sein können. Für die meisten Projekte sind die erforderlichen Berichtsfelder ausreichend. Diese schließen ein:
- APP_VERSION_CODE
- APP_VERSION_NAME
- ANDROID_VERSION
- PAKETNAMEN
- REPORT_ID
- BAUEN
- STACK_TRACE
Implementieren von ACRA in Ihrem Android-Projekt
Wie bereits in diesem Tutorial erwähnt, ist die Implementierung von ACRA sehr einfach und erfordert nur wenige schnelle Schritte.
Abhängigkeit hinzufügen
Zuerst müssen wir die Bibliothek auf eine der folgenden Arten als Abhängigkeit einbinden:
- Als .jar-Datei in Ihrem /libs-Ordner.
Als Maven-Abhängigkeit:
<dependency> <groupId>ch.acra</groupId> <artifactId>acra</artifactId> <version>XYZ</version> </dependency>
Als graduelle Abhängigkeit:
compile 'ch.acra:acra:XYZ'
Anwendungsklasse hinzufügen
Als Nächstes müssen wir unserem Projekt eine Android-Anwendungsklasse hinzufügen (oder eine vorhandene Klasse aktualisieren, da es nur eine Instanz geben kann) und sie in der AndroidManifest.xml deklarieren:
<application android:name=".MyApp" android:theme="@style/AppTheme"> ...
Und dort ACRA einrichten:
@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); } }
Das ist es! Natürlich müssen Sie alle {myapp}-Platzhalter durch tatsächliche Werte sowie Werte für formUriBasicAuthLogin
und formUriBasicAuthPassword
.
Wie Sie dem obigen Code-Snippet entnehmen können, verwenden wir nur die erforderlichen Berichtsfelder. Sie können gerne weitere Felder hinzufügen, die für Ihre Bewerbung relevant sein könnten.
Sie können auch PUT anstelle von POST verwenden. In diesem Fall wird die REPORT_ID
als Parameter an das Ende der former
angehängt.
Schließlich können Sie auch auswählen, wie der Benutzer über den Absturz der Android-App informiert wird, wobei die Standardeinstellung ein stiller Hintergrundbericht ist. In unserem Fall zeigen wir eine Toast-Nachricht an, die den Benutzer darüber informiert, dass der Absturz gemeldet wurde und bald eine Fehlerbehebung verfügbar sein sollte.
Brauchen Sie Hilfe? Hier ist ein Beispielprojekt
Um ACRA in Aktion zu sehen, habe ich das Repo acra_example auf GitHub eingerichtet. Es verfügt über eine einfache App, die ACRA beim Start initialisiert und Sie durch Drücken einer Taste zum Absturz bringen lässt (was dann eine Nullzeiger-Ausnahme auslöst). Die Absturzdaten werden an eine beispielhafte Cloudant-Datenbank gesendet, die hier visualisiert werden kann.
Um die Daten einzusehen, melden Sie sich mit den folgenden Zugangsdaten an:
- Benutzername: medo
- Passwort: acraexample
Alternativen zu ACRA
ACRA ist nicht die einzige Option für die automatisierte Android-Fehlerberichterstattung. Da Abstürze unvermeidlich sind, gibt es einen großen Business-to-Developer (B2D)-Markt, der versucht, ihre Lösung zu monetarisieren.
Crittercism zum Beispiel ist eine sehr ausgereifte Plattform für die Meldung von Abstürzen. Es sieht toll aus, bietet eine Reihe von Optionen zur Datenanalyse und ist sehr einfach zu integrieren. Der einzige Nachteil: der Preis und die kostenlose Testversion ist in Bezug auf die Anzahl der aktiven Benutzer, die Tage der Datenspeicherung und den Support ziemlich begrenzt). BugSense ist ein ähnlicher Dienst.
Meiner Meinung nach ist Crashlytics jedoch eine überlegene Lösung. Bis vor kurzem hatte Crashlytics ein Freemium-Modell (mit einer kostenpflichtigen Premium-Stufe); aber jetzt (nach ihrer Übernahme durch Twitter) sind alle ehemaligen Premium-Funktionen kostenlos verfügbar. Es gibt keine Nutzungskosten, Gebühren oder Limits. Dies ist das bevorzugte Mittel zur Fehlerberichterstattung für viele hochkarätige und hochrangige Unternehmen und Entwickler, da es sehr einfach zu bedienen ist und leistungsstarke Analyse- und Visualisierungstools bietet. Es lässt sich sogar als Plugin in die gängigsten IDEs integrieren (z. B. Eclipse, Android Studio), sodass das Hinzufügen von Crashlytics zu Ihrer App so einfach ist wie das Auswählen eines Projekts und das Drücken einer Schaltfläche. Mit diesen Plugins können Sie auch Absturzberichte von Ihrer IDE verfolgen, ohne einen Browser öffnen zu müssen.
Warum also ACRA verwenden, wenn es andere Alternativen gibt, die viel besser aussehen und mehr Funktionen für den gleichen Implementierungsaufwand bieten? Ich nenne Ihnen zwei Gründe.
Alle diese anderen Optionen sind proprietäre Closed-Source-Software . Selbst mit einem Korb voller EULAs können Sie nicht genau wissen, wie Ihre Daten erfasst und behandelt werden. Andererseits sind ACRA und acralyzer Open-Source-Projekte, die auf GitHub gehostet werden und die Sie einfach forken und an Ihre Bedürfnisse anpassen können.
Datenmobilität . Angenommen, Sie sind mit Cloudant unzufrieden. Es ist ein Kinderspiel, Ihre Daten zu replizieren und zu einem anderen Back-End zu migrieren. Die Daten bleiben garantiert bei Ihnen .
Wie bei vielen Entscheidungen läuft auch diese auf persönliche Vorlieben und Vertrautheit hinaus. Sehen Sie sich diesen Google+ Thread an, um weitere Diskussionen über die verschiedenen verfügbaren Alternativen zu erhalten, um Ihre App zuverlässiger zu machen.
Abschließend
ACRA ist eine äußerst robuste und hochgradig anpassbare Bibliothek, die zusammen mit Cloudant und acralyzer verwendet werden kann, um kostenlose, automatisierte Absturzberichte und grundlegende Analysen für Ihre App zu erhalten, und das alles bei minimalem Implementierungsaufwand.
Das Schreiben von zuverlässigem Android-Code erfordert viel Erfahrung und Weitsicht, aber keiner von uns ist wirklich allwissend. Seien Sie auf unerwartete Abstürze und Fehler vorbereitet und bereit, das Unerwartete so schnell wie möglich zu beheben . Das ist die Art von Arbeit, die in großartige Produkte und großartige Benutzererlebnisse fließt.