全面复盘Android开发者容易忽视的Backup功能 _ 创作者训练营第二期

本文详细探讨了Android应用的Backup功能,包括adb命令和bmgr工具的使用,以及如何进行Backup/Restore的调试。重点介绍了Google发起的自动备份模式,以及如何在实战中选择合适的备份模式,例如自动备份和键值对备份。文章还讨论了Backup文件的解密过程,并提供了一个实战Demo,展示如何定制备份需求,包括备份和恢复流程的定制,以及BackupAgent和配置规则的混用。此外,文章还提及了键值对备份的局限性和简单实现。
摘要由CSDN通过智能技术生成
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来自于AncestralCurrent两个标签的组合,比如本次的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.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值