Як витягуєте дані програми з повної резервної копії, зробленої за допомогою "adb backup"?


117

Я створюю резервну копію свого Nexus 7, adb backupщоб створити резервну копію всіх файлів у зашифрованій резервній копії. Я бачу, що ви можете відновити з резервної копії adb restore, але це видалить усі мої наявні дані на пристрої.

Як саме я отримав дані однієї програми з цього зашифрованого файлу резервної копії?


Відповіді:


113

Тільки для ознайомлення з іншими, ось деякий фон у форматі файлу .ab.

Файл резервного копіювання Android (* .ab) - це стислий файл TAR . Він стискається за допомогою алгоритму DEFLATE . Крім того, може використовуватися шифрування AES . Це визначається під час створення резервної копії, якщо ви вводите пароль, тоді резервна копія зашифрована, інакше; шифрування немає, воно лише стиснене.

HEADER файлу трохи відрізняється від звичайного архіву DEFLATE. Він містить інформацію про резервну копію і виглядає наступним чином:

ANDROID BACKUP
1
1
none

Перший рядок - це лінія "Магія" . Наступний рядок - версія формату файлів резервного копіювання Android. Наступний рядок - булева (вірна чи помилкова, 1 або 0), яка вказує, чи файл стискається. Останній рядок - тип шифрування. У цьому прикладі не використовується жодне шифрування. Якби був пароль, у рядку було б написано "AES-256". Після цього шифрується шифр. Якщо немає пароля, тоді запускається ВІДКРИТИЙ «архів».

Він стискається за допомогою Java Deflater . Це, з точки зору розробників, викликає проблеми, якщо ви хочете використовувати що-небудь крім Java для його витягу. Я не зміг знайти нічого, що може спустити це за допомогою того ж алгоритму, хоча все, що я знайшов (як, наприклад, C #), повинно слідувати "SPEC".

Зважаючи на це, існує проект з відкритим кодом за ліцензією Apache 2.0, написаний Миколою Еленковим, який дозволить вам витягнути .ab у файл tar.

Використання:

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

Якщо ви не знаєте, як реально використовувати це (що виходить за рамки цієї відповіді), наступна версія Droid Explorer v0.8.8.7 ( доступна тут ) дозволить вам зробити саме це та інше прямо з Провідника. Ви можете прочитати більше про функції в моєму блозі (так, я знаю, безсоромна плагіна. Я це роблю, коли це відповідає питанням)

розпакувати


1
Я би голосував за вас, якби мав репутацію, боже мій дякую!

будь ласка. Я знаю лише всю цю інформацію, тому що це функція, яку я нещодавно додав до бази коду Droid Explorer, тому мені довелося провести її дослідження.
Райан Конрад

Привіт Раян, спробував використати Droid Explorer, але не вдається почати скаржитися на розташування Android SDK, навіть якщо він встановлений і я постачаю правильний шлях.
Umar Farooq Khawaja

@UmarFarooqKhawaja Погляньте на поширені запитання щодо дроїд-провідника. Останній Q / A вирішує вашу проблему.
Райан Конрад

Гаразд, вилучили відповідну папку 'com.app.name' з дьогтю, але як це використовувати для відновлення даних програми? Просто копіювання папки на sdcard / Android / дані /, здається, не працює ...
pelms

90

Або з однолінійним:

( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) |  tar xfvz -

2
Приємно! Чи є у вас також еквівалент "pack" (взяти нестиснене дерево каталогів і створити .db файл)?
dailyglen

4
Чи можете ви додати пояснення до відповіді?
Лаки

2
ЦЕ найкраща відповідь: D працює чудово! Видобуток зараз.
xdevs23

16
Пояснення: автор створює стандартний заголовок файлу Zlib для .tar.gzфайлу з printfкомандою ( 0x1F 0x8Bє підписом, 0x08є методом стиснення, 0x00є прапорами і 4 x 0x00- часовою міткою), після чого додає до цього заголовка вміст backup.abфайлу, починаючи з зміщення 25d. Такий потік є дійсним .tar.gzфайлом, і tar xfvzкоманда розпізнає його як такий, тому він може успішно розпакувати потік.
антонон

3
Я зробив резервну копію з ADB 1.0.36 (Revision 1.7.0.0 + r33-2) , і цей метод справив помилку від zgip:invalid compressed data--format violated
Рейч

31

Ще один варіант полягає у використанні bash, catі gunzip( gzip).

Повний процес може бути таким ( із незашифрованою резервною копією ):

  1. створити резервну копію даних одного додатка (наприклад, " Заміна DNS для KitKat "):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. витягнути стислі дані

    $ 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. декомпресія стислих даних

    $ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
        | cat - compressed-data | gunzip -c > decompressed-data.tar
    gzip: stdin: unexpected end of file
    
  4. "untar" файл tar

    $ tar xf decompressed-data.tar
    

4
Чи очікується "несподіваний кінець файлу"?
hft

Вилучення у 2 дивно працювало на зашифрованому файлі. Як це можливо? Потім декомпресія не вдалася gzip: stdin: invalid compressed data--format violated. Я припускаю, що видобуток вдався, як ddповідомляється 22763821+0 records in 22763821+0 records out.
Том Расселл

4

Інший варіант - використання Perl AdbBackupRoutines з цього потоку XDA . Однак у них є кілька вимог: очевидно, Perl, плюс libterm-readkey-perl, libcrypt-cbc-perlта libcrypt-pbkdf2-perl(якщо ваші резервні копії незашифровані, ви можете пропустити останню залежність, просто прокоментувавши рядок 103 того, backupdecrypt.plде вона включена - для мене добре працював).

Використання досить просто:

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

Потім отриманий .tarфайл можна дослідити, як і будь-який інший тарбол. Її структура є досить цікавою щонайменше в одному аспекті: вона не відображає реальних шляхів, з яких були взяті файли (наприклад, ні /data/data/com.app.name/databases/whatever.db, а натомість apps/com.app.name/db/whatever.db) - що вказує на те, що додаток, резервне копіювання на одному пристрої / ROM, може бути відновлено будь-який інший пристрій / ПЗУ без проблем, як і adb restoreслід з'ясувати реальні шляхи.


Є ще один інструмент (трохи краще підтримується), який робить це: github.com/nelenkov/android-backup-extractor
кришка

Дякую, @lid! Я також включив невеликий оболонку-скрипт (майже однолінійний ) з моїм інструментом Adebar (Android DEvice Backup And Report), який перетворює резервні копії ADB ( .ab) в .tar.gzArchives :)
Izzy

4

Виходячи з інформації інших, тепер я знаю, що файл резервної копії - це лише попередньо встановлений потік Deflated (GZip), на основі цієї інформації ця проста програма може розпакувати її для вас:

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();
        }
    }
}

Я написав це, тому що у мене немає жодного з згаданих вище інструментів Unix, і це було простіше, ніж встановити Cygwin або інші інструменти.

Переваги :

  • крос-платформа
  • простий (без езотеричних параметрів)
  • немає необхідності в трубопроводі

Недоліки :

  • вам потрібен JDK (який ви, мабуть, вже є, тому що ви водитеся з Android SDK)
  • немає підтримки для зашифрованих резервних копій
  • знадобиться щось, щоб витягти отриманий файл tar (я використовую Total Commander)

Щоб зробити це інструментом командного рядка, створіть unab.batвміст: java -cp "%~dp0." unab %*та каталог до PATH.


4

Оскільки неявне питання також полягає в тому, як відновити дані про одні додатки, я хотів би згадати цей чудовий сценарій, який розбиває заданий full-backup.ab у файлах single-app.ab:

https://sourceforge.net/projects/adb-split/

Тут потрібні файли jar: abe.jar та tar-bin-split.jar, які можна знайти тут:

Це працювало принаймні на моїй тесті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.