Backup von Apps mit ADB anlegen und geschützte Apps wie Signal migrieren
(Update 8.10.2016)

Posted on Sunday, 31 July 2016 in Android
Last modified on 08 October 2016

Mit der Android Debugging Bridge (ADB) kann man nahezu alles mit seinem Android-Smartphone anstellen. Ist das ADB-Debugging in den Entwickleroptionen des Android-Systems aktiviert, muss das Gerät nur per USB an einen PC angeschlossen werden, auf dem am besten das Android SDK installiert ist, und schon kann es losgehen. Mit adb devices kann sichergestellt werden, dass die Verbindung zum Smartphone funktioniert. Idealerweise sollte eine Ausgabe mit einem Hash gefolgt von "device" erscheinen. Ist dies nicht der Fall, kann über die ADB keine Verbindung erlangt werden.

Aktuell geht es mir gezielt um Backups, da ich Daten von meinem alten Smartphone auf mein neues migrieren möchte. Dazu bietet adb einige praktische Optionen an.

Backups via ADB

Generell ist es mit adb möglich, beliebig umfangreiche Backups anzulegen. Voraussetzung dafür ist mindestens Android 4. Neben einem umfangreichen Backup aller Daten

$ adb backup -apk -shared -all -f full_backup.ab

oder ohne die System-Partition

$ adb backup -apk -shared -all -nosystem -f backup_nosystem.ab

über eine Sicherung aller Apps (die Backups erlauben)

$ adb backup -apk -all -nosystem -f backup_apps.ab

ist es auch möglich, Backups einzelner Apps anzulegen. Dies ist gerade dann sinnvoll, wenn nur ausgewählte Apps gesichert werden sollen, um Altlasten loszuwerden.

Um eine einzelne App zu sichern, ist der genaue Paketname der APK erforderlich, nicht der Anzeigename. So ist beispielsweise der Paketname von Signal (oder LibreSignal) "org.thoughtcrime.securesms". Um diesen Namen herauszufinden, kann man unter den Einstellungen bei Android den Punkt Apps auswählen und dort zu der gewünschten App scrollen. Unterhalb des Anzeigenamens steht neben der Version auch der gesuchte Paketname. F-Droid beispielsweise zeigt diesen Namen ebenfalls an, wenn eine App ausgewählt wird. Unterhalb der fett geschrieben Kurzbeschreibung ist der gesuchte Paketname aufgeführt.

Ist der Paketname bekannt, kann eine einzelne App mittels

$ adb backup -f app.ab -apk <package_name>

gesichert werden. Die Option -apk gibt dabei an, dass auch die APK-Datei selbst gesichert wird. Sollen nur die Daten der App ins Backup, wird einfach die Option -apk nicht verwendet. Konkret im Falle von Signal würden die Daten der App mit

$ adb backup -f signal_data.ab org.thoughtcrime.securesms

gesichert.

Es ist ebenfalls möglich, mehrere Apps in einer Backup-Datei zu sichern. Dazu gibt man einfach statt nur eines Paketnames mehrere an. Diese müssen per Leerzeichen getrennt sein.

Ein Backup wieder einspielen ist bei jedem Gerät mit mindestens der gleichen oder einer höheren Android-Version problemlos möglich. Das Kommando dazu lautet

$ adb restore backup.ab

Backup von von Backups ausgenommenen Apps

Im obigen Beispiel habe ich Signal verwendet, um ein konkretes Beispiel einer App zu illustrieren. Jedoch gehört Signal zum kleinen Kreise der Apps, die Backups verbieten. Der Grund ist einfach: Die Verschlüsselung ist nur sicher, so lange gewährleistet wird, dass der private Schlüssel nur einmal existiert. Bei einem Backup werden Kopien dieses Schlüssels erstellt. Und ab Android 6 landen Backups aller installierten Apps stardmäßig auf den Servern von Google, eine entsprechende Verknüpfung mit dem Google-Konto vorausgesetzt. Wird das Backup wie oben beschrieben durchgeführt, ist die so erstellte Datei definitiv zu klein, um die Daten der App zu enthalten.

Gibt es eine Möglichkeit, trotzdem ein Backup der Daten anzulegen? Ein gerootetes Android vorausgesetzt, ja. Die Daten von Apps liegen im Verzeichnis "/data/data" und dort im jeweiligen Unterordner, der dem Paketnamen entspricht. Im Falle von Signal also "/data/data/org.thoughtcrime.securesms".

Diese Daten wollen wir nun sichern. Dazu loggen wir uns über adb shell auf dem Smartphone ein. Wir brauchen eine Shell mit root-Rechten. Am Ende der Prompt muss eine "#" sein. Ist dort nur ein "$", müssen wir uns via su die entsprechenden Rechte einholen. Als nächstes erstellen wir mit tar ein Archiv. tar erhält die Berechtigungen von Daten, die wir definitiv mit sichern wollen. Das Backup-Archiv erstellen wir mit

# tar czf /sdcard/signal_data.tgz /data/data/org.thoughtcrime.securesms

Dieses Archiv müssen wir nun auf das Gerät schaffen, auf das die Daten migriert werden sollen. Dazu können wir entweder (nachdem wir die Shell der ADB geschlossen haben) die Daten mit einem adb pull /sdcard/signal_data.tgz auf den PC kopieren oder über eine reguläre Datenübertragung vom gemounteten Gerätespeicher / der SD-Karte falls vorhanden. Somit haben wir ein Backup der App-Daten erstellt.

Migration auf ein anderes Gerät

Jetzt müssen wir die Daten auf das andere Smartphone bekommen. Dazu das zuvor gesicherte Archiv auf die SD-Karte / den internen Speicher kopieren oder alternativ mit einem adb push archive.tar /sdcard/ auf den internen Speicher befördern. Mit adb shell loggen wir uns wieder in das Android-System ein. Wie zuvor benötigen wir eine Shell mit root-Rechten. Nun ist es wichtig, dass wir uns den Inhalt der App-Daten auf dem neuen Gerät anschauen. Dazu muss die App mindestens einmal geöffnet worden sein, damit die Daten angelegt wurden. Die Daten listen wir uns mit

# ls -l /data/data/org.thoughtcrime.securesms

auf. Die Ausgabe sollte ähnlich wie auf dem folgenden Bild aussehen.

ls -l Ausgabe Signal

Wichtig sind hier zwei Dinge: Einmal der Eigentümer und die Gruppe des Verzeichnisses und der enthaltenen Daten, hier "u0_a87", sowie der symbolische Link lib, in diesem Fall nach "/data/app/org.thoughtcrime.securesms-1/lib/arm". Wir wechseln nun ins root-Verzeichnis, cd /, und entpacken das Archiv, das wir zuvor auf das Smartphone kopiert haben:

# tar xzf /sdcard/signal_data.tgz

Als nächstes müssen wir Eigentümer und Gruppe der entpackten Daten anpassen, was wir zuvor in Erfahrung gebracht haben:

# chown -R u0_a87:u0_a87 /data/data/org.thoughtcrime.securesms

Wir wechseln jetzt in das Verzeichnis (cd /data/data/org.thoughtcrime.securesms) und zeigen uns den Inhalt mit ls -l an. Höchstwahrscheinlich zeigt der Symlink lib an einen anderen Ort als zuvor. Um dies zu ändern, löschen wir zunächst den existierenden Link mit rm -f lib und setzen ihn anschließend neu, entsprechend dem zuvor ermittelten Zielort:

# ln -s /data/app/org.thoughtcrime.securesms-1/lib/arm lib

Haben wir alles angepasst, sind die Daten erfolgreich auf das neue Gerät migriert.

Probleme mit SELinux

Es ist gut möglich, dass der oben beschriebene Weg dazu führt, dass Signal direkt nach dem Öffnen abstürzt. Ist der Status von SELinux auf strikt gesetzt, könnte dies eine Erklärung sein. Dies kann in den Android-Einstellungen unter dem Menü-Punkt "Über das Telefon" überprüft werden. Dort wird ganz unten der SELinux-Status angezeigt. Testweise kann in einer offenen root-Shell über ADB der SELinux-Status auf moderat gestellt werden, dazu den Befehl

# setenforce 0

eingeben. Startet Signal nun ohne Murren, ist der Grund gefunden. Es kann beim Wiedereinspielen dieser Art von Backup vorkommen, dass bei einem System mit aktiviertem SELinux der entsprechende Sicherheitskontext (security context) der Datei nicht richtig gesetzt ist. Dieser Kontext erlaubt SELinux das erzwingen von Regeln, wie und von wem eine vorhandene Ressource genutzt werden darf. Stimmt dieser Kontext nicht, darf Signal nicht auf die Daten zugreifen und stürzt ab. Die Lösung ist simpel: In der root-Shell auf dem Smartphone können mit

# restorecon -R /data/data/org.thoughtcrime.securesms

die ensprechenden Sicherheitskontexte wiederhergestellt werden. Danach sollte auch mit striktem SELinux (setenforce 1 zum wieder Einschalten nicht vergessen) Signal ohne Probleme starten.

Diese Methode funktioniert nicht nur bei Signal, an welchem sie exemplarisch erklärt wurde, sondern mit jeder beliebigen App, deren Backups unterbunden werden. Ein weiteres Beispiel ist die Steam-App mit deren Steam Authenticator. Sollten mehrere Apps manuell importiert worden sein, kann der Befehl restorecon auch auf alle Apps auf einmal angewendet werden, was entsprechend langsamer ist:

# restorecon -R /data/data/*

Probleme mit älteren Android-Versionen

Unter älteren Versionen von Android, wie beispielsweise Android 4.4, kann es bei der oben aufgeführten Prozedur zu weiteren Problemen kommen. Unter Umständen funktioniert die -R Option von chown nicht oder aber Benutzer und Gruppe sind unbekannt. Sollte -R für das rekursive Ändern des Eigentümers nicht funktionieren, ist die einfachste Lösung, auf BusyBox zurückzugreifen. Ist es installiert, kann das von BusyBox zur Verfügung gestellte chown mittels

# busybox chwon -R <user>:<group> <path>

aufgerufen werden.

Sollte die Meldung erscheinen, dass der Benutzer und die zugehörige Gruppe unbekannt sind (chown: unknown user/group u0_a42:u0_a42), ist eine Alternative, direkt die jeweiligen UIDs von Benutzer und Gruppe anzugeben. Dabei ist das zugrunde liegende Schema, dass die letzten beiden Ziffern XX von Relevanz sind und die UIDs selbst größer als 10000 sind, wobei sich die spezifische UID aus 10000+XX zusammensetzt. Die UID für Benutzer u0_a42 ist also 10042. Sollte der Benutzer mit beispielsweise app_ beginnen, sind es entsprechend die beiden darauf folgenden Ziffern. Konkret muss also für diesen Fall der Befehl wie folgt lauten:

# busybox chown -R 10042:10042 <path>

Mit einem ls -l auf den oder im betreffenden Ordner kann überprüft werden, ob die Änderung von Benutzer und Gruppe erfolgreich war.

Signal -- Es geht auch einfacher

Signal hatte ursprünglich eine einfache Möglichkeit, ein verschlüsseltes Backup zu erstellen, welches auch auf einem neuen Gerät importiert werden konnte. Die App Silence für verschlüsselte SMS, die aus dem ehemaligen TextSecure, dem jetzigen Signal, hervorgegangen ist, nachdem das Feature für SMS entfernt wurde, unterstützt diese Backup-Methode beispielsweise noch. Dieses Feature wurde in Signal allerdings entfernt, ebenso die allgemeine Möglichkeit, die Daten zu sichern (Commit), da, wie eingangs erwähnt, ab Android 6 Daten von Apps immer auf Google-Servern gespeichert werden, wenn Backups nicht explizit verboten wurden.

Das Exportieren wurde zwar entfernt, aber das Importieren ist noch vorhanden. Ist Signal mit einem Passwort gesichert, entspricht quasi der Pfad zu den Signal-Daten (/data/data/org.thoughtcrime.securesms) einem solchen verschlüsselten Backup. Soll eine verschlüsselte Sicherung mittels der Import-Funktion von Signal eingespielt werden, sucht Signal nach dem Ordner "/sdcard/TextSecureExport". Wir können also ein Archiv der Daten anlegen, dieses auf ein anderes Gerät verschieben, entpacken und anschließend in Signal importieren.

Dazu muss auf dem ursprünglichen Gerät das Archiv erstellt und auf den PC kopiert werden:

$ adb shell
# cd /data/data
# tar czf /sdcard/signal_backup.tgz org.thoughtcrime.securesms
# exit
$ adb pull /sdcard/signal_backup.tgz

Auf dem Smartphone, wo der Import stattfinden soll, müssen die Daten entpackt und im Ordner "/sdcard/TextSecureExport" liegen:

$ adb push signal_backup.tgz /sdcard/
$ adb shell
# cd /sdcard
# tar xzf signal_backup.tgz
# mv org.thoughtcrime.securesms TextSecureExport

Wird nun in Signal im Menü unter Datensicherung beim Importieren der Punkt "Verschlüsselte Sicherung wiederherstellen" ausgewählt, sollte Signal die Daten im Ordner "TextSecureExport" finden und importieren. Zum Schluss muss in Signal für das neue Gerät noch ein neuer privater Schlüssel generiert werden und die Weiterbenutzung der ursprünglichen Daten inklusive aller Nachrichten, Medien und Gruppen sollte funktionieren.

Es ist ratsam, alle erstellten Archive sowie Ordner, die nicht mehr gebraucht werden und in denen Daten von Signal liegen, zu löschen.