Tworzę kopię zapasową Nexusa 7, adb backup
aby wykonać kopię zapasową wszystkich plików w zaszyfrowanej kopii zapasowej. Widzę, że możesz przywrócić z kopii zapasowej adb restore
, ale to wyczyści wszystkie moje istniejące dane na urządzeniu.
Jak dokładnie wyodrębnić dane jednej aplikacji z tego zaszyfrowanego pliku kopii zapasowej?
Odpowiedzi:
Tylko w celach informacyjnych, oto niektóre informacje o formacie pliku ab.
Plik kopii zapasowej systemu Android (* .ab) jest skompresowanym plikiem TAR . Jest kompresowany za pomocą algorytmu DEFLATE . Ponadto można zastosować szyfrowanie AES . Jest to określane podczas tworzenia kopii zapasowej, jeśli wprowadzisz hasło, kopia zapasowa zostanie zaszyfrowana, w przeciwnym razie; nie ma szyfrowania, jest tylko skompresowane.
NAGŁÓWEK pliku różni się nieco od zwykłego archiwum DEFLATE. Zawiera informacje o kopii zapasowej i wygląda następująco:
Pierwsza linia to „Magiczna” linia . Kolejny wiersz to wersja formatu pliku kopii zapasowej systemu Android. Kolejny wiersz to wartość logiczna (prawda lub fałsz, 1 lub 0) wskazująca, czy plik jest skompresowany. Ostatnia linia to rodzaj szyfrowania. W tym przykładzie nie zastosowano żadnego szyfrowania. Gdyby było hasło, wiersz brzmiałby „AES-256”. Potem jest szyfr szyfrujący. Jeśli nie ma hasła, rozpoczyna się DEFLATE „archiwum”.
Jest kompresowany za pomocą Java Deflater . Co z punktu widzenia programistów powoduje problemy, jeśli chcesz wyodrębnić to oprócz Javy. Nie byłem w stanie znaleźć niczego, co mogłoby go spuścić z powietrza za pomocą tego samego algorytmu, mimo że wszystko, co znalazłem (na przykład C #) powinno być zgodne z „SPEC”.
To powiedziawszy, istnieje projekt open source na licencji Apache 2.0, napisany przez Nikolay Elenkov , który pozwoli ci wyodrębnić plik .ab do pliku tar.
Stosowanie:
Jeśli nie jesteś pewien, jak naprawdę tego użyć (co jest poza zakresem tej odpowiedzi), następna wersja Droid Explorer v0.8.8.7 ( dostępna tutaj ) pozwoli ci to zrobić, a nawet więcej, bezpośrednio z Explorera. Możesz przeczytać więcej o funkcjach na moim blogu (tak, wiem, bezwstydna wtyczka. Robię to, gdy pasuje do pytania)
źródło
Lub z jedną linią:
źródło
.tar.gz
pliku zprintf
poleceniem (0x1F 0x8B
jest sygnaturą,0x08
jest metodą kompresji,0x00
ma flagi i 4 x0x00
jest znacznikiem czasu), a następnie dołącza do tego nagłówka zawartośćbackup.ab
pliku, zaczynając od przesunięcia 25d. Taki strumień jest prawidłowym.tar.gz
plikiem, atar xfvz
polecenie rozpoznaje go jako taki, dzięki czemu może pomyślnie rozpakować strumień.invalid compressed data--format violated
Jeszcze jedna opcja jest użycie
bash
,cat
agunzip
(gzip
).Pełny proces może być następujący ( z nieszyfrowaną kopią zapasową ):
wykonaj kopię zapasową danych jednej aplikacji (na przykład „ Zastąp DNS dla KitKat ”):
wyodrębnij skompresowane dane
rozpakuj skompresowane dane
„rozpakuj” plik tar
źródło
gzip: stdin: invalid compressed data--format violated
. Zakładam, że ekstrakcja się powiodła, jakdd
donosi22763821+0 records in 22763821+0 records out
.Inną opcją jest użycie Perla AdbBackupRoutines z tego wątku XDA . Mają jednak kilka wymagań: Perl, oczywiście, plus
libterm-readkey-perl
,libcrypt-cbc-perl
ilibcrypt-pbkdf2-perl
(jeśli twoje kopie zapasowe nie są zaszyfrowane, możesz pominąć ostatnią zależność, po prostu komentując wiersz 103,backupdecrypt.pl
gdzie jest uwzględniony - działało dobrze dla mnie).Użycie jest dość łatwe:
Plik wynikowy
.tar
można następnie zbadać jak każdy inny plik tarball. Jego struktura jest dość interesująca w co najmniej jednym aspekcie: nie odzwierciedla rzeczywistych ścieżek, z których pliki zostały pobrane (np. Nie/data/data/com.app.name/databases/whatever.db
, ale zamiast tegoapps/com.app.name/db/whatever.db
) - co wskazuje, że aplikacja, której kopię zapasową utworzono na jednym urządzeniu / pamięci ROM, może zostać przywrócona do każde inne urządzenie / pamięć ROM bez problemów, tak jak toadb restore
musi znaleźć prawdziwe ścieżki.źródło
.ab
) na.tar.gz
archiwa :)W oparciu o informacje innych osób wiem teraz, że plik kopii zapasowej jest po prostu prefiksem strumienia Deflated (GZip). Na podstawie tych informacji ten prosty program może go rozpakować:
Napisałem to, ponieważ nie mam żadnego z wyżej wymienionych narzędzi uniksowych i było to łatwiejsze niż instalacja Cygwin lub innych narzędzi.
Zalety :
Wady :
Aby było to narzędzie wiersza polecenia, twórz
unab.bat
z zawartością:java -cp "%~dp0." unab %*
i katalogiem doPATH
.źródło
Ponieważ domyślnym pytaniem jest również, jak przywrócić dane pojedynczej aplikacji, chciałbym wspomnieć o tym sprytnym skrypcie, który dzieli dane full-backup.ab na pliki single-app.ab:
https://sourceforge.net/projects/adb-split/
Wymaga plików jar: abe.jar i tar-bin-split.jar, które można znaleźć tutaj:
Działa przynajmniej w przypadku mojej skrzynki testowej.
źródło