Я создал резервную копию моего Galaxy Nexus с adb backup
. Полученный файл называется backup.db, и он каким-то образом зашифрован.
Я хотел восстановить резервную копию, но она останавливается, когда дело доходит до восстановления com.android.providers.contacts
. Раньше я adb logcat
выяснял, что происходит, и обнаруживал, что происходит com.android.acore
сбой во время процесса восстановления.
Я хотел бы получить доступ к данным в резервной копии и удалить базу данных контактов, чтобы восстановить все обратно на мой телефон. Есть ли другие способы восстановления данных из резервной копии?
BackupManagerService
чтобы прочитать содержимое файла резервной копии. Это хороший объем работы, но мне нужны мои данные обратно ...Я начал работать над этим. Пока я публикую свои результаты в качестве ответа "сообщества вики" по двум причинам: во-первых, если кто-то хочет присоединиться, есть место для разговора; во-вторых, если я отойду от этого проекта, у кого-то еще будут советы начать работать.
Логика резервного копирования на хосте полностью содержится в https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp в названной функции
backup
. Функция очень проста: она проверяет параметры командной строки, отправляет команду, в основном, как есть, демону adb на телефоне и записывает вывод телефона в файл. Нет даже проверки ошибок: если, например, вы отказываетесь от резервного копирования на телефоне,adb
просто записывает пустой файл.На телефоне логика резервного копирования начинается
service_to_fd()
с https://github.com/android/platform_system_core/blob/master/adb/services.cpp . Функция определяет, что команда от хоста есть"backup"
, и передает команду unparsed/system/bin/bu
, которая является тривиальным сценарием оболочки, который запускаетсяcom.android.commands.bu.Backup
как основной класс нового процесса приложения Android. Это вызывает,ServiceManager.getService("backup")
чтобы получить службу резервного копирования какIBackupManager
, и вызываетIBackupManager.fullBackup()
, передавая ему все еще неиспользованный файловый дескриптор (очень косвенно), связанный сbackup.ab
файлом на хосте.Управление передается
fullBackup()
в com.android.server.backup.BackupManagerService , который выскакивает в GUI, запрашивая у пользователя подтверждение / отклонение резервной копии. Когда пользователь делает это,acknowledgeFullBackupOrRestore()
(тот же файл) вызывается. Если пользователь одобрил запрос,acknowledgeFullBackupOrRestore()
выясняет, зашифрована ли резервная копия, и передает сообщениеBackupHandler
(тот же файл),BackupHandler
затем создает экземпляр и запускаетPerformAdbBackupTask
( тот же файл, строка 4004 на момент написания)Наконец, мы начинаем генерировать вывод там
PerformAdbBackupTask.run()
, между строки 4151 и 4330 .Сначала
run()
записывается заголовок, который состоит из 4 или 9 строк ASCII:"ANDROID BACKUP"
"4"
"0"
если архив не распакован, либо"1"
если"none"
или"AES-256"
"10000"
Фактические данные резервного копирования следующим образом , либо в виде ( в зависимости от сжатия и шифрования)
tar
,deflate(tar)
,encrypt(tar)
, илиencrypt(deflate(tar))
.TODO : запишите путь к коду, который генерирует вывод tar - вы можете просто использовать tar, если записи находятся в правильном порядке (см. Ниже).
Формат архива тар
Данные приложения хранятся в каталоге app /, начиная с файла _manifest, APK (если требуется) в /, файлы приложения в f /, базы данных в db / и общие настройки в sp /. Если вы запросили резервное копирование внешнего хранилища (используя опцию -shared), в архиве также будет каталог shared /, содержащий файлы внешнего хранилища.
Детали шифрования
Пример реализации кода пакета / распаковки (производит / использует) архивы tar: https://github.com/nelenkov/android-backup-extractor
Некоторые подробности здесь: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html
Скрипты Perl для упаковки / распаковки и исправления испорченных архивов:
http://forum.xda-developers.com/showthread.php?p=27840175#post27840175
источник
Отличный и подробный ответ от Николая Еленкова . Однако я должен добавить, что кто-то уже разработал программное обеспечение, которое делает именно это и упаковывает его здесь: http://sourceforge.net/projects/adbextractor/
Пакет содержит инструменты Java и Perl. Я сам предпочитаю Perl вместо Java каждый день, поэтому я извлек коды Perl, убедился, что они исполняемые, установил требуемую библиотеку Perl и запустил
backupdecrypt.pl
файл резервной копии против adb, и он преобразовал его в файл tar или gzipped tar без каких-либо вопрос.Я даже сформировал один вкладыш в Bash 3, который позволяет мне делать резервное копирование adb напрямую в файл gzipped tar:
Надеюсь, это поможет.
источник
Для изучения существующего файла резервной копии, попробуйте страницу http://www.adb-backup.com , это просто без "dd", "tar", ...
Данные не хранятся на этом сервере. Я разработал этот онлайн-сервис, чтобы упростить просмотр резервных копий без манипуляций с dd / tar или установки дополнительного программного обеспечения. Я автор www.adb-backup.com
источник