onRestore не вызывается для моего пользовательского BackupAgent - PullRequest
21 голосов
/ 19 января 2012

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

и этот другой в журнале

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 вызывается?

Ответы [ 2 ]

1 голос
/ 08 сентября 2013

У меня была эта проблема, и основной причиной было то, что у меня была ошибка в моем 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 backup onBackup под названием , представляет собой сообщение журнала в моем коде. За восстановление я получаю

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

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

1 голос
/ 07 октября 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...