数据存储:数据备份:测试备份和还原

此页面显示如何手动触发自动备份,键/值备份和还原操作,以确保您的应用程序正确保存和恢复数据。


一、备份如何运行

该部分介绍了Android备份框架中的各种功能,以及它们如何与支持自动备份和键/值备份的应用程序进行交互。 在应用程序开发阶段,框架的大部分内部工作都被抽象出来,因此您不需要知道这些信息。 然而,在测试阶段,对这些概念的了解很重要。


下图说明了备份和还原期间数据流的方式:


备份管理器服务是一个Android系统服务,协调和启动备份和还原操作。 该服务可通过BackupManager API访问。 在备份操作期间,服务会将您的应用程序查询备份数据,然后将其传送到备份传输,然后归档数据。 在恢复操作期间,备份管理器服务从备份传输中检索备份数据,并将数据恢复到设备。


备份传输是负责存储和检索备份的Android组件。 Android设备可以有零个或多个备份传输,但只有其中一个传输可以被标记为活动。 可用的备份传输可能因设备而异(由于设备制造商和服务提供商的自定义),但大多数支持Google Play的设备都附带以下传输:

1、Google传输(默认) -  大多数设备上的活动备份传输是Google移动服务的一部分。 本文档假定用户正在使用Google传输。 此传输将自动备份数据存储在用户的Google云端硬盘帐户中的私人文件夹中。 密钥/值备份数据存储在Android备份服务中。


2、本地传输 - 将备份数据在本地存储在设备上。 这种传输通常用于开发/调试目的,在现实世界中无用。


如果设备没有任何备份传输,则无法备份数据。 您的应用没有受到不利影响。


注意:由于备份传输可能因设备而异,因此在使用备份时,Android无法保证数据的安全。 使用备份来存储敏感数据(如用户名和密码)要小心谨慎。



二、先决条件

您需要了解以下工具:

1、adb - 在设备或仿真器上运行命令。


2、bmgr - 执行各种备份和恢复操作。


3、logcat - 查看备份和还原操作的输出。



三、准备您的设备或模拟器

通过以下检查清单准备您的设备或模拟器进行备份测试:

1、对于自动备份,请检查您是否使用运行Android 6.0(API级别23)或更高版本的设备或模拟器。


2、对于Key / Value Backup,请检查您是否使用运行Android 2.2(API级别8)或更高版本的设备或模拟器。


3、检查设备或模拟器上是否已启用备份和还原,并添加了Google帐户。 有两种方法来检查:

 1)、在设备上,转到设置 - >备份和还原。

 2)、从adb shell,运行bmgr启用。


 在物理设备上,通常在初始设置向导期间启用备份和还原。 仿真器不运行安装向导,因此请勿忘记启用备份,并在设备设置中指定备份帐户。


4、通过运行以下命令,确保Google Backup Transport可用并处于活动状态:

$ adb shell bmgr list transports

然后,检查控制台的以下输出:

android/com.android.internal.backup.LocalTransport
* com.google.android.gms/.backup.BackupTransportService

没有Google Play的物理设备和没有Google API的仿真器可能不包括Google备份传输。 本文假设您正在使用Google备份传输。 您可以使用其他备份传输测试备份和恢复,但过程和输出可能不同。



四、测试备份

要启动应用程序的备份,请运行以下命令:

$ adb shell bmgr backupnow <PACKAGE>

backupnow命令在运行Android 7.0或更高版本的设备和仿真器上可用。 它根据包的清单声明运行密钥/值备份或自动备份。 检查logcat以查看备份过程的输出。 例如:

D/BackupManagerService: fullTransportBackup()
I/GmsBackupTransport: Attempt to do full backup on <PACKAGE>

---- or ----

V/BackupManagerService: Scheduling immediate backup pass
D/PerformBackupTask: starting key/value Backup of BackupRequest{pkg=<PACKAGE>}

如果backupnow命令在您的设备上不可用,请完成以下步骤的自动备份或键/值备份。


对于自动备份,请完成以下步骤:

1、运行以下命令:

$ adb shell bmgr backup @pm@ && adb shell bmgr run

2、等待直到上一步骤中的命令通过监视adb logcat获得以下输出结果:

I/BackupManagerService: K/V backup pass finished.

3、运行以下命令执行完全备份:

$ adb shell bmgr fullbackup <PACKAGE>

注意:fullbackup命令强制您的应用程序执行完全备份,即使您的应用程序实现了键/值备份。 系统将忽略您的应用程序的备份配置,并将其作为android:fullBackupOnly属性设置为true。


对于密钥/值备份,请按照以下步骤安排并运行备份:

1、如果您的应用程序自上次备份以来尚未调用BackupManager.dataChanged(),则可以通过运行以下命令将应用程序包括在备份操作中进行测试:

$ adb shell bmgr backup <PACKAGE>

2、然后,您可以通过运行以下命令来触发备份:

$ adb shell bmgr run

bmgr备份将您的应用程序添加到备份管理器队列。 bmgr运行启动备份操作,这将强制备份管理器执行其队列中的所有备份请求。


测试密钥/值备份时,必须验证每个首选项更改计划备份。 您可以使用以下方法之一验证备份是否安排:

1、运行adb shell dumpsys备份,并检查您的应用程序是否列在Pending键/值备份下的命令输出中。


2、在安排备份时记录消息。 然后,您可以运行adb logcat,并检查命令的输出,以验证备份是否已安排。



五、测试恢复

要手动启动还原,请运行以下命令:

$ adb shell bmgr restore <TOKEN> <PACKAGE>

警告:执行还原操作之前,此操作会停止应用程序并擦除其数据。


要查找备份令牌,请运行adb shell dumppsys备份。 令牌是遵循标签Ancestral:和Current:的十六进制字符串。 祖先令牌是指在初始设置时(使用设备设置向导)用于恢复设备的备份数据集。 当前令牌是指设备的当前备份数据集(设备当前正在发送其备份数据的数据集)。


然后,检查logcat以查看恢复过程的输出。 例如:

V/BackupManagerService: beginRestoreSession: pkg=<PACKAGE> transport=null
V/RestoreSession: restorePackage pkg=<PACKAGE> token=368abb4465c5c683
...
I/BackupManagerService: Restore complete.

您还可以通过使用adb或通过Google Play商店应用卸载并重新安装应用,来测试应用的自动还原。



六、故障排除

本节帮助您解决一些常见问题。


1、运输配额超标

如果您在logcat中看到以下消息:

I/PFTBT: Transport rejected backup of <PACKAGE>, skipping

--- or ---

I/PFTBT: Transport quota exceeded for package: <PACKAGE>

您的应用已超出配额。 减少备份数据量,然后重试。 例如,验证您是否只将数据缓存在应用程序的缓存目录中。 备份中不包括缓存目录。


2、完全备份是不可能的

如果您在logcat中看到以下消息:

I/BackupManagerService: Full backup not currently possible -- key/value backup not yet run?

完全备份操作失败,因为设备上尚未发生密钥/值备份操作。 使用命令bmgr运行触发键/值备份,然后重试。

3、超时等待代理

如果您在logcat中看到以下消息:

12-05 18:59:02.033  1910  2251 D BackupManagerService:
    awaiting agent for ApplicationInfo{5c7cde0 com.your.app.package}
12-05 18:59:12.117  1910  2251 W BackupManagerService:
    Timeout waiting for agent ApplicationInfo{5c7cde0 com.your.app.package}
12-05 18:59:12.117  1910  2251 W BackupManagerService:
    Can't find backup agent for com.your.app.package

您的应用程序需要超过10秒才能启动备份。 请注意日志输出中的时间戳差异。 当您的应用程序使用没有ProGuard的多区域配置时,通常会发生此错误,可能是由Android Studio中的即时运行引起的。 要解决该错误,请使用ProGuard并且不要使用即时运行。

4、未初始化的备份帐户

如果您在logcat中看到以下消息:

01-31 14:32:45.698 17280 17292 I Backup: [GmsBackupTransport] Try to backup for an uninitialized backup account.
01-31 14:32:45.699  1043 18255 W PFTBT: Transport failed; aborting backup: -1001
01-31 14:32:45.699  1043 18255 I PFTBT: Full backup completed with status: -1000

备份已中止,因为备份数据集未初始化。 使用命令adb shell bmgr运行运行备份管理器,然后尝试再次执行备份。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值