现在智能手机更新换代的速度极快,基本上是每年都要换新的手机。但是,换了手机后最麻烦的事情是要重新装很多软件,并且最好还能将原来手机上的配置和数据等信息都还原到新的手机上来,最大程度的减少换机带来的不方便。
对于iOS设备来说,恢复起来很容易。但是,在Android设备上就比较痛苦了。还好,Google在Android API Level 8以上,官方提供了通过adb对应用程序数据的备份和恢复的功能。
此功能的开关决定于该应用程序AndroidManifest.xml文件中,application标签下,android:allowBackup属性的取值。当这个属性被设置为true时,表示该应用程序允许系统通过adb备份和恢复数据;而如果这个属性被设置为false的话,则表示该应用程序不允许系统通过adb备份和恢复数据,即使做全系统备份也不行。默认情况下,不特别指定的话,这个标志被设置为true。
其实这个功能实现起来很简单,就是把应用程序的私有数据目录(在/data/data/
下面,我们来看看具体的过程,主要分为以下几步:
1)将设备连上电脑,打开设备的USB debugging功能,装好相应的驱动程序,保证在电脑上键入adb devices命令可以看到你的设备;
2)通过adb backup命令,将应用程序私有目录下的数据备份到PC机上
命令格式大致如下:
adb backup [-f ] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] []
-f用来指定要将备份数据写到那个文件中,如果不指定的话,则默认保存在当前目录的“
backup.ab”文件中。
-apk参数指定要连着程序的apk文件一起备份;而-noapk参数刚好相反,只备份数据,不备份程序本身。两个参数只能选其一,如果不指定的话,默认是-noapk。
-obb参数要求备份的时候包含程序的一些连带的扩展数据(即obb文件,例如大型游戏的数据包文件);而-noobb参数相反,要求备份的时候不包含程序的扩展数据。两个参数只能选其一,如果不指定的话,默认是-noobb。
-shared参数要求备份程序存放在SD卡上的数据;而-noshared参数相反,不要备份程序存放在SD卡上的数据。两个参数只能选其一,如果不指定的话,默认是-noshared。
-all参数要求备份设备上所有安装程序的数据,前提是程序允许备份。
如果命令包含-all参数的话,还可以选择是否备份系统自带程序的数据,-system表示备份系统自带程序的数据,而-nosystem表示不备份系统自带程序的数据。两个参数只能选其一,如果不指定的话,默认是-system。
最后,如果你只想备份指定程序数据的话,可以在命令中逐一列出它们的包名。
下面来看看具体怎么操作。假设我只想备份手机上所有非系统程序的数据到当前目录下的backup.ab文件中的话,可以在PC上键入如下的命令:
adb backup -all -nosystem
这个时候,在对应的设备上会弹出一个对话框,确认是否确认要备份,同时还可以对备份出来的文件用指定密码加密:
确认选择“Back up my data”,经过一段时间之后,备份完成,可以看到当前PC目录下会有一个backup.ab文件,这个就是备份出来的数据。
3)通过adb restore命令,将PC上的备份数据恢复到设备上不同应用程序的私有目录下
这个命令的格式很简单:
adb restore
只有一个参数,就是备份到PC上的那个文件。
在PC上键入恢复指令后,在对应的设备上会弹出一个对话框,确认是否要将备份文件恢复到设备上,这个动作会用备份文件中的数据覆盖掉设备上的数据:
确认选择“Restore my data”,经过一段时间后,备份的数据会被恢复到设备上。
可以看出来,这个功能还是非常方便和好用的。但是同时,该功能也可能对应用程序带来严重的安全隐患,主要有以下几点:
1)备份功能只要求PC能通过adb连接上设备就可以了,并不需要别的特殊权限;
2)备份出来的数据并不强制要求加密,有专门的工具可以逆向将备份数据解析出来。
第一点前面已经在前面演示过了。至于第二点,可以使用一个叫做“Android Backup Extractor”的工具将.ab文件解析成一个.tar包文件。这个工具是SourceForge上的一个开源项目,其地址是:http://sourceforge.net/projects/adbextractor/,可以在主页上将这个工具的zip包下载下来,并解压缩到本地目录下,其是用Java写的,需要JRE环境才能运行。
如果想解析备份数据文件的话,可以用下面的命令:
java -jar abe.jar unpack [password]
先指定要解析的备份数据文件,再指定解析完之后结果存放的文件,最后如果备份的时候指定密码的话,需要在命令的最后输入。
对刚才的备份数据文件,执行上面的命令后,再将生成的tar文件解出来,所有备份的数据一览无遗。
每个应用的私有数据都存放到以其包名命名的目录下:
手机比较干净,只装了三个程序。看看每个目录中都有什么:
这里面保存了该应用程序私有数据目录(/data/data/
1)目录db下,存放database目录下的所有文件;
2)目录f下,存放files目录下的所有文件;
3)目录sp下,存放shared_prefs目录下的所有文件;
4)目录r下,存放剩下的其它所有文件和目录。
关于应用程序私有目录更详细的介绍,可以参考《Android应用程序私有目录下文件操作总结》。
所以,如果你有重要信息被存放到手机上,哪怕是存放在自己程序的私有目录下,都可以通过adb backup方法完全读取出来。唯一的前提条件是PC可以通过adb和设备建立连接,并不需要root权限。
因此建议,如果你的程序并不想被备份的话,尽量将android:allowBackup属性设置为“false”。