Как извлечь данные приложения из полной резервной копии, созданной с помощью «резервного копирования adb»?


117

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

Как именно я могу извлечь данные одного приложения из этого зашифрованного файла резервной копии?


Ответы:


113

Просто для справки других, вот некоторые сведения о формате файла .ab.

Файл Android Backup (* .ab) представляет собой сжатый файл TAR . Он сжимается с использованием алгоритма DEFLATE . Кроме того, может быть использовано шифрование AES . Это определяется при создании резервной копии, если вы вводите пароль, то резервная копия шифруется, в противном случае; нет шифрования, оно только сжато.

ЗАГОЛОВОК файла немного отличается от обычного архива DEFLATE. Он содержит информацию о резервной копии и выглядит следующим образом:

ANDROID BACKUP
1
1
none

Первая строка - это «Волшебная» строка . Следующая строка - версия формата файла Android Backup. Следующая строка - логическое значение (true или false, 1 или 0), указывающее, сжат ли файл. Последняя строка - это тип шифрования. Этот пример не использует шифрование. Если был пароль, в строке было бы написано «AES-256». После этого идет шифрование. Если пароля нет, то запускается «архив» DEFLATE.

Он сжимается с помощью 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 ( доступна здесь ) позволит вам сделать именно это, и даже больше, прямо из Explorer. Вы можете прочитать больше о функциях в моем блоге (да, я знаю, бесстыдный плагин. Я делаю это, когда это соответствует вопросу)

распаковывать


1
Я бы проголосовал за тебя, если бы у меня была репутация, боже мой, спасибо!

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

Привет Райан, попытался использовать Droid Explorer, но он не может начать жаловаться на расположение Android SDK, даже если он установлен, и я указываю правильный путь.
— Умар Фарук Хаваджа

@UmarFarooqKhawaja Ознакомьтесь с часто задаваемыми вопросами для droid explorer. Последнее Q / A решает вашу проблему.
— Райан Конрад

Хорошо, извлекли соответствующую папку 'com.app.name' из tar, но как я могу использовать это для восстановления данных приложения? Простое копирование папки в sdcard / Android / data /, похоже, не работает ...
— pelms

91

Или с одним вкладышем:

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

2
Приятно! У вас также есть эквивалент «пакета» (чтобы взять несжатое дерево каталогов и создать файл .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
— Rache

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. "распаковать" файл 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), что указывает на то, что резервная копия приложения на одном устройстве / ПЗУ может быть восстановлена ​​в Любое другое устройство / ПЗУ без проблем, так как сам adb restoreдолжен выяснить реальные пути.


Есть еще один инструмент (немного лучше поддерживаемый), который делает это: github.com/nelenkov/android-backup-extractor
— крышка

Спасибо, @lid! Я также включил небольшой shell-скрипт (почти только в одну строку ) с моим инструментом Adebar (Android DEvice Backup And Report), который преобразует резервные копии ADB ( .ab) в .tar.gzАрхивы :)
— Иззи

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 в файлах с одним 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.