Remote logcat ohne die App zu ändern

Android-Protokolle für Abstürze oder Exceptions in der App sind manchmal schwer zu verstehen, wenn man das betroffene Gerät nicht zur Hand hat. Selbst wenn man die Möglichkeit hat, Absturz-Berichte über die Google Play Developer Konsole (wie hier beschrieben https://support.google.com/googleplay/android-developer/answer/9859174?hl=de) zu beziehen, hat man gelegentlich trotzdem das Problem, dass man einfach mehr braucht.

Als Android Entwickler wünsch man sich dann meistens, das logcat aus dem entsprechenden Gerät mit dem Problem zu bekommen, um z.B. einen vollständigen Stacktrace der Exception zu analysieren oder sogar live die Log-Ausgaben verfolgen zu können. 

Als ich selber vor Kurzem in diese Situation gekommen bin, dass mich jemand wegen einem Problem in einer App angerufen hat, musste ich mich entscheiden. Entweder ich sage einfach „It works on my machine“ oder ich finde eine Lösung, die logcat Ausgaben (idealerweise live) schnell und unkompliziert auf meinen Computer zu bekommen.

Nach kurzem Suchen bin ich dann auf die https://github.com/webadb/webadb.js (ADB host implementation based on WebUSB) Bibliothek gestoßen. Mit Hilfe dieser JavaScript Bibliothek kann man über die WebUSB-API beliebige adb Befehle im Browser direkt ausführen und die Ausgaben auf einen Webserver kopieren.

Gesagt, getan. 

Ein wenig JavaScript für den Upload der logcat Ausgaben (und ein paar Zeilen PHP) später war dann meine Remote Logcat Lösung für den Browser fertig.

Wichtig: Die remote Logcat Implementierung basiert auf der WebUSB Schnittstelle der Browser, die leider nicht vom allen Browser-Herstellern unterstützt wird. Welche Browser, WebUSB unterstützen kann man unter https://caniuse.com/webusb nachlesen – oder man nimmt einfach den Google Chrome 🙂 der kann irgendie immer alles was man so braucht.

How To:

Um Remote auf die Logcat Daten des entfernten Android Smartphones zugreifen zu können sind auf Seiten des Nutzers folgende Schritte nötig.

  • 1. Entwickleroptionen auf dem Android Gerät aktivieren
    Eine detaillierte Anleitung findet man z.B. unter https://www.heise.de/tipps-tricks/Android-Entwickleroptionen-aktivieren-deaktivieren-4041510.html
  • 2. USB Kabel anschließen 
    Wichtig, es muss unbedingt eine Datenkabel sein. Ein reines Ladekabel tut es hier nicht. Datenkabel sind meistens daran zu erkennen, dass auf dem USB Stecker das USB-Symbol aufgedruckt ist. Reine Ladekabel haben in den meisten Fällen das USB-Symbol nicht auf dem Stecker.
  • 3. Webseite aufrufen
    Im Browser (z.B. Google Chrome) die Webseite aufrufen, auf der die Remote Logcat Solution installiert ist.
  • 4. Verbinden
    Den Button „Connect“ drücken und im Popup Fenster das Android Gerät wählen mit dem sich die webadb verbinden soll.

Wichtig: Bei Jeder neuen Verbindung öffnet sich auf dem Android-Device der „USB-Debugging zulassen?“ Dialog. Den muss man natürlich zwingend bestätigen, damit die Verbindung über die Android Debug Bridge aufgebaut werden kann.

  • 5. Logcat starten
    Es gibt 2 Befehle, die als Default vorgeblendet werden.
    Der erste „shell:logcat -c“ dient dazu, den Logcat Buffer auf dem Smartphone zu löschen.
    Der zweite „shell:logcat“ überträgt die logcat Ausgabe in den Browser und auf den Server, bis man mit „Cancel“ die Übertragung beendet.

    Beide Befehle können nach belieben angepasst werden.
    Eigentlich ist hier alles möglich, was mit dem adb Befehl in den Platform-Tools auch möglich ist. Auch andere Befehle zum Auslesen der Batterie oder Filter für einzelne Apps sind hier ohne Probleme möglich. Alles wissenswerte zu den Möglichkeiten von adb kann man unter https://developer.android.com/studio/command-line/adb nachlesen.
  • Logcat Ausgaben
    Die Logcat Daten werden im Browser direkt ausgegeben und auf dem Server gespeichert. Von Dort können sie auf jedem anderen Computer im Netz zugegriffen werden

Für den einfachen zugriff gibt es im Unterverzeichnis „/admin/“ ein kleines PHP-Skript, dass alle bisher gespeicherten logcat Dateien nach Uhrzeit/Datum sortiert auflistet.

Hinweis: Falls kritische im logcat ausgegeben werden (Passwörter, API-Keys, etc.) sollte man den Zugriff auf jeden Fall beschränken.

Hinweis: Damit eine Verbindung über USB mit dem Handy aus dem Browser möglicch ist, darf auf dem des Nutzers kein adb Server laufen. Falls das doch der Fall ist wird man im Browser nach dem Connect darauf hingewiesen. In dem Fall muss der adb Server mit dem Befehl adb kill-server beendet werden.
Das ist normalerweise nicht nötig, da auf dem PC des Nutzers in der Regel kein adb installiert ist da es ja eher ein Entwickler-Tool ist :-).

Der komplette Sourcecode kann hier heruntergeladen werden:
https://github.com/msoftware/webadb-logcat

Eine Demo-Installation bei der ich den Upload der Daten auskommentiert habe kann unter https://logcat.jentsch.io/ aufgerufen werden. Wichtig: Bei der remote logcat Test-Installation unter https://logcat.jentsch.io/ werden ganz bewusst keine Daten auf den Server kopiert, um evtl. auftretenden Datenschutz-Problemen direkt aus dem Weg zu gehen. Die Version dient ausschließlich dem Test der Funktionalität.

PS: Die Remote logcat Webseite funktioniert natürlich auch mit anderen Geräten, die adb über USB unterstützen. Z.B. WearOS Smartwatches.