allowBackup
属性大家都不陌生,为了安全起见最好将它关闭。对它的认识好像也仅限于此了,事实上Google在Backup功能上花了很多心思,提供了多个模式的选择和充分的定制接口。本文将带大家全面复盘Backup功能的由来
、原理
和定制方法
,以备不时之需。篇幅较长,配合收藏更佳。
为节省部分读者的时间,贴出重点章节供快速空降。
- 关心Backup功能
原理
的,直接空降2.8
章节 - 关心Backup功能
测试
的,直接空降3.2
章节 - 关心Backup文件
破解
的,直接空降3.3
章节 - 关心Backup
实战
的,直接空降4.0
章节 - 关心
Android 12
影响的,直接空降5.0
章节
1. 前言
两年前我就遇到过一个Backup功能相关的CTS问题,说的是整机恢复到AccessibilitySerivce
的时候发生错误。整机备份和恢复非常耗时,我不可能真的跑一遍去定位问题,我得找个高效的办法。
通过查阅Backup的原理我知道了可以单独Backup
和Restore
某个app,甚至可以解密备份文件查看数据内容。有了这些方法的协助,我很快就找到了原因。
虽然很快地解决了那个问题,但我的心里留下了一个想法。Backup功能好像比我想象的复杂有趣,一定要找个时间好好了解一下。恰逢近期在做Backup功能的定制,对这块有了充分的认识,便整理出来分享给大家。
2. 完整认识Backup
2.1 功能由来
手机等智能设备是现代生活中的重要角色,我们会在这些智能设备上做登录账户,设置偏好,拍摄照片,保存联系人等日常操作。
这些数据耗费了我们很多时间和精力,对我们而言极为重要。如果我们的设备换代了或者重新安装了某个应用,之前使用的数据如果能自动保留,那将是非常出色的用户体验。而保留数据的第一步则在于Backup环节。
2.2 数据来源
用户的数据可以笼统地划分为三块:登录账号相关的身份数据、系统设置相关的偏好以及各App的数据。这三块数据的类型不同、位置不同,进而导致Backup的实现也不同。
- App数据:应用内部的图片,视频等数据。这是我们尤为关心的数据,如何安全完整地转移这些数据是Backup功能的目标所在,也是本文需要讲解的核心内容
- 身份数据:用户登录的身份数据。可以通过Smart Lock或Account Transfer API在设备间立即恢复登录状态
- 设置偏好:系统设置App和SettingProvider将记录用户的偏好数据,甚至包括用户授予App的权限记录。系统将针对这些设置数据备份和恢复
2.3 备份对象
我们知道可以将数据存放在App目录,也可以存放于公共目录。但随着Android系统针对公共目录的限制愈加严格,将数据存放到App自己的目录显得更加合理。
App自身目录的这块数据顺理成章地成为Backup功能的主要对象,按照文件的类型可以细分如下。
类型 | 路径 | 取得对应文件的API |
---|---|---|
data |
/data/data/com.xxx/ | getDataDir()/getDir() |
files |
/data/data/com.xxx/files/ | getFilesDir() |
databases |
/data/data/com.xxx/databases/ | getDatabasePath() |
sharedpreferences |
/data/data/com.xxx/sp/ | getSharedPreferences() |
注意:
- 放置在外部存储空间中的文件也是支持的,这里不再赘述
- cache、nobackup等目录下的文件不在Backup对象内
Backup操作从最外层的data目录开始,按照文件单位逐个读取逐个备份。目录内的文件一般按照文件名的顺序进行备份,但这个顺序无法保证,取决于File#list()
API的结果。