21

我的 Android 应用程序中有一些数据要备份和恢复。为此,我创建了一个自定义实现BackupAgent

在我的清单中包含了备份代理,如下所示

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="auto"
    package="com.myapp"
    android:versionCode="14"
    android:versionName="1.13" >

    <application
        android:backupAgent="com.myapp.MyBackupAgent">

        <meta-data
            android:name="com.google.android.backup.api_key"
            android:value="my key" />

我已经包含了备份服务 api 密钥,虽然我正在使用模拟器 (Android 2.2) 进行测试,但这不是必需的,因为它使用本地备份传输。

为了测试备份和恢复,我做了以下工作:

  • 在安装了我的应用程序的情况下启动模拟器。
  • 启用备份

    adb shell bmgr 启用 true

  • 调用我的部分代码是调用 BackupManager 类中的 dataChanged 方法。

  • 手动启动备份操作

    adb shell bmgr 运行

  • 在日志中检查了我的自定义 BackupAgent 的 onBackup 方法被调用。

  • 卸载应用程序
  • 重新安装应用程序
  • 如果调用了 onRestore 方法,请检查日志。

问题是似乎没有调用 onRestore 方法,我不知道为什么。重新安装应用程序或使用 adb 手动触发还原后,我在控制台中看到以下内容。

$adb shell bmgr restore com.myapp
restoreStarting: 2 packages
restoreFinished: 0
done

还有这个在日志中

D/AndroidRuntime( 8259):
D/AndroidRuntime( 8259): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
D/AndroidRuntime( 8259): CheckJNI is ON
D/AndroidRuntime( 8259): --- registering native functions ---
D/BackupManagerService(   59): MSG_RUN_RESTORE observer=android.app.backup.IRestoreObserver$Stub$Proxy@450e16a8
V/LocalTransport(   59): start restore 1
V/LocalTransport(   59):   nextRestorePackage() = @pm@
V/LocalTransport(   59):   getRestoreData() found 7 key files
V/LocalTransport(   59):     ... key=com.android.providers.settings size=1208
V/LocalTransport(   59):     ... key=com.myapp size=501
V/LocalTransport(   59):     ... key=android size=1208
V/LocalTransport(   59):     ... key=com.android.providers.userdictionary size=1208
V/LocalTransport(   59):     ... key=com.android.browser size=1208
V/LocalTransport(   59):     ... key=com.android.inputmethod.latin size=1208
V/LocalTransport(   59):     ... key=@meta@ size=11
V/LocalTransport(   59):   no more packages to restore
V/LocalTransport(   59): finishRestore()
V/LocalTransport(   59): finishRestore()
D/AndroidRuntime( 8259): Shutting down VM

但我没有看到实际上调用了 onRestore (我在它的开头有一些日志语句?

这曾经发生在你身上吗?是否有任何原因导致 onRestore 方法没有被调用,即使在onBackup被调用的情况下?

4

2 回答 2

1

我遇到了这个问题,根本原因是我的 onBackup 中有一个错误阻止它完成,所以调用了 onBackup 但没有调用 onRestore。修复 onBackup 中的异常导致 onRestore 被调用。

onBackup 和 onRestore 中的日志消息也会显示在日志中。如果您在标签“备份”上设置了一个日志过滤器,并在其中使用带有备份的东西作为您的日志标签。您将看到系统和您的日志记录。这是我得到的

09-08 17:06:56.581      294-352/system_process V/BackupServiceBinder﹕ doBackup() invoked
09-08 17:06:56.591      294-352/system_process D/PerformBackupTask﹕ starting agent for backup of BackupRequest{pkg=android}
09-08 17:06:56.591      294-352/system_process D/BackupManagerService﹕ awaiting agent for ApplicationInfo{40d5efc0 android}
09-08 17:06:56.591      294-308/system_process D/BackupManagerService﹕ agentConnected pkg=android agent=android.app.backup.BackupAgent$BackupServiceBinder@4112a228
09-08 17:06:56.601      294-352/system_process V/BackupServiceBinder﹕ doBackup() invoked
09-08 17:06:56.601      294-352/system_process D/BackupHelperDispatcher﹕ handling existing helper 'wallpaper' android.app.backup.WallpaperBackupHelper@41149150
09-08 17:06:56.621      294-352/system_process D/PerformBackupTask﹕ starting agent for backup of BackupRequest{pkg=com.catglo.sellpr}
09-08 17:06:56.661      294-352/system_process D/BackupManagerService﹕ awaiting agent for ApplicationInfo{41074748 com.catglo.sellpr}
09-08 17:06:56.781      294-514/system_process D/BackupManagerService﹕ agentConnected pkg=com.catglo.sellpr agent=android.os.BinderProxy@410768c8
09-08 17:06:56.791    2263-2274/com.catglo.sellpr V/BackupServiceBinder﹕ doBackup() invoked
09-08 17:06:56.791    2263-2274/com.catglo.sellpr I/backup﹕ onBackup called
09-08 17:06:57.251      294-352/system_process I/PerformBackupTask﹕ Backup pass finished.

在上面的日志中,com.catglo.sellpr 来自我的应用程序,读取com.catglo.sellpr I/backup:onBackup的行是我代码中的日志消息。对于我得到的 onRestore

09-08 17:13:34.431      294-352/system_process D/BackupManagerService﹕ MSG_RUN_RESTORE observer=android.app.backup.IRestoreObserver$Stub$Proxy@413132c0
09-08 17:13:34.511      294-352/system_process V/BackupServiceBinder﹕ doRestore() invoked
09-08 17:13:34.561      294-352/system_process D/BackupManagerService﹕ awaiting agent for ApplicationInfo{41074748 com.catglo.sellpr}
09-08 17:13:34.561      294-427/system_process D/BackupManagerService﹕ agentConnected pkg=com.catglo.sellpr agent=android.os.BinderProxy@41127ee0
09-08 17:13:34.571    2263-2276/com.catglo.sellpr V/BackupServiceBinder﹕ doRestore() invoked
09-08 17:13:34.571    2263-2276/com.catglo.sellpr I/backup﹕ onRestore called

早些时候,我在 onBackup 中遇到了一个异常,并且从未调用过来自 onRestore 的日志,但与还原相关的系统消息却被调用了。

由于备份中的异常,该应用程序不会强制关闭。

于 2013-09-08T16:34:18.020 回答
1

根据我的经验,出于某种奇怪的原因(我尚未确定),BackupAgents 中的日志记录语句不会显示在日志中。尽管如此,我已经能够确认 onRestore 方法实际上是正确运行的。

在您的问题中,您指出 onRestore 方法“似乎没有被调用”,因为您无法看到正确的日志。您能否确认结果失败(即应该正确恢复的数据没有)?

于 2012-10-07T06:20:55.867 回答