3.1.2 命令方式
ⅰ. adb命令
adb的backup和restore命令可以帮助我们手动发起较为简单的请求,但只支持自动备份模式。
- Backup
// 比如备份某个App的数据并以指定的名称保存备份文件
adb backup -f .ab -apk
接下来系统会提示我们输入备份密码。
输完密码之后点击开始备份,系统将弹出备份开始或结束的Toast。当然不输入密码直接备份也是可以的,但备份的数据容易被破解。
- Restore
// 发起恢复请求的命令很简单
adb restore .ab
接下来输入密码开始恢复,同样的会有Toast提示恢复的进度。
ⅱ.bmgr工具
adb backup命令提供的功能不够强大,官方推荐bmgr
工具。它将备份和恢复的步骤分得更细,便于我们理清各个环节,更好的协助我们测试备份和恢复的逻辑。
bmgr工具没有UI,完全通过命令在后台默默运行。
首先需要启用它。 注意:要确保设置里的Backup功能没有被关闭,Settings > Backup & Restore。
adb shell bmgr enabled
Backup Manager currently enabled
接着,查看ROM里支持的文件传输服务,*号表示当前选择的服务。
adb shell bmgr list transports
com.android.localtransport/.LocalTransport
com.google.android.gms/.backup.migrate.service.D2dTransport
- com.google.android.gms/.backup.BackupTransportService
GMS的传输服务要求设备联网和科学上网,为方面测试我们切换服务为本地传输。
adb shell bmgr transport com.android.localtransport/.LocalTransport
Selected transport com.android.localtransport/.LocalTransport (formerly com.google.android.gms/.backup.BackupTransportService)
查看传输服务的更改是否生效。
adb shell bmgr list transports
- com.android.localtransport/.LocalTransport
com.google.android.gms/.backup.migrate.service.D2dTransport
com.google.android.gms/.backup.BackupTransportService
针对某个App发起备份。
adb shell bmgr backupnow
在另一个终端捕捉备份的执行日志,有可能会提示没有设置锁屏密码。
Backup : [CryptoEnableCheck] Should not encrypt backups: device has no lock screen.
设置密码后再次发起备份,可以看到成功备份了。
adb shell bmgr backupnow
Package xxx with result: Success
Backup finished with result: Success
日志终端也显示回调了App指定的BackupAgent
。
AndroidRuntime: Calling main entry com.android.commands.bmgr.Bmgr
PFTBT : backupmanager pftbt token=4081832e
BackupManagerService: awaiting agent for ApplicationInfo{30f779b xxx}
BackupRestoreAgent: MyBackupAgent()
BackupRestoreAgent: onCreate()
BackupManagerService: agentConnected pkg=xxx agent=android.os.BinderProxy@5f88b66
BackupManagerService: got agent android.app.IBackupAgent S t u b Stub StubProxy@c309ea7
BackupRestoreAgent: onBackup()
BackupRestoreAgent: onDestroy()
bmgr工具在手动恢复的时候需要Token信息,通过dumpsys backup
获取对应的Token
。Token来自于Ancestral
和Current
两个标签的组合,比如本次的Token为01。
adb shell dumpsys backup
Backup Manager is enabled / setup complete / not pending init
Auto-restore is enabled
No backups running
Last backup pass started: 1619317275335 (now = 1619319671619)
next scheduled: 1619332172012
…
Ancestral: 0 ★
Current: 1 ★
…
清空App数据。
adb shell pm clear
手动恢复数据,从命令和日志两个终端都能看到数据被正确恢复了。
adb shell bmgr restore 01
Scheduling restore: Local disk image
restoreStarting: 1 packages
onUpdate: 0 = com.example.alldemo
restoreFinished: 0
done
BackupRestoreAgent: MyBackupAgent()
BackupRestoreAgent: onCreate()
BackupManagerService: agentConnected pkg=com.example.alldemo agent=android.os.BinderProxy@a480a0c
BackupManagerService: got agent android.app.IBackupAgent S t u b Stub StubProxy@5041f55
BackupManagerService: initiateOneRestore packageName=xxx
BackupRestoreAgent: onRestore()
BackupManagerService: restoreFinished packageName=xxx
BackupRestoreAgent: onRestoreFinished()
BackupManagerService: Restore complete, killing host process of xxx ★
BackupRestoreAgent: onDestroy()
BackupManagerService: No more packages; finishing restore
BackupManagerService: Restore complete.
当然将App卸载后通过市场或手动安装可以自动地恢复数据,这个动作由系统在Apk安装的时候自动完成。
Transport服务的选择要小心。如果选了GMS Transport的话,要注意GMS场景的网络问题,不然备份会失败。
更加详细的bmgr使用方法可参考如下文档。
developer.android.google.cn/studio/comm…
3.1.3 Google发起
Google将会按照每日一次的频次对支持自动备份模式的App发起备份操作。
恢复的话则是在设备第一次开机登录Google账号后。Google会将数据从服务器下载通过BackupManager
向各个备份过的App发起恢复操作。尚未安装的App则在后期Apk安装完成之后由Google自行发起恢复。
3.2 Backup/Restore的调试
logcat指定BackupManagerService
的Tag,可以监听到Backup和Restore的日志,辅助我们把握操作的进度和报错的原因。
adb logcat -s BackupManagerService
比如针对Google Photos App进行adb备份和恢复操作的时候,将会输出如下日志。
- Backup
adb logcat -s BackupManagerService
BackupManagerService: Requesting backup: apks=true obb=false shared=false all=false system=true includekeyvalue=false pkgs=[Ljava.lang.String;@190020e
BackupManagerService: Beginning adb backup…
BackupManagerService: Starting backup confirmation UI, token=1441721864
BackupManagerService: Waiting for backup completion…
BackupManagerService: acknowledgeAdbBackupOrRestore : token=1441721864 allow=true
BackupManagerService: — Performing adb backup —
BackupManagerService: Package com.google.android.apps.photos is key-value.
BackupManagerService: Adb backup processing complete.
BackupManagerService: Full backup pass complete.