Cómo probar copias de seguridad y restablecimientos

En esta página, se muestra cómo activar manualmente las operaciones de copia de seguridad y restablecimiento con copia de seguridad automática y copia de seguridad de clave-valor para garantizar que tu app guarde y restablezca los datos de manera correcta.

Cómo funciona la copia de seguridad

En esta sección, se describen varias piezas del framework de copia de seguridad de Android y cómo interactúan con las apps que admiten la copia de seguridad automática y la copia de seguridad de clave-valor. Durante la fase de desarrollo de apps, la mayor parte del trabajo interno del marco de trabajo se abstraía, por lo que no era necesario que conocieras esta información. Sin embargo, durante la fase de prueba, es importante comprender estos conceptos.

En el siguiente diagrama, se ilustra cómo fluyen los datos durante la copia de seguridad y el restablecimiento: backup-framework

El servicio del administrador de copias de seguridad es un sistema de servicios de Android que organiza y también inicia las operaciones de copia de seguridad y restablecimiento. Se puede acceder a este servicio a través de la API BackupManager. Durante una operación de copia de seguridad, el servicio busca datos de copia de seguridad en tu app y, luego, se los pasa al transporte alternativo, que activa los datos. Durante una operación de restablecimiento, el servicio del administrador de copias de seguridad recupera los datos de copia de seguridad del transporte alternativo y restablece los datos del dispositivo.

Los transportes alternativos son componentes de Android responsables de almacenar y recuperar las copias de seguridad. Un dispositivo Android puede tener cero o más transportes alternativos, pero solo uno de esos transportes se puede marcar como activo. Los transportes alternativos disponibles pueden diferir de un dispositivo a otro (debido a las personalizaciones de los fabricantes de dispositivos y proveedores de servicios), pero la mayoría de los dispositivos habilitados para Google Play se envían con los siguientes transportes:

  • Transporte de Google(predeterminado): el transporte alternativo activo en la mayoría de los dispositivos y parte de Servicios de Google para dispositivos móviles. En esta documentación, se asume que los usuarios usan el transporte de Google. Este transporte almacena los datos de copia de seguridad automática en una carpeta privada en la cuenta de Google Drive del usuario. Los datos de copia de seguridad de clave-valor se almacenan en Android Backup Service.
  • Transporte local: almacena datos de copia de seguridad a nivel local en el dispositivo. Por lo general, este transporte se usa con fines de desarrollo/depuración y no es útil en el mundo real.

Si un dispositivo no tiene transportes de copia de seguridad, no se podrá crear una copia de datos de este tipo. Tu app no se ve afectada de forma negativa.

Precaución: debido a que el transporte de copia de seguridad puede variar de un dispositivo a otro, Android no puede garantizar la seguridad de tus datos mientras lo usas. Ten precaución cuando uses la copia de seguridad para almacenar datos sensibles, como nombres de usuario y contraseñas.

Requisitos previos

Para probar tus operaciones de copia de seguridad y restablecimiento, necesitas algo de información sobre las siguientes herramientas.

  • adb: se usa para ejecutar comandos en el dispositivo o emulador.
  • bmgr: se usa para realizar distintas operaciones de copia de seguridad y restablecimiento.
  • logcat: se usa para ver el resultado de las operaciones de copia de seguridad y restablecimiento.

Cómo preparar tu dispositivo o emulador

Prepara tu dispositivo o emulador para las pruebas de copia de seguridad mediante la siguiente lista de tareas:

  • Para la copia de seguridad automática, comprueba que estés usando un dispositivo o emulador con Android 6.0 (nivel de API 23) o versiones posteriores.
  • Para la copia de seguridad de clave-valor, comprueba que estés usando un dispositivo o emulador con Android 2.2 (nivel de API 8) o versiones posteriores.
  • Comprueba que la copia de seguridad y el restablecimiento estén habilitados en el dispositivo o emulador y que se haya agregado una Cuenta de Google. Hay dos formas de comprobarlo:
    • Según la versión del dispositivo, puedes ir a Configuración > Copia de seguridad y restablecimiento, o bien solo buscar Copia de seguridad en la barra de búsqueda en la parte superior de la pantalla.
    • Desde el shell de adb, ejecuta bmgr enabled.

    En dispositivos físicos, por lo general, el servicio de copia de seguridad y restablecimiento se habilita durante el asistente de configuración inicial. Los emuladores no ejecutan el asistente de configuración, por lo tanto, no olvides habilitar la copia de seguridad y especificar una cuenta para ella en la configuración del dispositivo.

  • Para asegurarte de que el Transporte alternativo de Google esté disponible y activo, ejecuta el comando:
    adb shell bmgr list transports
    

    Luego, verifica si en la consola aparece el siguiente resultado:

    android/com.android.internal.backup.LocalTransport
    * com.google.android.gms/.backup.BackupTransportService
    

Es posible que los dispositivos físicos sin Google Play y los emuladores sin las API de Google no incluyan el Transporte alternativo de Google. En este artículo, se asume que utilizas el Transporte alternativo de Google. Puedes probar el servicio de copia de seguridad y restablecimiento con otros transportes alternativos, pero el procedimiento y el resultado pueden ser diferentes.

Cómo probar la copia de seguridad

Para iniciar una copia de seguridad de tu app, ejecuta el siguiente comando:

adb shell bmgr backupnow <PACKAGE>

El comando backupnow está disponible en dispositivos y emuladores con Android 7.0 o versiones posteriores. Ejecuta una copia de seguridad de clave-valor o una copia de seguridad automática según las declaraciones del manifiesto del paquete. Comprueba el logcat para ver el resultado del procedimiento de copia de seguridad. Por ejemplo:

D/BackupManagerService: fullTransportBackup()
I/GmsBackupTransport: Attempt to do full backup on <PACKAGE>

---- or ----

V/BackupManagerService: Scheduling immediate backup pass
D/PerformBackupTask: starting key/value Backup of BackupRequest{pkg=<PACKAGE>}

Si el comando backupnow no está disponible en tu dispositivo, completa los siguientes pasos, ya sea para copias de seguridad automáticas o de clave-valor.

Para copias de seguridad automáticas, completa los siguientes pasos:

  1. Ejecuta el siguiente comando:
    adb shell bmgr backup @pm@ && adb shell bmgr run
    
  2. Espera hasta que finalice el comando del paso anterior supervisando adb logcat para obtener el siguiente resultado:
    I/BackupManagerService: K/V backup pass finished.
    
  3. Ejecuta el siguiente comando para realizar una copia de seguridad completa:
    adb shell bmgr fullbackup <PACKAGE>
    

Nota: El comando fullbackup fuerza a tu app a realizar una copia de seguridad completa, incluso si esta implementa una copia de seguridad de clave-valor. El sistema ignora la configuración de copia de seguridad de tu app y actúa como si el atributo android:fullBackupOnly estuviera configurado como verdadero.

Sigue estos pasos para programar y ejecutar las copias de seguridad de clave-valor:

  1. Si tu app no llamó a BackupManager.dataChanged() desde la última copia de seguridad, puedes incluirla en la operación de copia de seguridad con fines de prueba ejecutando el siguiente comando:
    adb shell bmgr backup <PACKAGE>
    
  2. Luego, puedes ejecutar el siguiente comando para activar una copia de seguridad:
    adb shell bmgr run
    

bmgr backup agrega tu app a la cola del administrador de copias de seguridad. bmgr run inicia la operación de copia de seguridad, que fuerza al administrador a ejecutar todas las solicitudes de este tipo que están en cola.

Cuando pruebes las copias de seguridad de clave-valor, debes verificar que el cambio de preferencia programe una copia de seguridad. Puedes verificar la programación de una copia de seguridad con uno de los siguientes métodos:

  • Ejecuta adb shell dumpsys backup y verifica que tu app aparezca en el resultado del comando en Pending key/value backup.
  • Registra un mensaje cuando programes una copia de seguridad. Luego, puedes ejecutar adb logcat y comprobar el resultado del comando para verificar que se haya programado una copia de seguridad.

Cómo probar el restablecimiento

Para iniciar manualmente un restablecimiento, ejecuta el siguiente comando con un token de copia de seguridad (mira cómo obtener uno a continuación):

adb shell bmgr restore <TOKEN> <PACKAGE>

Para buscar tokens de copia de seguridad, ejecuta adb shell dumpsys backup. El token es la string hexadecimal que sigue a las etiquetas Ancestral: y Current:. El token ancestral se refiere al conjunto de datos de copia de seguridad que se usó para restablecer el dispositivo cuando se configuró inicialmente (con su asistente de configuración). El token actual se refiere al conjunto de datos de copia de seguridad actual del dispositivo (el conjunto de datos al que el dispositivo le envía actualmente sus datos de copia de seguridad).

Luego, comprueba el logcat para ver el resultado del procedimiento de restablecimiento. Por ejemplo:

V/BackupManagerService: beginRestoreSession: pkg=<PACKAGE> transport=null
V/RestoreSession: restorePackage pkg=<PACKAGE> token=368abb4465c5c683
...
I/BackupManagerService: Restore complete.

Puedes probar el restablecimiento automático de tu app desinstalándola y reinstalándola con adb o mediante la app Google Play Store.

Solución de problemas

En esta sección, encontrarás ayuda para solucionar algunos problemas frecuentes.

Se excedió la cuota de transporte

Si ves los siguientes mensajes en logcat:

I/PFTBT: Transport rejected backup of <PACKAGE>, skipping

--- or ---

I/PFTBT: Transport quota exceeded for package: <PACKAGE>

Tu app excedió la cuota. Reduce la cantidad de datos de copia de seguridad y vuelve a intentarlo. Por ejemplo, verifica que estés almacenando datos solo en el directorio de caché de tu app. El directorio de caché no está incluido en las copias de seguridad.

No es posible crear una copia de seguridad completa

Si ves el siguiente mensaje en logcat:

I/BackupManagerService: Full backup not currently possible -- key/value backup not yet run?

Se produjo un error en la operación de copia de seguridad completa porque aún no se ha realizado ninguna operación de clave-valor de este tipo en el dispositivo. Activa una copia de seguridad de clave-valor con el comando bmgr run y vuelve a intentarlo.

Se agotó el tiempo de espera del agente

Si ves el siguiente mensaje en logcat:

12-05 18:59:02.033  1910  2251 D BackupManagerService:
    awaiting agent for ApplicationInfo{5c7cde0 com.your.app.package}
12-05 18:59:12.117  1910  2251 W BackupManagerService:
    Timeout waiting for agent ApplicationInfo{5c7cde0 com.your.app.package}
12-05 18:59:12.117  1910  2251 W BackupManagerService:
    Can't find backup agent for com.your.app.package

Tu app tarda más de 10 segundos para iniciar la copia de seguridad. Observa la diferencia de marca de tiempo en el resultado del registro. Por lo general, este error ocurre cuando tu app usa una configuración multidex sin ProGuard.

La cuenta de copia de seguridad no inicializa

Si ves los siguientes mensajes en logcat:

01-31 14:32:45.698 17280 17292 I Backup: [GmsBackupTransport] Try to backup for an uninitialized backup account.
01-31 14:32:45.699  1043 18255 W PFTBT: Transport failed; aborting backup: -1001
01-31 14:32:45.699  1043 18255 I PFTBT: Full backup completed with status: -1000

Se anuló la copia de seguridad porque no se inicializó su conjunto de datos. Ejecuta el administrador de copias de seguridad con el comando adb shell bmgr run y, luego, intenta realizar la copia de seguridad otra vez.

No se llama a los métodos de la app

Debido a que la copia de seguridad automática inicia tu app con una clase base de Application, es posible que no se llame a los métodos de configuración de tu app. La copia de seguridad automática tampoco inicia ninguna de las actividades de tu app, por lo que es posible que veas errores si tu app se configura para una actividad. Para obtener más información, consulta Implementa BackupAgent.

Por el contrario, la copia de seguridad de clave-valor inicia tu app con cualquier subclase Application que declares en el archivo de manifiesto de la app.