Як витягуєте дані програми з повної резервної копії, зробленої за допомогою "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.