Jak wyodrębnić dane aplikacji z pełnej kopii zapasowej wykonanej za pomocą „kopii zapasowej adb”?

117

Tworzę kopię zapasową Nexusa 7, adb backupaby 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?

Ryan Conrad
źródło

Odpowiedzi:

113

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:

ANDROID BACKUP
1
1
none

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:

java -jar abe.jar unpack <backup.ab> <backup.tar> <password>

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)

rozpakować

Ryan Conrad
źródło
1
Głosowałbym za tobą, gdybym miał reputację, dzięki bogu dzięki!
proszę bardzo. Znam tylko wszystkie te informacje, ponieważ jest to funkcja, którą niedawno dodałem do bazy kodu Droid Explorer, więc musiałem przeprowadzić badania na ten temat.
Ryan Conrad
Cześć Ryan, próbowałem użyć Droid Explorera, ale nie zaczął narzekać na lokalizację zestawu SDK Androida, mimo że jest zainstalowany i podaję właściwą ścieżkę.
Umar Farooq Khawaja
@UmarFarooqKhawaja Zajrzyj do FAQ dla eksploratora droidów. Ostatnie pytanie dotyczy rozwiązania problemu.
Ryan Conrad
OK, wyodrębniłem odpowiedni folder „com.app.name” z tar, ale jak mogę go użyć do przywrócenia danych aplikacji? Po prostu skopiowanie folderu na sdcard / Android / data / nie wydaje się działać ...
pelms
90

Lub z jedną linią:

( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) |  tar xfvz -
Kari
źródło
2
Miły! Czy masz również odpowiednik „pack” (aby pobrać nieskompresowane drzewo katalogów i utworzyć plik .db)?
dailyglen
4
Czy możesz dodać wyjaśnienie do odpowiedzi.?
Lucky
2
Oto najlepsza odpowiedź: D Działa idealnie dobrze! Wydobywanie teraz.
xdevs23,
16
Objaśnienie: autor tworzy standardowy nagłówek pliku Zlib dla .tar.gzpliku z printfpoleceniem ( 0x1F 0x8Bjest sygnaturą, 0x08jest metodą kompresji, 0x00ma flagi i 4 x 0x00jest znacznikiem czasu), a następnie dołącza do tego nagłówka zawartość backup.abpliku, zaczynając od przesunięcia 25d. Taki strumień jest prawidłowym .tar.gzplikiem, a tar xfvzpolecenie rozpoznaje go jako taki, dzięki czemu może pomyślnie rozpakować strumień.
antonone
3
Zrobiłem kopię zapasową z adb 1.0.36 (wersja 1.7.0.0 + r33-2) i ta metoda spowodowała błąd z zgip:invalid compressed data--format violated
Rache
31

Jeszcze jedna opcja jest użycie bash, cata gunzip( gzip).

Pełny proces może być następujący ( z nieszyfrowaną kopią zapasową ):

  1. wykonaj kopię zapasową danych jednej aplikacji (na przykład „ Zastąp DNS dla KitKat ”):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. wyodrębnij skompresowane dane

    $ dd if=net.mx17.overridedns.ab bs=1 skip=24 > compressed-data
    1285+0 records in
    1285+0 records out
    1285 bytes (1,3 kB) copied, 0,00745877 s, 172 kB/s
    
  3. rozpakuj skompresowane dane

    $ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
        | cat - compressed-data | gunzip -c > decompressed-data.tar
    gzip: stdin: unexpected end of file
    
  4. „rozpakuj” plik tar

    $ tar xf decompressed-data.tar
    
MaxChinni
źródło
4
Czy należy się spodziewać „nieoczekiwanego końca pliku”?
hft
Nieoczekiwanie wyodrębnienie w 2 działało na zaszyfrowanym pliku. Jak to jest możliwe? Dekompresja nie powiodła się gzip: stdin: invalid compressed data--format violated. Zakładam, że ekstrakcja się powiodła, jak dddonosi 22763821+0 records in 22763821+0 records out.
Tom Russell
4

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-perli libcrypt-pbkdf2-perl(jeśli twoje kopie zapasowe nie są zaszyfrowane, możesz pominąć ostatnią zależność, po prostu komentując wiersz 103, backupdecrypt.plgdzie jest uwzględniony - działało dobrze dla mnie).

Użycie jest dość łatwe:

./backupdecrypt.pl [options] <backupfile.ab> <outfile.tar>

Plik wynikowy .tarmoż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 tego apps/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 to adb restoremusi znaleźć prawdziwe ścieżki.

Izzy
źródło
Jest jeszcze jedno narzędzie (trochę lepiej utrzymane), które to robi: github.com/nelenkov/android-backup-extractor
pokrywa
Dzięki, @lid! Do mojego narzędzia Adebar (Android DEvice Backup And Report) dołączam też mały skrypt powłoki (prawie tylko jeden wiersz), który konwertuje kopie zapasowe ADB ( .ab) na .tar.gzarchiwa :)
Izzy
4

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ć:

import java.io.*;
import java.util.zip.*;

/** Run: javac unab.java && java unab backupfile.ab */
public class unab {
    private static final int BACKUP_HEADER_LENGTH = 24;
    public static void main(String[] args) throws IOException {
        InputStream in = new FileInputStream(args[0]);
        try {
            OutputStream out = new FileOutputStream(args[0] + ".tar");
            try {
                if (in.skip(BACKUP_HEADER_LENGTH) != BACKUP_HEADER_LENGTH) {
                    throw new IOException("Unexpected end of file while skipping backup header.");
                }
                byte[] buffer = new byte[100 * 1024];
                int count;
                InputStream zip = new InflaterInputStream(in);
                while ((count = zip.read(buffer)) > 0) {
                    out.write(buffer, 0, count);
                }
            } finally {
                out.close();
            }
        } finally {
            in.close();
        }
    }
}

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 :

  • międzyplatformowy
  • proste (bez parametrów ezoterycznych)
  • nie potrzeba narzędzi do rur

Wady :

  • potrzebujesz JDK (który prawdopodobnie już masz, ponieważ masz problemy z pakietem SDK systemu Android)
  • brak obsługi szyfrowanych kopii zapasowych
  • potrzebuję czegoś, aby wyodrębnić wynikowy plik tar (używam Total Commander)

Aby było to narzędzie wiersza polecenia, twórz unab.batz zawartością: java -cp "%~dp0." unab %*i katalogiem do PATH.

TWiStErRob
źródło
4

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.

joe_zeroh
źródło