3

背景

谷歌在 Android M 上引入了一项不错的新功能,允许您备份和恢复应用程序,甚至使用 ADB,如本视频所示。

看来您所要做的就是使用adb shell bmgr命令来备份和恢复应用程序,如下所示:

备份:

adb shell bmgr fullbackup PACKAGE_NAME

恢复应用程序:

adb shell bmgr restore PACKAGE_NAME

而且效果很好。

问题

这些文档处于新阶段,因此我无法找到有关此新工具的某些问题的答案。

我试过的

输入 时adb shell bmgr,我得到了一些关于如何使用它的线索,但我找不到问题的答案。没有带有 Android M 的设备,而是一个模拟器,我想它的工作方式会有所不同。

这是键入此命令时所写的内容:

用法: bmgr [backup|restore|list|transport|run] bmgr backup PACKAGE bmgr enable BOOL bmgr enabled bmgr list transports bmgr list sets bmgr transport WHICH bmgr restore TOKEN bmgr restore TOKEN PACKAGE... bmgr restore PACKAGE bmgr run bmgr Wipe TRANSPORT PACKAGE bmgr 完整备份包...

'backup' 命令为指定的包安排备份通道。请注意,如果包实际上没有更改要存储的数据,则备份通道实际上是无操作的。

“启用”命令启用或禁用整个备份机制。如果参数为“真”,它将被启用,否则它将被禁用。禁用后,将不会执行备份或还原操作。

“启用”命令报告备份机制的当前启用/禁用状态。

“list transports”命令报告设备上当前可用的备份传输的名称。这些名称可以作为参数传递给“传输”和“擦除”命令。当前活动的传输用“*”字符表示。

“list sets”命令通过当前活动的传输报告设备可用的每个恢复集的令牌和名称。

“transport”命令将指定的传输指定为当前活动的传输。此设置在重新启动后保持不变。

'restore' 命令在仅给出恢复令牌时从当前活动的传输启动全系统恢复操作。它将由 TOKEN 参数指定的还原集交付给每个向该还原集贡献数据的应用程序。

当给定一个令牌和一个或多个包名称时,'restore' 命令会启动仅从 TOKEN 参数指定的恢复集中那些给定包的恢复操作。它实际上与仅提供令牌的“恢复”操作相同,但将过滤器应用于要恢复的应用程序集。

'restore' 命令在只给出一个包名称时根据 RestoreSession.restorePackage() 方法使用的恢复集选择算法启动一个包的恢复。

“运行”命令会立即启动任何计划的备份操作,而无需等待通常的等待时间来批量处理数据更改。

'wipe' 命令导致给定包的所有备份数据从给定传输的存储中删除。给定应用程序执行的下一个备份操作将重写其整个数据集。此处使用的传输名称是由“列表传输”报告的名称。

“fullbackup”命令为一个或多个包引入完整数据流备份。数据通过当前活动的传输方式发送。

问题

我有几个问题:

  1. 假设我通过设备本身调用这些命令,它们会起作用吗?如果没有,它们会在有根设备上工作吗?或者至少备份和恢复当前应用程序(应用程序 X 备份和恢复自身)?

  2. 备份存储在哪里?是否可以将它们存储到自定义路径中?甚至可能是 PC 之一?

  3. 是否可以将同一个应用程序备份到多个状态?例如,应用程序可以在登录时进行备份,并在配置某些设置时进行备份。这样,您可以还原到每个备份。

  4. 他们在上面的描述中写到“当前活跃的运输”。究竟是什么 ?可以定制吗?

  5. 是否可以在所有应用程序上运行备份/恢复?或者我应该把所有应用程序的包?

  6. 似乎“fullbackup”会立即进行备份。“运行”属性是做什么用的?或者也许这都是因为我使用了模拟器?

4

2 回答 2

4

如果您还没有看过它们,这里是与自动备份相关的新功能的参考文档。备份功能存在于以前的版本中,并在本指南中进行了描述。我和他们一起在 KitKat 上工作过。快速浏览后,M Preview 中的新功能似乎是:

  1. 每日自动备份
  2. 用于配置和控制备份中包含的内容的更多选项。

您的大部分问题都集中在该adb shell bmgr工具上。它用于开发人员测试。在正常设备使用中,每 24 小时自动完成一次备份,此时设备处于空闲状态、正在充电并连接到 Wi-Fi 网络。

假设我通过设备本身调用这些命令,它们会起作用吗?

随着自动完成备份,真的需要这样做吗?

备份存储在哪里?是否可以将它们存储到自定义路径中?甚至可能是 PC 之一?

存储到用户的 Google Drive 帐户。不,不。

他们在上面的描述中写到“当前活跃的运输”。究竟是什么 ?可以定制吗?

由谷歌提供。不要这么想。

是否可以在所有应用程序上运行备份/恢复?或者我应该把所有应用程序的包?

默认情况下,所有应用程序都已备份。参考文档描述了如何限制包含的内容。

似乎“fullbackup”会立即进行备份。“运行”属性是做什么用的?或者也许这都是因为我使用了模拟器?

除了新的自动备份功能外,应用程序还可以执行增量备份,如上述指南中所述。该run命令用于测试,以允许开发人员强制立即激活增量备份处理。

于 2015-06-26T15:13:06.703 回答
3

你好,安卓开发者。看起来我们有很多共同的兴趣(我在 GcmNetworkManager 上回答了你的问题)。

  1. 假设我通过设备本身调用这些命令,它们会起作用吗?如果没有,它们会在有根设备上工作吗?或者至少备份和恢复当前应用程序(应用程序 X 备份和恢复自身)?*

    不幸的是,我不确定你的意思。我想你是在问他们是否会在真实设备上工作而不是模拟器,答案是肯定的。在模拟器上运行但在真实设备上运行的可能性很小 - 通常情况正好相反。

  2. 备份存储在哪里?是否可以将它们存储到自定义路径中?甚至可能是 PC 之一?*

    有 2 种类型的备份 - 较旧的键/值备份由应用程序本身通过实现BackupAgent 驱动,而从 Android M 开始,有“完整的应用程序数据备份”,这是框架为您提供 BackupAgent 实现的地方。

    在这两种情况下,备份数据都存储在 Google 的服务器上。没有办法将它们存储在自定义路径中,除非编写自己的备份传输(这是只有 OEM 或构建自己的自定义 ROMS 的人才能做到的事情)。

  3. 是否可以将同一个应用程序备份到多个状态?例如,应用程序可以在登录时进行备份,并在配置某些设置时进行备份。这样,您可以恢复到每个备份。*

    没有。每台设备的每个应用程序都有一个“备份集”。如果您进行出厂重置,则它被视为新设备,并且将具有不同的备份集。

  4. 他们在上面的描述中写到“当前活跃的运输”。究竟是什么 ?可以定制吗?*

    BackupTransport 是特权(即/system)应用程序,负责确定备份数据的存储位置。BackupManager是操作系统的一部分,它管理备份何时运行,从应用程序获取数据并将其传递给 Transport,然后由 Transport 决定如何处理它。操作系统不能对此负责,因为它不知道数据应该去哪里,所以它委托给供应商提供的传输。Transport 是一个非常有特权的应用程序,必须随系统映像一起提供。目前只有 2 种传输方式 - 本地“调试”传输方式和 Google 提供的传输方式。

  5. 是否可以在所有应用程序上运行备份/恢复?或者我应该把所有应用程序的包放在哪里?*

    我假设你的意思是做 adb shell bmgr。不,没有办法做到这一点。但是,您可以调用 BackupManager 中的隐藏 API 来启动完全恢复(例如,设置向导会执行此操作)。由于 API 是隐藏的,因此您必须下载源代码并针对它进行编译(或使用反射)。您还需要注释为@SystemApi的权限android.permission.BACKUP 。我自己从来没有这样做过,所以我知道这在理论上是可行的,但由于它完全没有文档记录(它适用于 OEM 和其他销售自己的设备的供应商),因此可能会令人头疼。

  6. 似乎“fullbackup”会立即进行备份。“运行”属性是做什么用的?或者这可能是因为我使用了模拟器?*

    在 android-M 之前,只有键/值备份。

    adb shell bmgr backup <PACKAGE..>
    adb shell bmgr run
    

    两者都用于键/值备份流。一个应用程序只能使用键/值备份,如果他们去实现自己的 BackupAgent (上面链接)的麻烦。例如,许多系统组件都这样做(例如,这就是您的 WiFi AP 跨设备恢复的方式)。事实上,如果您运行某些系统应用程序(Gmail、Google 启动器等),也会执行此操作

    adb shell dumpsys backup
    

    您将看到使用键/值备份的所有包的列表。您必须调用“bmgr backup p1 p2 etc”然后调用“bmgr run”的原因是 b/c“bmgr backup”命令将暂存备份的包“在未来”。当您调用“bmgr run”时,这会手动启动备份通道。正如上面的帖子所说,它用于调试。

    如果你跑

    adb shell dumpsys backup
    

    在 M 设备上,您还应该看到已使用完整应用程序数据备份流程备份的应用程序列表,以及使用 k/v 备份的应用程序列表,这些应用程序将在未来“分阶段”进行备份(此可能是空的,具体取决于您运行它的时间)。

    现在,

    adb shell bmgr fullbackup <PACKAGE..>
    

    用于完整备份流。但是,有一个问题。两者(键/值备份和完整备份)是完全独立的,除了BackupManager 使用键/值机制跟踪完整备份包的元数据(此元数据包括应用程序版本、签名、时间戳等内容)。这就是为什么你需要运行

    adb shell bmgr run
    

    确保正确备份完整的应用程序数据元数据,然后才能成功使用完整备份流程。

    不要认为模拟器与实际设备有任何不同。从理论上讲,它应该完全“模拟”真实设备。模拟器和物理设备之间应该没有区别,因此(AFAIK)没有“特殊”命令可以在无法在真实设备上运行的模拟器上运行。

于 2015-07-18T22:13:27.760 回答