Код: Выделить всё
WARNING: adb backup is deprecated and may be removed in a future release
Что такое 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
Код: Выделить всё
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.
Формат .ab и извлечение содержимого:
Файл .ab это текстовый заголовок плюс поток данных. Заголовок выглядит так:
Код: Выделить всё
ANDROID BACKUP
5
1
none
Для самого простого случая (версия 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
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 xvf full.tar
Ограничения, почему 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 .
Если данные приложения вам не нужны, а нужны только пользовательские файлы, не выдумывайте 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: unable to connect for backup: no devices/emulators found
Архив получился 1-2 КБ и пустой. Это не баг adb, а политика Android 12+ (данные исключены) либо allowBackup=false у целевого приложения. Снимайте через root и tar или OEM-инструментом.
Окно подтверждения не появляется. Экран должен быть разблокирован, отладка авторизована, а на части AOSP/TV-сборок full backup отключён в прошивке вовсе, тогда никакое окно не выйдет.
abe падает с BadPaddingException. Неверный пароль архива. Пароль чувствителен к раскладке и регистру, вводите ровно тот, что задавали на устройстве.
restore прошёл, но данные не подхватились. Чаще всего версия установленного приложения несовместима с данными из архива, либо приложение запрещает restore через allowBackup. Поставьте ту же версию apk, что была на момент бэкапа.