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
. Ich habe adb logcat
immer herausgefunden, was los ist und was 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 der Sicherung wiederherzustellen?
BackupManagerService
, um den Inhalt der Sicherungsdatei zu lesen. Es ist eine Menge Arbeit, aber ich brauche meine Daten zurück ...Daran habe ich angefangen zu arbeiten. Ich veröffentliche meine 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 zurückgezogen werde, gibt es Hinweise, damit jemand anderes anfängt zu arbeiten.
Die Sicherungslogik auf dem Host ist in der genannten Funktion vollständig in https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp enthalten
backup
. Die Funktion ist sehr einfach: Sie validiert die Befehlszeilenoptionen, sendet den Befehl zumeist 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 beispielsweise die Sicherung auf dem Telefon ablehnen,adb
schreiben Sie einfach eine leere Datei aus.Am Telefon, startet die Backup - Logik in
service_to_fd()
in https://github.com/android/platform_system_core/blob/master/adb/services.cpp . Die Funktion"backup"
erkennt/system/bin/bu
, dass der Befehl vom Host stammt , und übergibt den nicht analysierten Befehl an. Hierbei handelt es sich um ein einfaches Shell-Skript , dascom.android.commands.bu.Backup
als Hauptklasse eines neuen Android-App-Prozesses gestartet werden soll. Das ruftServiceManager.getService("backup")
auf, um den Sicherungsdienst als abzurufenIBackupManager
, und ruft aufIBackupManager.fullBackup()
und übergibt ihm den noch nicht verwendeten Dateideskriptor (sehr indirekt), der mit derbackup.ab
Datei auf dem Host verbunden ist.Die Steuerung geht zu
fullBackup()
in com.android.server.backup.BackupManagerService , die die GUI dem Benutzer zu bestätigen / verwerfen die Sicherung zu fragen erscheint. Wenn der Benutzer dies tut, wirdacknowledgeFullBackupOrRestore()
(dieselbe Datei) aufgerufen. Wenn der Benutzer die Anforderung genehmigt hat, stellt er festacknowledgeFullBackupOrRestore()
, ob die Sicherung verschlüsselt ist, und übergibt eine Nachricht anBackupHandler
(dieselbe Datei).BackupHandler
Anschließend wird eine Instanz erstellt und gestartetPerformAdbBackupTask
( dieselbe Datei, Zeile 4004 zum Zeitpunkt des Schreibens).Wir beginnen dort
PerformAdbBackupTask.run()
zwischen Zeile 4151 und Zeile 4330 mit der Ausgabe .Zuerst
run()
schreibt einen Header, der von entweder 4 oder 9 ASCII Zeilen besteht:"ANDROID BACKUP"
"4"
"0"
wenn die Sicherung nicht komprimiert ist oder"1"
wenn dies der Fall ist"none"
oder"AES-256"
"10000"
Die eigentlichen Sicherungsdaten folgen, entweder als (je nach Kompression und Verschlüsselung)
tar
,deflate(tar)
,encrypt(tar)
, oderencrypt(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 im Verzeichnis app / gespeichert, beginnend mit einer _manifest-Datei, der APK (falls angefordert) in einem /, App-Dateien in f /, Datenbanken in db / und gemeinsamen Einstellungen in sp /. Wenn Sie eine externe Speichersicherung angefordert haben (mit der Option -shared), befindet sich im Archiv auch ein freigegebenes Verzeichnis /, das externe Speicherdateien enthält.
Details zur Verschlüsselung
Beispiel für das Packen / Entpacken von Code-Implementierungen (produziert / verwendet) von Tar-Archiven: https://github.com/nelenkov/android-backup-extractor
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
quelle
Tolle und ausführliche Antwort von Nikolay Elenkov . Allerdings sollte ich hinzufügen, dass jemand bereits eine Software entwickelt, die genau das tut, und diese hier verpackt: http://sourceforge.net/projects/adbextractor/
Das Paket enthält sowohl Java als auch Perl. Ich selbst bevorzuge jeden Tag Perl gegenüber Java, also extrahiere ich die Perl-Codes, stelle sicher, dass sie ausführbar sind, installiere die erforderliche Perl-Bibliothek und
backupdecrypt.pl
führe die Datei gegen eine ADB-Sicherungsdatei aus und konvertiere sie in eine tar- oder gzipped-tar-Datei ohne eine Problem.In Bash 3 habe ich sogar einen Einzeiler erstellt, mit dem ich ein ADB-Backup direkt in eine gezippte TAR-Datei erstellen kann:
Ich hoffe es hilft.
quelle
Versuchen Sie zum Durchsuchen der vorhandenen Sicherungsdatei die Seite http://www.adb-backup.com. Ohne "dd", "tar", ... ist dies ganz einfach.
Daten werden nicht auf diesem Server gespeichert. Ich habe diesen Onlinedienst entwickelt, um das Anzeigen von Backups zu vereinfachen, ohne mit dd / tar manipulieren oder zusätzliche Software installieren zu müssen. Ich bin Autor www.adb-backup.com
quelle