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" />

エミュレーター (Android 2.2) でテストしていますが、バックアップ サービス API キーを含めましたが、ローカル バックアップ トランスポートを使用するため必要ありません。

バックアップと復元のテストを行うために、次のことを行いました。

  • アプリケーションがインストールされた状態でエミュレーターを起動します。
  • バックアップを有効にする

    adb shell bmgr enable true

  • 私のコードの一部を呼び出して、BackupManager クラスの dataChanged メソッドが呼び出されました。

  • バックアップ操作を手動で開始する

    adb シェル 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

私の経験では、いくつかの奇妙な理由(まだ特定していません)のために、BackupAgentsで作成されたログステートメントがログに表示されません。それでも、onRestoreメソッド実際に正しく実行されていることを確認できました。

あなたの質問では、適切なログを見ることができないため、onRestoreメソッドが「呼び出されていないようです」と示しています。代わりに、結果が失敗していること(つまり、適切に復元する必要のあるデータが失敗していないこと)を確認できますか?

于 2012-10-07T06:20:55.867 に答える
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 に答える