测试应用时,关闭模拟器再打开,数据还在,不代表换一台虚拟设备也能恢复。安卓虚拟设备的应用数据持久化设计,应分别验证设备内保存、备份恢复和重新安装后的行为。下面六项检查适用于本地开发、自动化测试及演示环境,不依赖特定行业。
1. 分清数据保存位置与设备生命周期
先列出应用写入的内容:数据库、SharedPreferences 和应用私有目录中的文件通常属于应用私有数据;缓存可被系统清理,不应存放唯一副本。应用卸载或虚拟设备数据被清除后,私有数据通常也会消失。
- 在 Android Studio 的 Device Manager 中创建测试用 AVD(Android Virtual Device)。
- 写入一条可辨认的测试记录,正常关闭模拟器后重新启动,检查记录是否仍在。
- 再分别执行应用卸载重装、清除应用数据和删除后重建 AVD,记录每种操作后的结果。
这能区分“进程重启仍保留”和“设备重建仍可恢复”两种要求,避免把模拟器磁盘当作可靠备份。
2. 检查快照是否造成旧状态回滚
模拟器快照能保存某一时刻的设备状态,适合缩短测试启动时间;恢复快照也可能让数据回到旧版本。若测试流程把数据库迁移到新版,随后恢复旧快照,应用可能再次读到旧结构。
检查时,先写入标记数据并创建快照,再更新数据、退出并恢复快照,确认哪些内容被回滚。把快照用于可丢弃的测试环境;需要验证升级和恢复的场景,则另建不依赖旧快照的测试设备。
3. 验证备份与恢复不是“看起来成功”
Android Auto Backup 是否生效,受系统版本、应用清单配置、用户设置及设备备份条件影响,不能只凭应用能启动就认定数据已恢复。对数据库,还要检查表结构、记录数量和版本迁移;对文件,则应核对文件是否真实存在且可读取。
- 准备一组不含真实个人信息的测试数据,并记录预期记录数。
- 按目标设备和系统版本配置执行备份、恢复;同时测试未启用备份或恢复失败的情形。
- 恢复后检查数据完整性,并确认重复恢复不会额外生成重复记录。
安卓虚拟设备的应用数据持久化设计要明确:哪些内容依靠系统备份,哪些必须由应用提供可验证的导出或重建流程。
4. 不把密钥和普通文件同等处理
Android Keystore 用于保存或使用应用密钥;密钥材料通常不能像普通文件那样直接复制到另一台设备。应用若把加密数据备份了,却没有考虑目标设备上的密钥不可用,恢复后可能只能看到无法解密的数据。
分别测试原设备重启、应用重装和新 AVD 恢复。明确密钥丢失时的处理:允许重新登录后从可信来源取回数据,或提示用户重新建立本地数据;不要把口令、令牌或私钥明文写入日志和普通偏好文件。
5. 检查存储权限和路径变化
Android 的 scoped storage(分区存储)限制应用访问共享存储的方式。应用私有目录与用户可见的共享文件用途不同:前者适合应用内部状态,后者适合用户主动管理的文档。不要假设某个外部存储路径在所有设备和系统版本上都固定可用。
在至少一个目标 Android 版本上,分别测试拒绝权限、撤销权限和文件被用户移走的情况。界面应区分“文件不存在”和“无权访问”,并提供重新选择文件或重新生成数据的操作。
6. 防止多进程、崩溃和测试并发损坏数据
突然关机、应用崩溃或两个测试同时写入,可能暴露只在正常退出时才保存的问题。使用 SQLite 等数据库时,按事务提交一组相关修改;测试重复提交、应用被强制停止以及并发写入后的数据状态。
自动化测试若共享同一 AVD 或同一套数据目录,测试之间可能互相污染。为每个并行任务使用独立设备实例或明确重置数据,并在测试结束时核对清理结果。安卓虚拟设备的应用数据持久化设计应把失败恢复和隔离纳入验收,而不只是确认一次写入成功。
常见问题
关闭模拟器后,应用数据一定会保留吗?
正常关闭并再次启动同一 AVD 时,设备数据通常仍在;删除 AVD、清除数据或卸载应用会带来不同影响,需分别验证。
快照可以代替备份吗?
不可以。快照主要用于恢复虚拟设备状态,可能回滚到旧状态;应用备份应单独验证恢复内容和完整性。
缓存适合保存重要数据吗?
不适合。缓存可被系统清理,重要状态应保存到合适的持久化位置,并设计备份或重建方式。
最小验证集是什么?
至少测试正常重启、应用重装、清除数据、快照恢复、备份恢复和异常退出,并记录每种操作的预期结果。