Как извлечь данные приложения из полной резервной копии, созданной с помощью «резервного копирования 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 -
Kari
источник
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
    
MaxChinni
источник
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.

TWiStErRob
источник
4

Поскольку неявный вопрос также заключается в том, как восстановить данные одного приложения, я хотел бы упомянуть этот изящный скрипт, который разбивает заданный файл full-backup.ab в файлах с одним app.ab:

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

Для этого требуются файлы jar: abe.jar и tar-bin-split.jar, которые можно найти здесь:

Это сработало по крайней мере для моего теста.

joe_zeroh
источник