Utworzyłem kopię zapasową mojego Galaxy Nexusa adb backup
. Powstały plik nosi nazwę backup.db i jest w jakiś sposób zaszyfrowany.
Chciałem przywrócić kopię zapasową, ale zatrzymuje się ona w przypadku przywracania com.android.providers.contacts
. Kiedyś adb logcat
, aby dowiedzieć się, co się dzieje i okazało się, że com.android.acore
awarii podczas procesu przywracania.
Chciałbym uzyskać dostęp do danych w kopii zapasowej i usunąć bazę danych kontaktów, aby przywrócić wszystko z powrotem do mojego telefonu. Czy istnieją inne sposoby przywracania danych z kopii zapasowej?
BackupManagerService
aby odczytać zawartość pliku kopii zapasowej. To dużo pracy, ale potrzebuję danych z powrotem ...Zacząłem nad tym pracować. Do tej pory zamieszczam wyniki jako odpowiedź „wiki społeczności” z dwóch powodów: po pierwsze, jeśli ktoś inny chce dołączyć, istnieje miejsce do rozmowy; po drugie, jeśli oderwę się od tego projektu, pojawią się wskazówki dla kogoś innego, aby zaczął działać.
Logika tworzenia kopii zapasowych na hoście jest całkowicie zawarta w https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp w funkcji o nazwie
backup
. Funkcja jest bardzo prosta: sprawdza poprawność opcji wiersza poleceń, wysyła polecenie głównie w niezmienionej postaci do demona adb w telefonie i zapisuje dane wyjściowe telefonu do pliku. Nie ma nawet sprawdzania błędów: jeśli na przykład odmówisz wykonania kopii zapasowej w telefonie,adb
po prostu zapisujesz pusty plik.Na telefonie logika tworzenia kopii zapasowych rozpoczyna się
service_to_fd()
w https://github.com/android/platform_system_core/blob/master/adb/services.cpp . Funkcja identyfikuje, że polecenie hosta jest"backup"
, i przekazuje nieprzetworzone polecenie/system/bin/bu
, które jest trywialnym skryptem powłoki, który można uruchomićcom.android.commands.bu.Backup
jako główną klasę nowego procesu aplikacji na Androida. To wywołuje,ServiceManager.getService("backup")
aby uzyskać usługę tworzenia kopii zapasowych jakoIBackupManager
, i wywołujeIBackupManager.fullBackup()
, przekazując jej wciąż nieużywany deskryptor pliku (bardzo pośrednio) podłączony dobackup.ab
pliku na hoście.Sterowanie przechodzi
fullBackup()
w com.android.server.backup.BackupManagerService , która pojawia się GUI z prośbą o potwierdzenie / odrzucenie kopię zapasową. Gdy użytkownik to zrobi,acknowledgeFullBackupOrRestore()
wywoływany jest (ten sam plik). Jeśli użytkownik zatwierdzi żądanie,acknowledgeFullBackupOrRestore()
dowie się, czy kopia zapasowa jest zaszyfrowana, i przekaże wiadomość doBackupHandler
(tego samego pliku),BackupHandler
a następnie utworzy wystąpienie i uruchomiPerformAdbBackupTask
(ten sam plik, wiersz 4004 w momencie zapisu)W końcu zaczynamy generować produkcję tam
PerformAdbBackupTask.run()
, między linią 4151 a linią 4330 .Najpierw
run()
pisze nagłówek, który składa się z 4 lub 9 linii ASCII:"ANDROID BACKUP"
"4"
"0"
jeśli kopia zapasowa jest nieskompresowana, albo"1"
jest"none"
albo"AES-256"
"10000"
Rzeczywiste dane kopii zapasowej w następujący sposób, jako (w zależności od kompresji i szyfrowania)
tar
,deflate(tar)
,encrypt(tar)
, lubencrypt(deflate(tar))
.DO ZROBIENIA : napisz ścieżkę kodu, która generuje wyjście tar - możesz po prostu użyć tar, o ile wpisy są w odpowiedniej kolejności (patrz poniżej).
Format archiwum tar
Dane aplikacji są przechowywane w katalogu app /, zaczynając od pliku _manifest, APK (na żądanie) w /, pliki aplikacji w f /, bazy danych w db / i wspólne preferencje w sp /. Jeśli zażądano kopii zapasowej zewnętrznej pamięci masowej (przy użyciu opcji -shared), w archiwum będzie także udostępniony katalog / zawierający pliki zewnętrznej pamięci masowej.
Szczegóły szyfrowania
Przykładowa implementacja kodu paczki / rozpakowania (produkuje / wykorzystuje) archiwa tar: https://github.com/nelenkov/android-backup-extractor
Więcej szczegółów tutaj: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html
Skrypty Perla do pakowania / rozpakowywania i naprawy uszkodzonych archiwów:
http://forum.xda-developers.com/showthread.php?p=27840175#post27840175
źródło
Świetna i szczegółowa odpowiedź Nikołaja Elenkowa . Powinienem jednak dodać, że ktoś już opracowuje oprogramowanie, które właśnie to robi i pakuje je tutaj: http://sourceforge.net/projects/adbextractor/
Pakiet zawiera zarówno narzędzia Java, jak i Perl. Ja osobiście wolę Perla niż Javę, więc wyodrębniłem kody Perla, upewniłem się, że są one wykonywalne, zainstalowałem wymaganą bibliotekę Perla i uruchomiłem
backupdecrypt.pl
plik kopii zapasowej adb i przekonwertowałem go na plik tar lub gzip kwestia.W Bash 3 utworzyłem nawet jedną linijkę, która pozwala mi na tworzenie kopii zapasowej adb bezpośrednio w gzipowanym pliku tar:
Mam nadzieję, że to pomoże.
źródło
Aby przejrzeć istniejący plik kopii zapasowej, wypróbuj stronę http://www.adb-backup.com , jest to proste bez „dd”, „tar”, ...
Dane nie są przechowywane na tym serwerze. Opracowałem tę usługę online, aby ułatwić przeglądanie kopii zapasowych bez manipulacji przy użyciu dd / tar lub instalowania dodatkowego oprogramowania. Jestem autorem www.adb-backup.com
źródło