Резервное копирование и восстановление (backup)

Рейтинг: 65.7% · 17 голосов
Полный курс по Android Debug Bridge: установка, подключение, shell, логи, dumpsys, автоматизация, root, беспроводная отладка. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
android_roman
Сообщения: 45
Зарегистрирован: 11 май 2026, 05:31

Резервное копирование и восстановление (backup)

Сообщение android_roman »

АкадемияADB: Android Debug BridgeГлава 18 из 29
Оглавление курса (29)
  1. Введение в Android Debug Bridge
  2. Установка и настройка рабочей среды
  3. Подключение устройства (проводное и беспроводное)
  4. Базовые команды ADB и управление сервером
  5. Команды состояния и перезагрузки
  6. Навигация по файловой системе
  7. Управление пакетами приложений
  8. Логирование с помощью logcat
  9. Системные дампы и диагностика (dumpsys)
  10. Анализ производительности в реальном времени
  11. Эмуляция ввода (input)
  12. Управление Activity и Intent (am)
  13. Работа с оконным менеджером (wm)
  14. Захват экрана и запись видео
  15. Root-доступ и его применение
  16. Модификация системных настроек через settings
  17. Команды для поставщиков контента (content)
  18. Резервное копирование и восстановление (backup) (вы здесь)
  19. Проброс портов и туннелирование
  20. Беспроводная отладка (Wi-Fi)
  21. Взаимодействие с эмуляторами
  22. Написание скриптов на Bash/CMD/PowerShell
  23. ADB в языках программирования
  24. Автоматизация тестирования с ADB
  25. Безопасность и лучшие практики
  26. ADB на Android TV, Wear OS и IoT
  27. Восстановление и низкоуровневые операции
  28. Расширенные возможности оболочки и инструменты
  29. Отладка самого ADB и устранение неполадок
Резервное копирование через adb появилось ещё в Android 4.0 и долгие годы было единственным способом снять полный дамп данных приложений без root. Сегодня (Platform Tools 37.x, Android 14/15) механизм формально жив, но урезан и помечен как устаревший. Платформа честно об этом предупреждает: при любом вызове adb печатает строку

Код: Выделить всё

WARNING: adb backup is deprecated and may be removed in a future release
Это не повод его игнорировать. На старых устройствах, в эмуляторах, при отладке миграции данных и при разборе чужих .ab архивов знать backup/restore до сих пор нужно. Разберём по порядку.

Что такое adb backup на самом деле:

adb backup дергает системный Backup Manager и просит его выгрузить так называемый full backup, поток tar, упакованный в один файл с расширением .ab (Android Backup). Внутрь попадают данные приложений из /data/data/<package>, при желании сами apk, файлы OBB и содержимое общего хранилища. Сервис на устройстве показывает экран подтверждения, и без вашего тапа пальцем по экрану ничего не выгрузится. Это сделано намеренно: чужой человек с кабелем не должен молча вытащить ваши данные.

Синтаксис и ключи:

Код: Выделить всё

adb backup [-f FILE] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] \
           [-all] [-system|-nosystem] [-keyvalue|-nokeyvalue] [PACKAGE...]
Разбор флагов, со значениями по умолчанию:

-f FILE задаёт файл назначения. Без него adb пишет backup.ab в текущий каталог. Всегда указывайте -f явно, иначе потом будете искать файл.

-apk / -noapk включает или нет сами установочные apk в архив. По умолчанию -noapk, то есть код приложения не сохраняется, только данные. Для полноценного переноса нужен -apk.

-obb / -noobb это большие файлы расширений (в основном у игр), по умолчанию -noobb.

-shared / -noshared это общее хранилище (sdcard, картинки, загрузки). По умолчанию -noshared, на части устройств вообще не работает.

-all снимает данные со всех приложений сразу. Без -all нужно перечислить пакеты руками.

-system / -nosystem управляет включением системных приложений. Когда задан -all, системные по умолчанию входят (-system); добавьте -nosystem, чтобы их выкинуть и уменьшить дамп.

-keyvalue / -nokeyvalue включает key/value бэкапы (старый формат на пары ключ-значение). По умолчанию -nokeyvalue.

Если не дать ни -all, ни -shared, ни списка пакетов, получите ошибку

Код: Выделить всё

adb: backup either needs a list of packages or -all/-shared
Примеры. Бэкап одного приложения вместе с apk:

Код: Выделить всё

adb backup -apk -f wallet.ab com.example.wallet
После запуска в терминале повиснет строка ожидания:

Код: Выделить всё

Now unlock your device and confirm the backup operation.
На телефоне разблокируйте экран, увидите окно "Резервное копирование всех данных". Внизу поле "Зашифровать резервную копию". Нажмите "Создать резервную копию". Терминал отвиснет, когда устройство закончит выгрузку.

Полный бэкап всех пользовательских приложений с apk, но без системных и без общего хранилища:

Код: Выделить всё

adb backup -apk -nosystem -all -f full-userapps.ab
Шифрование паролем:

Поле "Зашифровать резервную копию" на экране подтверждения это и есть пароль архива. Введёте пароль, и весь tar внутри .ab зашифруется AES-256, ключ выводится из пароля через PBKDF2. Пароль нигде в команде не передаётся, только на устройстве. Запомните его: без пароля архив потом не распаковать и не восстановить, recovery тут нет.

Нюанс: если на устройстве уже задан пароль шифрования диска, некоторые прошивки требуют использовать именно его и не дают оставить поле пустым. На голом AOSP поле можно оставить пустым, тогда архив будет без шифрования (но всё равно сжат).

Восстановление, adb restore:

Код: Выделить всё

adb restore full-userapps.ab
Опять увидите запрос:

Код: Выделить всё

Now unlock your device and confirm the restore operation.
На устройстве появится окно "Восстановить все данные". Если архив зашифрован, там же спросят пароль, которым вы его создавали. Нажмите "Восстановить". Учтите три вещи. Первая: restore накатывает данные поверх установленного приложения, версия приложения должна быть совместима. Вторая: если в архиве были apk (-apk), система предложит доустановить отсутствующие пакеты. Третья: приложение, которое во время бэкапа было запущено, лучше остановить перед restore.

Формат .ab и извлечение содержимого:

Файл .ab это текстовый заголовок плюс поток данных. Заголовок выглядит так:

Код: Выделить всё

ANDROID BACKUP
5
1
none
Строки по порядку: магия ANDROID BACKUP, версия формата, флаг сжатия (1 = сжато deflate), тип шифрования (none или AES-256). Если шифрование AES-256, дальше идут ещё строки с солями, числом раундов PBKDF2 и зашифрованным мастер-ключом.

Для самого простого случая (версия 1, none, без шифрования) заголовок занимает ровно 24 байта, и tar внутри можно вытащить вручную:

Код: Выделить всё

dd if=app.ab bs=1 skip=24 | python3 -c "import sys,zlib; sys.stdout.buffer.write(zlib.decompress(sys.stdin.buffer.read()))" > app.tar
tar tvf app.tar
Почему python, а не openssl zlib: подкоманда zlib в openssl часто не собрана, а python есть везде. И сразу оговорка: трюк со skip=24 работает только для версии 1 без шифрования. Для версий 2-5 и зашифрованных архивов длина заголовка другая, нужен нормальный инструмент.

Android Backup Extractor (abe):

abe это java-утилита (проект Android Backup Extractor, известный как nelenkov на GitHub), распространяется как abe.jar. Она понимает все версии формата и умеет шифрование. Нужна установленная Java.

Распаковка незашифрованного архива в обычный tar:

Код: Выделить всё

java -jar abe.jar unpack full-userapps.ab full.tar
Зашифрованного, пароль четвёртым аргументом:

Код: Выделить всё

java -jar abe.jar unpack wallet.ab wallet.tar "МойПарольОтБэкапа"
Дальше распаковываете tar как обычно:

Код: Выделить всё

tar xvf full.tar
Внутри увидите структуру вида apps/com.example.wallet/db/, /sp/ (SharedPreferences), /r/ (files) и так далее. abe умеет и обратную операцию pack, чтобы собрать модифицированный tar обратно в .ab и накатить через adb restore. Если abe ругается на BadPaddingException при unpack, значит пароль неверный.

Ограничения, почему backup так захирел:

Начиная с Android 12 (API 31) данные приложений, нацеленных на API 31 и выше, по умолчанию исключаются из adb backup. Разработчик может вернуть их в дамп, только выставив в манифесте android:debuggable="true", то есть на серийных приложениях из Google Play данные через adb backup вы не снимете. Итог на Android 14/15: для большинства установленных приложений архив получается почти пустым, хотя сам файл создаётся. Это не ошибка, это политика безопасности.

Второй ограничитель древнее: атрибут android:allowBackup в манифесте. По умолчанию он true, но банки, мессенджеры и платёжки давно ставят android:allowBackup="false", и их данные в бэкап не попадают вообще, независимо от версии Android.

Третье: общее хранилище (-shared) на многих прошивках не выгружается или выгружается частично. И весь механизм однопоточный, медленный, без докачки: оборвалась передача, начинайте сначала.

Альтернативы:

Перенос между устройствами OEM решают своими утилитами: Samsung Smart Switch, Xiaomi (Mi Mover и облако Mi Cloud), Huawei Phone Clone, OnePlus Clone Phone. Они переносят больше и без возни с adb, но это перенос, а не файловый архив для анализа.

Облако: Google One Backup (системный механизм Android Auto Backup) сам складывает данные в аккаунт Google, восстановление идёт при первичной настройке нового устройства.

Для кастомных прошивок и GrapheneOS есть Seedvault, открытый бэкап-движок с шифрованием, который снимает заметно больше, чем adb backup, и не упирается в политику API 31.

С root выбор шире: Neo Backup (бывший OAndBackup), Swift Backup, исторический Titanium Backup. С root можно просто тащить /data/data напрямую через tar и adb pull, минуя Backup Manager:

Код: Выделить всё

adb shell "su -c 'tar czf /sdcard/wallet-data.tgz /data/data/com.example.wallet'"
adb pull /sdcard/wallet-data.tgz .
Этот путь надёжнее adb backup на свежих Android, но требует root и аккуратности с правами и SELinux-контекстами при восстановлении.

Если данные приложения вам не нужны, а нужны только пользовательские файлы, не выдумывайте backup, обычный adb pull из главы про файловую систему закроет задачу проще и без экрана подтверждения.

Связанный инструмент bmgr:

На устройстве есть оболочечная утилита bmgr, она управляет облачным Backup Manager (тем, что льёт в Google), а не локальным .ab. Полезна при отладке Auto Backup:

Код: Выделить всё

adb shell bmgr enabled
adb shell bmgr list transports
adb shell bmgr backupnow com.example.app
Это другой механизм, не путайте его с adb backup, хотя растут они из одного сервиса.

Частые ошибки и обходы:

Код: Выделить всё

adb: unable to connect for backup: no devices/emulators found
Устройство не подключено или не авторизовано. Проверьте adb devices, примите запрос отладки на экране.

Архив получился 1-2 КБ и пустой. Это не баг adb, а политика Android 12+ (данные исключены) либо allowBackup=false у целевого приложения. Снимайте через root и tar или OEM-инструментом.

Окно подтверждения не появляется. Экран должен быть разблокирован, отладка авторизована, а на части AOSP/TV-сборок full backup отключён в прошивке вовсе, тогда никакое окно не выйдет.

abe падает с BadPaddingException. Неверный пароль архива. Пароль чувствителен к раскладке и регистру, вводите ровно тот, что задавали на устройстве.

restore прошёл, но данные не подхватились. Чаще всего версия установленного приложения несовместима с данными из архива, либо приложение запрещает restore через allowBackup. Поставьте ту же версию apk, что была на момент бэкапа.
👍2 ❤️4 🔥 😄 🤔1
✔ Лучший ответ сформирован автоматически — tw1x
Подскажите по фразе android_roman писал(а):начиная с Android 12 (API 31) данные приложений, нацеленных на API 31 и выше, по умолчанию исключаются из adb backup я на Pixel 8 Android 15 сделал adb backup -all -apk, файл 3 кб и внутри пусто. Правильно понимаю, что это вот оно и есть и для обычных приложений из плеймаркета вариантов через adb уже нет? Или -shared что-то спасёт?
Перейти к ответу →
Аватара пользователя
tw1x
Сообщения: 2
Зарегистрирован: 15 май 2026, 15:06

Re: Резервное копирование и восстановление (backup)

Сообщение tw1x »

✔ Лучший ответ — сформирован автоматически
Подскажите по фразе
android_roman писал(а):начиная с Android 12 (API 31) данные приложений, нацеленных на API 31 и выше, по умолчанию исключаются из adb backup
я на Pixel 8 Android 15 сделал adb backup -all -apk, файл 3 кб и внутри пусто. Правильно понимаю, что это вот оно и есть и для обычных приложений из плеймаркета вариантов через adb уже нет? Или -shared что-то спасёт?
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
Roberts_jc
Сообщения: 1
Зарегистрирован: 14 май 2026, 09:53

Re: Резервное копирование и восстановление (backup)

Сообщение Roberts_jc »

А если архив снят на старом телефоне Android 9 с паролем, а пароль я частично забыл, abe реально перебирать или там PBKDF2 раундов столько что бесполезно? Кто пробовал brute по словарю на .ab
👍 ❤️2 🔥2 😄 🤔
Аватара пользователя
k_taylor
Сообщения: 1
Зарегистрирован: 21 май 2026, 02:15

Re: Резервное копирование и восстановление (backup)

Сообщение k_taylor »

поправка по трюку с dd: skip=24 у меня сработал только на тестовом эмуляторе, на реальном Xiaomi заголовок был версии 4 и tar бился. так что не тратьте время, сразу abe unpack, он сам разрулит версию. python кстати тоже не нужен если abe есть
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
tor87
Сообщения: 1
Зарегистрирован: 21 май 2026, 10:02

Re: Резервное копирование и восстановление (backup)

Сообщение tor87 »

не сразу понял разницу между bmgr и adb backup, спасибо что развели. получается bmgr backupnow это в облако гугла льёт, а локального .ab он не делает вообще? а как тогда локально проверить что Auto Backup для моего приложения вообще работает, через localtransport?
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Команды для поставщиков контента (content)
Следующая глава →
Проброс портов и туннелирование

Все главы курса «ADB: Android Debug Bridge»

Поделиться темой: ✈ Telegram VK

Вернуться в «ADB: Android Debug Bridge»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость