我一直想知道,如果将相同启用BackupManager
的应用程序安装到链接到同一Google帐户的多个设备(例如智能手机和平板电脑)上,那么Android's BackupManager
的行为会如何。 It seems that I am not the only one,,但是我找不到关于此的任何规范。
您对这种情况有什么经验?是否有任何官方资源描述这种情况?
最佳答案
该机制没有任何面向用户的文档,也没有面向应用程序开发人员的大量文档,因为它应该会自动执行正确的操作,而是the code is available。以下所有信息均来自检查源代码以及bmgr
工具的已记录选项。从answer I originally wrote上的用户友好的Android Stack Exchange,此答案适合于面向开发人员。
宝贝,让我们谈谈布景
Android的备份服务的概念称为集合:从一个传输中的一个设备备份的所有数据的集合。每个集合由唯一的字符串标识,例如设备上的IMEI。备份一个应用程序(或已安装的应用程序列表)时,其备份数据将进入与要备份的设备关联的数据集中。所有设置仍然特定于用户的Google帐户。如果您擦除设备并将其出售给他人,除非他可以登录您的Google帐户,否则他将无法访问该设备的设备。
默认行为
当安装了应用程序或设备恢复了其应用程序列表时,备份系统首先在该设备的设备集中查找该程序包的备份数据。如果找不到任何内容(要么是因为它是一个没有备份数据的全新设备,要么是因为该软件包从未安装在该设备上),它将搜索扩展到其他集合。 (如果可以选择的话,它将使用用于完整设备还原的最后一组。)
因此,当您设置新设备时,它将从旧设备的备份中还原应用程序列表,并从旧设备的备份中还原每个应用程序。如果您在一台设备上安装了某个应用程序,而又在另一台设备上安装了该应用程序,则该应用程序将与旧设备中的数据一起还原。无论哪种情况,现在都将数据备份到新的设备的集合中,这意味着从现在开始,这两个设备的备份数据是分开的。
出厂重置设备后,如果有一个设备,它将从该设备的上次备份还原;如果有一个设备,它将从其他设备的备份中恢复,但此后它将开始创建自己的备份集。bmgr
:基本用法bmgr
工具用于调试和测试,使您可以稍微控制备份/还原过程。您可以在adb shell
中使用此工具来触发所选软件包的备份和还原,擦除软件包的备份数据,甚至是整个设备的还原。
不要以root用户身份在设备 shell 程序中使用它:您需要系统级的android.permission.BACKUP
来对其进行任何有趣的操作。
为了进行测试,您可以使程序包立即更新其备份数据:
bmgr backup com.shadowburst.showr
bmgr run
(或任何包名称)。要从备份的数据还原一个程序包,默认情况下将选择该程序包:
bmgr restore com.shadowburst.showr
这仅适用于已安装的软件包:不会安装软件包以恢复数据。这两个命令仅用于测试,因为通常设备会在需要时备份并还原数据。
更多控制
现在,备份系统将无法执行的工作。要查看可用的备份数据集,请执行以下操作:
bmgr list sets
然后您将获得如下输出:
3ff7800e963f25c5 : manta
3f0e5c90a412cca7 : manta
3dd65924a70e14c8 : TF101
3baa67e9ce029355 : m0
左侧的64位十六进制数字称为 token ,并唯一标识该集合。右边的东西是拥有该设备的设备的(相对)友好名称。例如, manta 是Nexus 10的代号; TF101 是指原始的Asus Transformer。您可以通过指定其 token 从一组选择的数据包中还原其数据:
bmgr restore 3ff7800e963f25c5 com.shadowburst.showr
您可以在命令末尾添加更多软件包名称,以一次还原多个软件包,也可以不指定软件包名称(仅使用 token )来还原每个具有该集合中数据的软件包(即,它是一个完整的系统恢复)。
最后,您可以从当前集中擦除程序包的数据:
bmgr wipe com.shadowburst.showr
这将使它的下一个备份操作从头开始。这在调试备份代码时可能很有用。
您无法使设备开始写入另一套设备,也不能一次性擦除整个设备。