Ich habe ein Backup meines Galaxy Nexus mit erstellt adb backup
. Die resultierende Datei heißt backup.db und ist irgendwie verschlüsselt.
Ich wollte das Backup wiederherstellen, aber es stoppt, wenn es um die Wiederherstellung geht com.android.providers.contacts
. Früher adb logcat
habe ich herausgefunden, was los ist, und herausgefunden, dass es com.android.acore
während des Wiederherstellungsprozesses abstürzt.
Ich möchte auf die Daten in der Sicherung zugreifen und die Kontaktdatenbank entfernen, um alles auf meinem Telefon wiederherzustellen. Gibt es andere Möglichkeiten, die Daten aus dem Backup wiederherzustellen?
Die Datei wird nicht verschlüsselt, es sei denn, Sie geben dies beim Erstellen der Sicherung an. Es wird jedoch komprimiert (durch Deflate). Sie können das genaue Format herausfinden, indem Sie sich den Android-Quellcode (com/android/server/BackupManagerService.java) ansehen, und sollten technisch gesehen in der Lage sein, bestimmte Daten daraus zu extrahieren. Allerdings, IIRC, es gibt einige Dateiintegritätsprüfungen, daher wird es höchstwahrscheinlich nicht funktionieren, wenn Sie nur eine Reihe von Daten daraus löschen. Leider restore
scheint der Befehl keine Option zu haben, um nur eine bestimmte App/ein bestimmtes Paket wiederherzustellen oder ein Paket auszuschließen.
BackupManagerService
, um den Inhalt der Sicherungsdatei zu lesen. Es ist eine Menge Arbeit, aber ich brauche meine Daten zurück...Ich habe angefangen, daran zu arbeiten. Ich poste meine bisherigen Ergebnisse hier aus zwei Gründen als "Community-Wiki" -Antwort: Erstens, wenn jemand anderes mitmachen möchte, gibt es einen Ort zum Reden; Zweitens, wenn ich von diesem Projekt abgezogen werde, gibt es Hinweise für jemand anderen, mit der Arbeit zu beginnen.
Die Sicherungslogik auf dem Host ist vollständig in https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp in der Funktion namens enthalten backup
. Die Funktion ist sehr einfach: Sie validiert die Befehlszeilenoptionen, sendet den Befehl größtenteils unverändert an den adb-Daemon auf dem Telefon und schreibt die Ausgabe des Telefons in die Datei. Es gibt nicht einmal eine Fehlerprüfung: Wenn Sie zum Beispiel das Backup am Telefon ablehnen, adb
schreibt es einfach eine leere Datei aus.
Auf dem Telefon beginnt die Sicherungslogik service_to_fd()
in https://github.com/android/platform_system_core/blob/master/adb/services.cpp . Die Funktion identifiziert, dass der Befehl vom Host lautet "backup"
, und übergibt den nicht geparsten Befehl an /system/bin/bu
, ein triviales Shell-Skriptcom.android.commands.bu.Backup
, das als Hauptklasse eines neuen Android-App-Prozesses gestartet werden kann. Das ruft ServiceManager.getService("backup")
auf, um den Sicherungsdienst als zu erhalten IBackupManager
, und ruft IBackupManager.fullBackup()
auf und übergibt ihm den noch unbenutzten Dateideskriptor (sehr indirekt), der mit der backup.ab
Datei auf dem Host verbunden ist.
Die Steuerung geht an fullBackup()
in com.android.server.backup.BackupManagerService über , das die GUI öffnet und den Benutzer auffordert, die Sicherung zu bestätigen/abzulehnen. Wenn der Benutzer dies tut, wird acknowledgeFullBackupOrRestore()
(gleiche Datei) aufgerufen. Wenn der Benutzer die Anfrage genehmigt hat, stellt acknowledgeFullBackupOrRestore()
er fest, ob das Backup verschlüsselt ist, und leitet eine Nachricht an BackupHandler
(dieselbe Datei) BackupHandler
weiter, instanziiert und startet dann eine PerformAdbBackupTask
( dieselbe Datei, Zeile 4004 zum Zeitpunkt des Schreibens)
Schließlich beginnen wir dort, inPerformAdbBackupTask.run()
, zwischen Zeile 4151 und Zeile 4330 mit der Ausgabe .
Schreibt zuerst run()
einen Header, der entweder aus 4 oder 9 ASCII-Zeilen besteht:
"ANDROID BACKUP"
"4"
"0"
, ob die Sicherung unkomprimiert ist oder "1"
ob sie es ist"none"
oder"AES-256"
"10000"
Die eigentlichen Sicherungsdaten folgen, entweder als (je nach Komprimierung und Verschlüsselung) tar
, deflate(tar)
, encrypt(tar)
, oder encrypt(deflate(tar))
.
TODO : Schreiben Sie den Codepfad auf, der die tar-Ausgabe generiert - Sie können einfach tar verwenden, solange die Einträge in der richtigen Reihenfolge sind (siehe unten).
Tar-Archivformat
App-Daten werden unter dem Verzeichnis app/ gespeichert, beginnend mit einer _manifest-Datei, dem APK (falls erforderlich) in a/, App-Dateien in f/, Datenbanken in db/ und gemeinsam genutzten Einstellungen in sp/. Wenn Sie eine externe Speichersicherung (mit der Option -shared) angefordert haben, gibt es im Archiv auch ein Verzeichnis shared/, das externe Speicherdateien enthält.
$ tar tvf mybackup.tar
-rw------- 1000/1000 1019 2012-06-04 16:44 apps/org.myapp/_manifest
-rw-r--r-- 1000/1000 1412208 2012-06-02 23:53 apps/org.myapp/a/org.myapp-1.apk
-rw-rw---- 10091/10091 231 2012-06-02 23:41 apps/org.myapp/f/share_history.xml
-rw-rw---- 10091/10091 0 2012-06-02 23:41 apps/org.myapp/db/myapp.db-journal
-rw-rw---- 10091/10091 5120 2012-06-02 23:41 apps/org.myapp/db/myapp.db
-rw-rw---- 10091/10091 1110 2012-06-03 01:29 apps/org.myapp/sp/org.myapp_preferences.xml
Verschlüsselungsdetails
Beispiel für die Implementierung von Code zum Packen/Entpacken (erzeugt/verwendet) tar-Archive: https://github.com/nelenkov/android-backup-extractor
Einige weitere Details hier: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html
Perl-Skripte zum Packen/Entpacken und Reparieren defekter Archive:
http://forum.xda-developers.com/showthread.php?p=27840175#post27840175
Tolle und detaillierte Antwort von Nikolay Elenkov . Ich sollte jedoch hinzufügen, dass jemand bereits eine Software entwickelt hat, die genau das tut, und sie hier verpackt: http://sourceforge.net/projects/adbextractor/
Das Paket enthält sowohl das Java- als auch das Perl-Tool. Ich selbst bevorzuge jeden Tag Perl gegenüber Java, also habe ich die Perl-Codes extrahiert, sichergestellt, dass sie ausführbar sind, die erforderliche Perl-Bibliothek installiert und die backupdecrypt.pl
gegen eine adb-Backup-Datei ausgeführt, und sie in eine tar- oder gezippte tar-Datei ohne irgendwelche konvertiert Ausgabe.
Ich habe sogar einen Einzeiler in Bash 3 erstellt, der es mir ermöglicht, eine Adb-Sicherung direkt in eine gzippte Tar-Datei durchzuführen:
adb backup -f >(backupdecrypt.pl -D -z - backup.tgz) -all
Ich hoffe es hilft.
Um die vorhandene Sicherungsdatei zu durchsuchen, versuchen Sie die Seite http://www.adb-backup.com , es ist einfach ohne "dd", "tar", ...
Auf diesem Server werden keine Daten gespeichert. Ich habe diesen Online-Dienst entwickelt, um das Anzeigen von Backups zu vereinfachen, ohne mit dd / tar zu manipulieren oder zusätzliche Software zu installieren. Ich bin Autor www.adb-backup.com
Alchimie