Подтвердить что ты не робот

OnRestore не вызывается для моего настраиваемого BackupAgent

В моем приложении для 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 enable true

  • Вызвать часть моего кода вызван метод dataChanged в классе BackupManager.

  • Инициировать операцию резервного копирования вручную

    adb shell bmgr run

  • Проверено в журнале, что был вызван метод onBackup моего пользовательского BackupAgent.

  • Удалите приложение
  • Переустановите приложение.
  • Проверьте журнал, если вызывается метод onRestore.

Дело в том, что метод onRestore, похоже, не называется, и я не знаю почему. После переустановки приложения или ручного запуска восстановления с помощью adb я вижу на консоли следующее.

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

а другой - в log

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 [email protected]
V/LocalTransport(   59): start restore 1
V/LocalTransport(   59):   nextRestorePackage() = @[email protected]
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):     ... [email protected]@ 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 был вызван?

4b9b3361

Ответ 1

По моему опыту, по какой-то нечетной причине (которую я еще не идентифицировал), записи журналов, сделанные в BackupAgents, не отображаются в журналах. Тем не менее, я смог подтвердить, что метод onRestore фактически запущен.

В вашем вопросе вы указываете, что метод onRestore ", кажется, не называется", потому что вы не можете видеть правильные журналы. Можете ли вы вместо этого подтвердить, что результат не работает (то есть, что данные, которые должны быть правильно восстановлены, не являются)?

Ответ 2

У меня была эта проблема, и основной причиной было то, что у меня была ошибка в моем onBackup, которая не позволяла ей завершить работу, поэтому onBackup был вызван, но onRestore не был. Исправление исключения в onBackup вызвано вызовом функции onRestore.

Также сообщения журнала в onBackup и onRestore отображаются в журналах. Если вы установите фильтр журнала в теге "backup" и используйте что-то с резервной копией в нем для вашего тега журнала. Вы увидите журнал из системы и вашего. Вот что я получаю

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 [email protected]8
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' [email protected]
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 [email protected]
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 [email protected]
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 [email protected]
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 никогда не вызывался, но системные сообщения, связанные с восстановлением, были.

Приложение не будет принудительно закрывать из-за исключения в резервной копии.