Google在Android M上推出了一项不错的新功能,允许您备份和恢复应用,甚至使用ADB,如this video所示。
您似乎所要做的就是使用adb shell bmgr
命令来备份和恢复应用程序,如下所示:
备份:
adb shell bmgr fullbackup PACKAGE_NAME
恢复应用:
adb shell bmgr restore PACKAGE_NAME
效果很好。
文档已处于新阶段,因此无法找到有关此新工具的一些问题的答案。
在输入adb shell bmgr
时,我会得到一些关于如何使用它的线索,但我无法找到问题的答案。没有Android M的设备,而是一个模拟器,我猜它会有不同的工作方式。
这是输入此命令时所写的内容:
用法:bmgr [备份|恢复|列表|传输|运行] bmgr备份包 bmgr启用BOOL bmgr已启用 bmgr列表传输 bmgr列表集 bmgr运输 bmgr恢复TOKEN bmgr恢复TOKEN PACKAGE ... bmgr恢复PACKAGE bmgr跑 bmgr擦拭运输包装 bmgr fullbackup PACKAGE ...
'备份'命令为命名包安排备份传递。 请注意,如果包,备份传递实际上将是无操作 实际上并没有更改要存储的数据。
'启用' command启用或禁用整个备份机制。 如果论证是真的'它将被启用,否则它将被启用 禁用。禁用时,备份或还原操作都不会 进行。
启用'命令报告当前的启用/禁用状态 备份机制。
'列表传输'命令报告备份的名称 设备上当前可用的传输。这些名字可以 作为参数传递给'运输'并且'擦拭'命令。该 目前有效的运输用' *'表示。字符。
'列表设置'命令报告每个还原集的标记和名称 通过当前活动的传输可用于设备。
'运输'命令将指定的传输指定为 目前活跃的一个。此设置在重新启动后保持不变。
'恢复'命令只给出一个恢复令牌启动一个 来自当前活动传输的完整系统还原操作。它 将TOKEN参数指定的恢复集传递给每个 已为该恢复集提供数据的应用程序。
'恢复'给定令牌和一个或多个包名称时的命令 从那里启动那些给定包的恢复操作 由TOKEN参数指定的恢复集。它实际上是 与“恢复”相同仅提供令牌的操作,但应用了 过滤到要恢复的应用程序集。
'恢复'只给出一个包名称的命令启动a 根据还原集还原该一个包 RestoreSession.restorePackage()使用的选择算法 方法
'''命令导致任何计划的备份操作 立即启动,没有通常的等待批准期 一起数据变化。
'擦拭'命令导致给定包的所有备份数据 从给定的传输存储中删除。下一次备份 给定应用程序执行的操作将重写其整个操作 数据集。此处使用的传输名称是由' list报告的名称 输送'
' fullbackup'命令为一个或多个引发完整数据流备份 更多套餐。数据通过当前活动的传输发送。
我有几个问题:
假设我通过设备本身调用这些命令,它们会起作用吗?如果没有,他们会在root设备上工作吗?或者至少备份和恢复当前的应用程序(应用程序X备份和恢复自身)?
备份存储在哪里?是否可以将它们存储到自定义路径中?也许甚至是PC之一?
是否可以将同一个应用备份到多个状态?例如,应用程序可以在其登录时具有备份,并在其配置了某些设置时进行备份。这样,您就可以恢复到每个备份。
他们在上面的描述中写了关于"目前活跃的运输" 。究竟是什么 ?可以自定义吗?
是否可以在所有应用上运行备份/恢复?或者我应该把所有应用程序的包裹?
似乎" fullbackup"立即备份。什么"运行"属性用于?或者可能是因为我使用了模拟器?
答案 0 :(得分:2)
如果您还没有看到它们,则以下是与自动备份相关的新功能的reference documents。备份功能存在于先前版本中,并在此guide中进行了描述。我和他们一起在KitKat上工作过。快速扫描后,M预览中的新功能似乎是:
您的大部分问题都集中在adb shell bmgr
工具上。它用于开发人员测试。在正常的设备使用中,当设备空闲,充电并连接到Wi-Fi网络时,备份每24小时自动完成。
假设我通过设备本身调用这些命令,它们会起作用吗?
备份是自动完成的,是否真的有需要?
备份存储在哪里?是否可以存储它们 一个定制的路径?甚至可能是PC之一?
存储在用户的Google云端硬盘帐户中。没有。
他们在上面的描述中写了关于"当前活跃的运输" 。究竟是什么 ?它可以定制吗?
由Google提供。不要这么认为。
是否可以在所有应用上运行备份/恢复?或者我应该放 所有应用程序的包裹?
默认情况下,所有应用都会备份。参考文档描述了如何限制所包含的内容。
似乎" fullbackup"立即备份。什么是 "运行"属性用于?或许那都是因为我使用了 模拟器?
除了新的自动备份功能外,应用程序还可以执行增量备份,如上面提到的指南中所述。 run
命令用于测试,允许开发人员强制立即激活增量备份处理。
答案 1 :(得分:1)
你好Android开发者。看起来我们有很多共同的兴趣(我在GcmNetworkManager上回答了你的问题)。
假设我通过设备本身调用这些命令,它们会起作用吗?如果没有,他们会在root设备上工作吗?或者至少备份和恢复当前的应用程序(应用程序X备份和恢复自身)?*
不幸的是,我不确定你的意思。我想你问的是,与模拟器相比,它们是否可以在真实设备上工作,答案是肯定的。某些东西在仿真器上运行的可能性很小,但在真实设备上却无法正常工作 - 通常是相反的。
备份存储在哪里?是否可以将它们存储到自定义路径中?甚至可能是PC之一?*
有两种类型的备份 - 较旧的密钥/值备份,由应用程序本身通过实施BackupAgent来驱动,而从Android M开始,有完整的应用程序数据备份"这是框架为您提供BackupAgent实现的地方。
在这两种情况下,备份数据都存储在Google的服务器上。没有办法将它们存储在自定义路径中,除了编写自己的备份传输(这是OEM只能做的事情,或者是构建自己的自定义ROMS的人)。
是否可以将同一个应用备份到多个状态?例如,应用程序可以在其登录时具有备份,并在其配置了某些设置时进行备份。这样,您可以还原到每个备份。*
没有。有一个备份集'每个设备的每个应用。如果您进行了恢复出厂设置,那么它将被视为新设备并具有不同的备份集。
他们在上面的描述中写了关于"目前活跃的运输" 。究竟是什么 ?可以定制吗?*
BackupTransport是特权(即/系统)应用程序,负责确定备份数据的存储位置。 BackupManager是操作系统的一部分,可以在运行备份时进行管理,并从应用程序获取数据并将其传递给传输,然后传输将确定如何处理。操作系统无法对此b / c负责,因为它不知道数据应该去哪里,因此它会委托供应商提供的传输。 Transport是一个非常特权的应用程序,必须随系统映像一起提供。目前只有2种传输方式 - 本地'调试'运输和谷歌提供的运输。
是否可以在所有应用上运行备份/恢复?或者我应该把所有应用程序的包裹?*
我认为你的意思是做adb shell bmgr。不,没有办法做到这一点。但是,BackupManager中有隐藏的API,您可以调用它们以启动完全还原(例如,安装向导会执行此操作)。由于API是隐藏的,因此您必须下载源代码并对其进行编译(或使用反射)。您还需要注释@SystemApi的权限android.permission.BACKUP。我自己从未这样做过,所以我知道这在理论上是可行的,但可能是一个非常令人头疼的问题,因为它完全没有记录(它适用于OEM和其他供应自己设备的供应商)。
似乎" fullbackup"立即备份。什么"运行"属性用于?或者可能是因为我使用了模拟器?*
在android-M之前,只有键/值备份。
adb shell bmgr backup <PACKAGE..>
adb shell bmgr run
两者都用于键/值备份流程。如果应用程序遇到了实现自己的BackupAgent(上面链接)的麻烦,它只能使用键/值备份。例如,许多系统组件执行此操作(例如,这是您的WiFi AP在设备之间恢复的方式)。一些系统应用也会这样做(Gmail,谷歌启动器......),实际上如果你运行
adb shell dumpsys backup
您将看到使用键/值备份的所有包的列表。你必须打电话给&#39; bmgr备份p1 p2等&#39;然后&#39; bmgr run&#39;是b / c&#39; bmgr备份&#39;命令将暂存将来要备份的软件包。&#39;当你打电话给&#39; bmgr run&#39;这会手动启动备用通行证。正如上面的帖子所说,它用于调试。
如果你跑
adb shell dumpsys backup
在M设备上,您还应该看到使用完整的应用数据备份流程备份的应用列表,以及使用k / v备份的应用列表&#39; staged&#39 ;将来备份(这可能是空的,具体取决于您何时运行它。)
现在,
adb shell bmgr fullbackup <PACKAGE..>
用于完整备份流程。然而,有一个问题。这两个(键/值备份和完全备份)完全独立,除之外,BackupManager使用键/值机制跟踪完整备份包的元数据(此元数据包括app版本等内容) ,签名,时间戳等)。这就是你需要运行
的原因adb shell bmgr run
确保在成功使用完整备份流之前正确备份完整的应用数据元数据。
不要将模拟器视为与实际设备有任何不同。理论上,它应该完全模仿&#39;真正的设备。模拟器和物理设备之间应该没有区别,因此(AFAIK)没有特殊的&#39;在无法在真实设备上工作的模拟器上运行的命令。