Copia de seguridad de los datos del usuario con Auto Backup

Auto Backup for Apps hace una copia de seguridad automática de los datos de un usuario de las aplicaciones que se dirigen y se ejecutan en Android 6.0 (nivel de API 23) o posterior. Android conserva los datos de las aplicaciones subiéndolos a Google Drive del usuario, donde están protegidos por las credenciales de la cuenta de Google del usuario. La cantidad de datos está limitada a 25MB por usuario de tu app y no hay ningún cargo por almacenar los datos de la copia de seguridad. Tu aplicación puede personalizar el proceso de copia de seguridad u optar por desactivar las copias de seguridad.

Para obtener una visión general de las opciones de copia de seguridad de Android y una guía sobre qué datos debes respaldar y restaurar, consulta la vista general de la copia de seguridad de datos.

Archivos de los que se hace una copia de seguridad

Por defecto, la copia de seguridad automática incluye archivos en la mayoría de los directorios que el sistema asigna a tu aplicación:

  • Archivos de preferencias compartidas.
  • Archivos guardados en el almacenamiento interno de tu app, a los que se accede mediante getFilesDir() o getDir(String, int).
  • Archivos en el directorio devuelto por getDatabasePath(String), que también incluye archivos creados con la clase SQLiteOpenHelper.
  • Archivos en almacenamiento externo en el directorio devuelto por getExternalFilesDir(String).

La copia de seguridad automática excluye los archivos en los directorios devueltos por getCacheDir()getCodeCacheDir(), o getNoBackupFilesDir(). Los archivos guardados en estas ubicaciones sólo se necesitan temporalmente, o se excluyen intencionadamente de las operaciones de copia de seguridad.

Puedes configurar tu aplicación para incluir y excluir archivos concretos. Para obtener más información, consulte la sección Incluir y excluir archivos.

Nota: Android no trata la configuración de los componentes como datos del usuario. Si su aplicación activa o desactiva componentes específicos en su manifiesto mientras se está ejecutando, no espere que AutoBackup guarde y restaure la configuración. Para conservar el estado de la configuración, guárdela en Preferencias compartidas y recupere las Preferencias compartidas al restaurar. Si quieres que tu aplicación guarde su estado, guarda el estado en Preferencias compartidas y recupera Preferencias compartidas al restaurar.

Ubicación de la copia de seguridad

Los datos de la copia de seguridad se guardan en una carpeta privada de la cuenta de Google Drive del usuario, con un límite de 25 MB por aplicación. Los datos guardados no cuentan para la cuota personal del usuario en Google Drive. Sólo se almacena la copia de seguridad más reciente. Cuando se realiza una copia de seguridad, se elimina la anterior (si existe). Los datos de la copia de seguridad no pueden ser leídos por el usuario ni por otras aplicaciones del dispositivo.

Los usuarios pueden ver una lista de aplicaciones de las que se ha hecho una copia de seguridad en la aplicación Google DriveAndroid. En un dispositivo con Android, los usuarios pueden encontrar esta lista en el cajón de navegación de Driveapp en Ajustes > Copia de seguridad y restablecimiento > Datos de la app.

Las copias de seguridad de cada tiempo de vida del dispositivo se almacenan en conjuntos de datos separados, como se muestra en los siguientes ejemplos:

  • Si el usuario posee dos dispositivos, entonces existe un conjunto de datos de copia de seguridad para cada dispositivo.
  • Si el usuario restablece de fábrica un dispositivo y luego configura el dispositivo con la misma cuenta, la copia de seguridad se almacena en un nuevo conjunto de datos. Los conjuntos de datos obsoletos se eliminan automáticamente tras un periodo de inactividad.

Programación de copias de seguridad

Las copias de seguridad se producen automáticamente cuando se cumplen todas las condiciones siguientes:

  • El usuario ha habilitado la copia de seguridad en el dispositivo. En Android 9, este ajuste se encuentra enConfiguración > Sistema > Copia de seguridad.
  • Han pasado al menos 24 horas desde la última copia de seguridad.
  • El dispositivo está inactivo.
  • El dispositivo está conectado a una red Wi-Fi (si el usuario del dispositivo no ha optado por las copias de seguridad de datos móviles).
    • En la práctica, estas condiciones se dan más o menos cada noche, pero un dispositivo podría no hacer nunca una copia de seguridad (por ejemplo, si nunca se conecta a una red). Para conservar el ancho de banda de la red, la carga sólo tiene lugar si los datos de la app han cambiado.

      Durante la copia de seguridad automática, el sistema cierra la app para asegurarse de que ya no escribe en el sistema de archivos. Por defecto, el sistema de copia de seguridad ignora las apps que se están ejecutando en primer plano porque los usuarios notarían el cierre de sus apps. Puedes anular el comportamiento predeterminado estableciendo el atributo backupInForeground en true.

      Para simplificar las pruebas, Android incluye herramientas que te permiten iniciar manualmente una copia de seguridad de tu aplicación. Para obtener más información, consulta Prueba de copia de seguridad y restauración.

      Programa de restauración

      Los datos se restauran siempre que se instala la app, ya sea desde la Play store, durante la configuración del dispositivo (cuando el sistema instala las apps previamente instaladas) o al ejecutar adb install. La operación de restauración se produce después de la instalación del APK, pero antes de que la app esté disponible para ser lanzada por el usuario.

      Durante el asistente de configuración inicial del dispositivo, se muestra al usuario una lista de conjuntos de datos de copia de seguridad disponibles y se le pregunta de cuál quiere restaurar los datos. El conjunto de datos de copia de seguridad que se seleccione se convierte en el conjunto de datos ancestral del dispositivo. El dispositivo puede restaurar desde sus propias copias de seguridad o desde el conjunto de datos ancestral. El dispositivo da prioridad a su propia copia de seguridad si las copias de seguridad de ambas fuentes están disponibles. Si el usuario no pasó por el asistente de configuración del dispositivo, entonces el dispositivo puede restaurar solo desde sus propias copias de seguridad.

      Para simplificar las pruebas, Android incluye herramientas que te permiten iniciar manualmente una restauración de tu aplicación. Para obtener más información, consulte Probar la copia de seguridad y la restauración.

      Activar y desactivar la copia de seguridad

      Las aplicaciones destinadas a Android 6.0 (nivel de API 23) o superior participan automáticamenteen la copia de seguridad automática. En el archivo de manifiesto de tu aplicación, establece el valor booleanoandroid:allowBackuppara activar o desactivar la copia de seguridad. El valor por defecto es true, pero para dejar claras tus intenciones, te recomendamos que establezcas explícitamente el atributo en tu manifiesto como se muestra a continuación:

<manifest ... > ... <application android:allowBackup="true" ... > ... </application></manifest>

Puedes desactivar las copias de seguridad estableciendo android:allowBackup a false. Puede que quieras hacer esto si tu aplicación puede recrear su estado a través de algún otro mecanismo o si tu aplicación trata con información sensible de la que Android no debería hacer copias de seguridad.

Incluir y excluir archivos

Por defecto, el sistema hace copias de seguridad de casi todos los datos de la aplicación. Para más información, consulta Archivos de los que se hace una copia de seguridad. Esta sección muestra cómo definir reglas XML personalizadas para controlar lo que se incluye en la copia de seguridad.

  1. En AndroidManifest.xml, añada el atributo android:fullBackupContent al elemento <application>. Este atributo apunta a un archivo XML que contiene reglas de copia de seguridad. For example:
    <application ... android:fullBackupContent="@xml/my_backup_rules"></application>
  2. Create an XML file called my_backup_rules.xml in theres/xml/ directory. Inside the file, add rules with the<include> and <exclude> elements.The following sample backs up all shared preferences exceptdevice.xml
    <?xml version="1.0" encoding="utf-8"?><full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/></full-backup-content>

XML config syntax

The XML syntax for the configuration file is shown below:

<full-backup-content> <include domain= path="string" requireFlags= /> <exclude domain= path="string" /></full-backup-content>

Inside the <full-backup-content> tag, you can define <include> and <exclude> elements:

  • <include> – Specifies a file or folder to backup. By default, Auto Backup includes almost all app files. If you specify an <include> element, the system no longer includes any files by default and backs up only the files specified. Para incluir varios archivos, utilice varios elementos <include>.

    Nota: Los archivos de los directorios devueltos por getCacheDir()getCodeCacheDir(), o getNoBackupFilesDir() se excluyen siempre aunque se intente incluirlos.

  • <exclude> – Especifica un archivo o carpeta para excluir durante la copia de seguridad. Estos son algunos archivos que suelen excluirse de la copia de seguridad:
    • Archivos que tienen identificadores específicos del dispositivo, ya sean emitidos por un servidor o generados en el dispositivo. Por ejemplo, Google Cloud Messaging (GCM) necesita generar un token de registro cada vez que un usuario instala su aplicación en un nuevo dispositivo. Si se restablece el token de registro antiguo, la app puede comportarse de forma inesperada.
    • Credenciales de cuenta u otra información sensible. Considere pedir al usuario que se vuelva a autenticar la primera vez que inicie una app restaurada en lugar de permitir el almacenamiento de dicha información en la copia de seguridad.
    • Archivos relacionados con la depuración de la app.
    • Large files that cause the app to exceed the 25MB backup quota.

Note: If your configuration file specifies both elements, then the backup contains everything captured by the <include> elements minus the resources named in the <exclude> elements. In other words, <exclude> takes precedence.

Each element must include the following two attributes:

  • domain – specifies the location of resource. Valid values for this attribute include the following:
    • root – the directory on the filesystem where all private files belonging to this app are stored.
    • file – directories returned by getFilesDir().
    • database – directories returned by getDatabasePath(). Databases created with SQLiteOpenHelper are stored here.
    • sharedpref – the directory where SharedPreferences are stored.
    • external the directory returned by getExternalFilesDir()
  • Note: You cannot back up files outside of these locations.

  • path: Specifies a file or folder to include in or exclude from backup. Note that:
    • This attribute does not support wildcard or regex syntax.
    • You can use . to reference the current directory, however, you cannot reference the parent directory .. for security reasons.
    • If you specify a directory, then the rule applies to all files in the directory and recursive sub-directories.

The include element can also contain the requireFlags attribute, which thesection describing how to define conditional requirements forbackup section discusses in more detail.

Define las condiciones del dispositivo necesarias para la copia de seguridad

Si tu aplicación guarda información sensible en el dispositivo, puedes especificar las condiciones bajo las cuales los datos de tu aplicación se incluyen en la copia de seguridad del usuario. Puedes añadir las siguientes condiciones en Android 9 (nivel de API 28) o superior:

  • clientSideEncryption: La copia de seguridad del usuario está encriptada con un cliente-secreto. Esta forma de cifrado está habilitada en los dispositivos que ejecutan Android 9 o superior siempre que el usuario haya habilitado la copia de seguridad en Android 9 o superior y haya establecido un bloqueo de pantalla (PIN, patrón o contraseña) para su dispositivo.
  • deviceToDeviceTransfer: El usuario está transfiriendo su copia de seguridad a otrodispositivo que admite la transferencia local de dispositivo a dispositivo (por ejemplo, el Google Pixel).
  • Si ha actualizado sus dispositivos de desarrollo a Android 9, debe desactivar y volver a activar la copia de seguridad de datos después de la actualización. Esto se debe a que Android solo cifra las copias de seguridad con un secreto del lado del cliente después de informar a los usuarios en los Ajustes o en el Asistente de configuración.

    Para declarar las condiciones de inclusión, establezca el atributo requireFlags al valor o valores deseados en sus elementos <include> dentro de su conjunto de reglas de copia de seguridad:

    my_backup_rules.xml

<?xml version="1.0" encoding="utf-8"?><full-backup-content> <!-- App data isn't included in user's backup unless client-side encryption is enabled. --> <include domain="file" path="." requireFlags="clientSideEncryption" /><full-backup-content>

Si tu aplicación implementa un sistema de copia de seguridad de valores clave, o si implementas tú mismoBackupAgent,también puedes aplicar estos requisitos condicionales a tu lógica de copia de seguridad realizando una comparación a nivel de bits entre el conjunto de banderas de transporte de unBackupDataOutput objeto y las banderas de tu agente de copia de seguridad personalizadoFLAG_CLIENT_SIDE_ENCRYPTION_ENABLEDo FLAG_DEVICE_TO_DEVICE_TRANSFER.

El siguiente fragmento de código muestra un ejemplo de uso de este método:

Kotlin

class MyCustomBackupAgent : BackupAgent() { override fun onBackup(oldState: ParcelFileDescriptor?, data: BackupDataOutput?, newState: ParcelFileDescriptor?) { if (data != null) { if ((data.transportFlags and FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.transportFlags and FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } } // Implementation of onRestore() here.}

Java

public class MyCustomBackupAgent extends BackupAgent { @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { if ((data.getTransportFlags() & FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.getTransportFlags() & FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } // Implementation of onRestore() here.}

Implement BackupAgent

Apps that implement Auto Backup do not need to implement a BackupAgent. However, you can optionally implement a custom BackupAgent. Typically, there are two reasons for doing this:

  • You want to receive notification of backup events such as, onRestoreFinished() or onQuotaExceeded(long, long). These callback methods are executed even if the app is not running.
  • You can’t easily express the set of files you want to backup with XML rules. In these rare cases, you can implement a BackupAgent that overrides onFullBackup(FullBackupDataOutput) to store what you want. To retain the system’s default implementation, call the corresponding method on the superclass with super.onFullBackup().

If you implement a BackupAgent, by default the system expects your app to perform key/value backup and restore. Para utilizar la copia de seguridad automática basada en archivos en su lugar, establece el atributo android:fullBackupOnly a true en el manifiesto de tu app.

Durante las operaciones de copia de seguridad y restauración automáticas, el sistema lanza la app en un modo restringido tanto para evitar que la app acceda a archivos que podrían causar conflictos como para permitir que la app ejecute métodos de devolución de llamadas en su BackupAgent. En este modo restringido, la actividad principal de la aplicación no se lanza automáticamente, sus proveedores de contenido no se inicializan y la clase base Application se instancian en lugar de cualquier subclase declarada en el manifiesto de la aplicación.

Precaución: Para evitar errores, asegúrate de que las partes de tu app que se ejecutan en el modo restringido (principalmente tu BackupAgent) no acceden a proveedores de contenido en la misma app ni intentan lanzar el objeto Application. Si no puedes evitar esos patrones, entonces considera implementar la copia de seguridad clave-valor o deshabilitar la copia de seguridad por completo.

Tu BackupAgent debe implementar los métodos abstractos onBackup() y onRestore(), que se utilizan para la copia de seguridad clave-valor. Pero si no quieres realizar una copia de seguridad de valor clave, puedes dejar tu implementación de esos métodos en blanco.

Para más información, consulta Extending BackupAgent.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.