实现 Android M 的自动备份功能

Implementing Android M's AutoBackup Feature

我希望实现 Android M 中引入的新自动备份功能,详情请参阅此处的文档:http://developer.android.com/training/backup/autosyncapi.html#testing

我正在轻松恢复播放器数据库和安装之间的共享首选项,此功能旨在为 Android M 启用。我目前没有实施 android 备份服务。

文档声称它基本上是默认启用的,不需要编写备份管理 类 之类的,至少对于 Android M 设备 - 但是,我无法让它工作.

abd shell bmgr enabled returns Backup Manager currently enabled

adb shell bmgr run 什么也没说,但是当我 运行 adb shell bmgr restore com.xyz.abc 我被告知:

Unable to restore package com.xyz.abc done

文档说 adb shell setprop log.tag.BackupXmlParserLogging VERBOSE 将启用日志记录,但我在终端或 logcat 中几乎看不到任何效果,而且我想不出它会记录到的另一个地方!

根据文档,我的清单在应用程序标记中有 android:fullBackupContent="@xml/backupscheme",backupscheme.xml 包含

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <include domain="database" path="database.db"/>
    <include domain="sharedpref" path="com.xyz.abc_preferences.xml"/>
    <exclude domain="external"/>
</full-backup-content>

数据库和共享首选项路径来自检查反编译的应用程序,我已经尝试将此 xml 剥离回任何内容 - 没有任何变化。

据我从文档中得知,这应该足以让它工作,但是当我卸载并重新安装该应用程序时,我没有看到任何东西被保留。

我是不是忽略了什么?有没有我没有质疑过的假设?为什么它不起作用?!那里的信息太少了,我真的希望其他人正在实施这个并在这里提供一些指导!

Am I overlooking something?

a manual backup for testing的配方是:

adb shell setprop log.tag.BackupXmlParserLogging VERBOSE
adb shell bmgr run
adb shell bmgr fullbackup ...

其中 ... 是要备份的应用程序的应用程序 ID。我没看到你在哪里 运行 adb shell bmgr fullbackup.

请注意,设备必须在“设置”中启用备份。

您的 LogCat 应包含如下行:

14936-14936/? D/AndroidRuntime: Calling main entry com.android.commands.bmgr.Bmgr
800-2345/? D/BackupManagerService: fullTransportBackup()
800-14960/? I/PFTBT: Initiating full-data transport backup of ...
800-14961/? D/BackupManagerService: Binding to full backup agent : ...
800-14961/? D/BackupManagerService: awaiting agent for ApplicationInfo{...}
800-810/? D/BackupManagerService: agentConnected pkg=com.commonsware...
800-14961/? I/BackupManagerService: got agent android.app.IBackupAgent$Stub$Proxy@e17804c
800-14961/? I/BackupRestoreController: Getting widget state for user: 0
800-14962/? I/file_backup_helper:    Name: apps/com.commonsware.android...
800-14962/? D/BackupManagerService: Calling doFullBackup() on com.commonsware...
9380-9391/com.commonsware.android.backup I/file_backup_helper:    Name: ...
800-14960/? I/PFTBT: Transport suggested backoff=0
800-14960/? I/PFTBT: Full backup completed.
9380-9380/? I/Process: Sending signal. PID: 9380 SIG: 9
800-2345/? D/BackupManagerService: Done with full transport backup.

(抱歉,这些行被截断以确保它们适合 my book 中的页面)。

首先,我忽略了 logcat 个过滤器!简单地禁用过滤器允许我看到错误消息。

第一个问题是 Rejecting full data backup. user has not seen up to date legal text - 这显然是因为旧的现有 google 帐户未选择加入备份服务。这有点可怕,因为没有简单的选择方式;我不知道用户到底要如何访问它。

要解决此问题,请从设备中删除所有 Google 个帐户,然后将其关闭并重新打开(如果您不重新启动,它将不允许任何添加的帐户充当备份帐户! ).

重新启动后,它应该会弹出一条通知,抱怨没有为备份设置帐户:只需重新添加您的 google 帐户,启用备份,希望您最终可以使用它。

这并没有解决我的所有问题 - 我仍然无法识别 gms 传输 - 但最初的问题已经解决。