我使用创建了Galaxy Nexus的备份adb backup
。生成的文件名为backup.db,并以某种方式进行了加密。
我想还原备份,但是在还原时它停止了com.android.providers.contacts
。我曾经adb logcat
了解正在发生的事情,com.android.acore
并发现在还原过程中崩溃了。
我想访问备份中的数据,并删除通讯录数据库以将所有内容恢复到我的手机中。还有其他方法可以从备份中还原数据吗?
我使用创建了Galaxy Nexus的备份adb backup
。生成的文件名为backup.db,并以某种方式进行了加密。
我想还原备份,但是在还原时它停止了com.android.providers.contacts
。我曾经adb logcat
了解正在发生的事情,com.android.acore
并发现在还原过程中崩溃了。
我想访问备份中的数据,并删除通讯录数据库以将所有内容恢复到我的手机中。还有其他方法可以从备份中还原数据吗?
Answers:
除非您在创建备份时指定,否则文件不会加密。但是,它已压缩(使用放气)。您可以通过查看Android源代码(com / android / server / BackupManagerService.java)找出确切的格式,并且从技术上讲应该可以从中提取特定数据。但是,IIRC进行了一些文件完整性检查,因此,如果仅从文件中删除一堆数据,它很可能将无法工作。不幸的是,该restore
命令似乎没有选择仅还原特定应用程序/软件包或排除软件包的选项。
BackupManagerService
内容以读取备份文件的内容。这是一项
我开始研究这个。到目前为止,我将我的结果作为“社区Wiki”答案发布在这里,其原因有两个:第一,如果其他人想加入,那么有个交流的地方。第二,如果我不参与这个项目,就会有其他人开始工作的提示。
主机上的备份逻辑完全包含在名为的函数中的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"
,并将未解析的命令传递给/system/bin/bu
,这是一个琐碎的Shell脚本,可以com.android.commands.bu.Backup
作为新的Android应用程序进程的主类启动。调用ServiceManager.getService("backup")
将备份服务作为进行获取IBackupManager
,并调用IBackupManager.fullBackup()
,将仍未使用的文件描述符(非常间接地)传递给该backup.ab
文件,该文件描述符已连接到主机上的文件。
控制转到fullBackup()
在com.android.server.backup.BackupManagerService,其中弹出/图形用户界面询问用户以确认拒绝备用。用户这样做时,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(请参见下文)。
Tar存档格式
应用程序数据存储在app /目录下,以_manifest文件,a /中的APK(如果需要),f /中的应用程序文件,db /中的数据库以及sp /中的共享首选项开头。如果您请求外部存储备份(使用-shared选项),则归档中还将包含一个共享目录,其中包含外部存储文件。
$ tar tvf mybackup.tar
-rw------- 1000/1000 1019 2012-06-04 16:44 apps/org.myapp/_manifest
-rw-r--r-- 1000/1000 1412208 2012-06-02 23:53 apps/org.myapp/a/org.myapp-1.apk
-rw-rw---- 10091/10091 231 2012-06-02 23:41 apps/org.myapp/f/share_history.xml
-rw-rw---- 10091/10091 0 2012-06-02 23:41 apps/org.myapp/db/myapp.db-journal
-rw-rw---- 10091/10091 5120 2012-06-02 23:41 apps/org.myapp/db/myapp.db
-rw-rw---- 10091/10091 1110 2012-06-03 01:29 apps/org.myapp/sp/org.myapp_preferences.xml
加密细节
打包/解压缩代码实现示例(生产/使用)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
尼古拉·埃伦科夫(Nikolay Elenkov)给出了详尽而详尽的答案。但是,我应该补充一点,有人已经开发了可以执行此操作的软件,并将其打包在此处:http : //sourceforge.net/projects/adbextractor/
该软件包包含Java和Perl工具。我自己每天都比Java更喜欢Perl,因此我提取了Perl代码,确保它们可执行,安装了所需的Perl库,并backupdecrypt.pl
针对adb备份文件运行,然后将其转换为tar或gzip压缩的tar文件,问题。
我什至在Bash 3中形成了一个衬板,使我可以直接将adb备份到压缩的tar文件中:
adb backup -f >(backupdecrypt.pl -D -z - backup.tgz) -all
希望能帮助到你。
要浏览现有的备份文件,请尝试http://www.adb-backup.com页面,它很简单,没有“ dd”,“ tar”,...
数据未存储在此服务器上。我开发了此在线服务,以使其更轻松地查看备份而无需使用dd / tar或安装其他软件。我是www.adb-backup.com