android - linea - onRestore no se invoca para mi Agente de copia de seguridad personalizado
shazam sign (2)
En mi experiencia, por alguna extraña razón (que aún no he identificado), las declaraciones de registro realizadas en los Agentes de copia de seguridad no aparecen en los registros. No obstante, he podido confirmar que el método onRestore se ejecuta correctamente.
En su pregunta, indica que el método onRestore "no parece ser llamado" porque no puede ver los registros adecuados. ¿Puede en cambio confirmar que el resultado está fallando (es decir, que los datos que deben restaurarse correctamente no lo están)?
Hay algunos datos en mi aplicación de Android que me gustaría respaldar y restaurar. Para ello he creado una implementación personalizada de BackupAgent
.
En mi manifiesto, he incluido el agente de copia de seguridad como se puede ver a continuación.
<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" />
He incluido la clave api del servicio de copia de seguridad, aunque estoy probando con el emulador (Android 2.2) y no debería ser necesario, ya que utiliza el transporte de copia de seguridad local.
Para hacer la prueba de la copia de seguridad y restauración he hecho lo siguiente:
- Iniciar el emulador con mi aplicación instalada.
Habilitar copia de seguridad
adb shell bmgr enable true
Llamar a la parte de mi código donde se llama al método dataChanged en la clase BackupManager.
Iniciar manualmente la operación de copia de seguridad.
adb shell bmgr ejecutar
Verifiqué en el registro que se llamó al método onBackup de mi BackupAgent personalizado.
- Desinstalar la aplicación
- Reinstalar la aplicación
- Verifique en el registro si se llama al método onRestore.
La cosa es que el método onRestore no parece ser llamado y no sé por qué. Después de reinstalar la aplicación o de activar manualmente la restauración con adb, veo lo siguiente en la consola.
$adb shell bmgr restore com.myapp
restoreStarting: 2 packages
restoreFinished: 0
done
Y este otro en el registro.
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
pero no veo que la llamada a onRestore se haga realmente (¿tengo algunas declaraciones de registro justo al principio?
¿Te ha pasado esto alguna vez? ¿Hay algún motivo por el que el método onRestore no se llame, incluso onBackup
se llamó a onBackup
?
Tenía este problema y la causa principal era que tenía un error en mi onBackup que impedía que se completara, por lo que se llamó a onBackup pero no a onRestore. Arreglar la excepción en onBackup hizo que se llamara onRestore.
También los mensajes de registro en onBackup y onRestore aparecen en los registros. Si configura un filtro de registro en la etiqueta "copia de seguridad" y utiliza algo con copia de seguridad para su etiqueta de registro. Verás el registro del sistema y el tuyo. Esto es lo que obtengo
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.
en el registro anterior com.catglo.sellpr es de mi aplicación y la línea que lee com.catglo.sellpr I / backup ﹕ onBackup llamado es el mensaje de registro en mi código. Para el onRestore consigo
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
Anteriormente tuve una excepción en onBackup y nunca se llamó a mi registro de onRestore, pero sí los mensajes del sistema relacionados con la restauración.
La aplicación no forzará el cierre debido a una excepción en la copia de seguridad.