La función Copia de seguridad automática para apps realiza copias de seguridad de los datos del usuario de las apps que se orientan a Android 6.0 (nivel de API 23) y se ejecutan en esa versión o en otras posteriores. Android conserva los datos de app subiéndolos en la unidad de Google Drive del usuario, donde están protegidos por las credenciales de su Cuenta de Google. La copia de seguridad se encripta de extremo a extremo en dispositivos con Android 9 o versiones posteriores mediante el PIN, el patrón o la contraseña del dispositivo. Cada app puede asignar hasta 25 MB de datos de copia de seguridad por usuario de la app. No se cobra por almacenar datos de copia de seguridad. Tu app puede personalizar el proceso de copia de seguridad u optar por inhabilitarlo.
Para obtener una descripción general de las opciones de copia de seguridad de Android y orientación sobre qué datos se deben incluir en una copia de seguridad y restablecimiento, consulta Descripción general de la copia de seguridad de datos.
Archivos con copia de seguridad
De forma predeterminada, la Copia de seguridad automática incluye archivos en la mayoría de los directorios que el sistema asigna a tu app:
Archivos de preferencias compartidos
Archivos que se guardan en el almacenamiento interno de tu app y a los que se accede con
getFilesDir()ogetDir(String, int)Archivos del directorio que muestra
getDatabasePath(String), que también incluye archivos creados con la claseSQLiteOpenHelperArchivos en el almacenamiento externo del directorio que muestra
getExternalFilesDir(String)
La copia de seguridad automática excluye archivos en los directorios que muestran getCacheDir(), getCodeCacheDir() y getNoBackupFilesDir(). Los archivos guardados en estas ubicaciones solo se necesitan temporalmente y se excluyen de las operaciones de copia de seguridad de manera intencional.
Puedes configurar tu app para incluir y excluir archivos particulares. Para obtener más información, consulta la sección Cómo incluir y excluir archivos.
Ubicación de las copias de seguridad
Los datos de copia de seguridad se almacenan en una carpeta privada en el servicio de Google Drive del usuario, limitada a 25 MB por app. Los datos guardados no inciden en la cuota personal de Google Drive del usuario. Solo se almacena la copia de seguridad más reciente. Cuando se crea una copia de seguridad, se borra cualquier copia anterior. El usuario ni otras apps del dispositivo pueden leer los datos de la copia de seguridad.
Los usuarios pueden ver una lista de apps con copia de seguridad en la app de Google Drive para Android. En un dispositivo con Android, los usuarios pueden encontrar esa lista en el panel lateral de navegación de la app de Drive en Configuración > Crear copia de seguridad y restablecer.
Las copias de seguridad de cada conjunto de dispositivo, configuración y ciclo de vida se almacenan en conjuntos de datos por separado, como se describe en los siguientes ejemplos:
Si el usuario posee dos dispositivos, existe un conjunto de datos de copia de seguridad para cada uno.
Si el usuario restablece la configuración de fábrica de un dispositivo y luego lo configura con la misma cuenta, la copia de seguridad se almacena en un nuevo conjunto de datos. Los conjuntos de datos obsoletos se borran automáticamente después de un período de inactividad.
Cronograma de copia de seguridad
Las copias de seguridad se crean automáticamente cuando se cumplen todas estas condiciones:
- El usuario habilitó la copia de seguridad en el dispositivo. En Android 9, esta configuración se encuentra en Configuración > Sistema > Copia de seguridad.
- Transcurrieron 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 aceptó las copias de seguridad de datos móviles).
En la práctica, estas condiciones ocurren casi todas las noches, pero es posible que un dispositivo nunca cree una copia de seguridad (por ejemplo, si nunca se conecta a una red). Para conservar el ancho de banda de la red, la carga se realiza solo si cambian los datos de la app.
Durante la copia de seguridad automática, el sistema cierra la app para asegurarse de que ya no esté escribiendo en el sistema de archivos. De forma predeterminada, el sistema de copia de seguridad ignora las apps que se ejecutan en primer plano para evitar una experiencia del usuario deficiente. Puedes anular el comportamiento predeterminado configurando el atributo android:backupInForeground como verdadero.
Para simplificar las pruebas, Android incluye herramientas que te permiten iniciar una copia de seguridad de tu app de forma manual. Si deseas obtener más información, consulta Cómo probar copias de seguridad y restablecimientos.
Cómo restablecer el programa
Los datos se restablecen cada vez que se instala la app, ya sea desde Play Store, durante la configuración del dispositivo (cuando el sistema instala apps instaladas previamente) o cuando se ejecuta la instalación de adb. La operación de restablecimiento ocurre después de instalar el APK, pero antes de que la app esté disponible para que el usuario la inicie.
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 desea restablecer datos. El conjunto de datos de copia de seguridad seleccionado se convierte en el conjunto de datos principal del dispositivo. El dispositivo se puede restablecer desde sus propias copias de seguridad o desde el conjunto de datos principal. Si hay copias de seguridad de ambas fuentes disponibles, el dispositivo prioriza la propia. Si el usuario no usó el asistente de configuración del dispositivo, solo podrá restablecerlo desde sus propias copias de seguridad.
Para simplificar las pruebas, Android incluye herramientas que te permiten iniciar un restablecimiento de tu app manualmente. Para obtener más información, consulta Cómo probar copias de seguridad y restablecimientos.
Cómo habilitar e inhabilitar una copia de seguridad
Las apps que se segmentan a Android 6.0 (nivel de API 23) o versiones posteriores crean, de forma predeterminada, una copia de seguridad automática. En el archivo de manifiesto de tu app, configura el valor booleano android:allowBackup para habilitar o inhabilitar la copia de seguridad. El valor predeterminado es true, pero te recomendamos que configures de forma explícita el atributo en tu manifiesto, como se muestra en el siguiente ejemplo:
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
Puedes inhabilitar las copias de seguridad configurando android:allowBackup como false. Te recomendamos que lo hagas si tu app puede recrear su estado a través de algún otro mecanismo o si procesa información sensible.
Cómo incluir y excluir archivos
De forma predeterminada, el sistema crea copias de seguridad de casi todos los datos de apps. Para obtener más información, consulta la sección sobre archivos con copia de seguridad.
Puedes controlar qué datos se incluyen en la copia de seguridad según el tipo de transferencia.
La Copia de seguridad automática admite copias de seguridad en la nube en Google Drive y transferencias directas de dispositivo a dispositivo (D2D). Los métodos de configuración varían según la versión de Android y el targetSdkVersion de tu app.
- En el caso de los dispositivos que ejecutan Android 11 o versiones anteriores, consulta Cómo controlar las copias de seguridad en Android 11 y versiones anteriores.
- En el caso de los dispositivos que ejecutan Android 12 o versiones posteriores, las apps que se segmentan para el nivel de API 31 o superior usan el formato
data-extraction-rules. Consulta Cómo controlar las copias de seguridad en Android 12 o versiones posteriores para obtener más información. - El formato
data-extraction-rulestambién admite transferencias multiplataforma (p.ej., a iOS). Esta capacidad está disponible a partir de Android 16 QPR2. Obtén más información en Cómo configurar transferencias multiplataforma.
Cómo controlar las copias de seguridad en Android 11 y versiones anteriores
Sigue los pasos que se indican en esta sección para controlar de qué archivos se crea una copia de seguridad en dispositivos con Android 11 (nivel de API 30) o versiones anteriores.
En el archivo
AndroidManifest.xml, agrega el atributoandroid:fullBackupContental elemento<application>, como se muestra en el siguiente ejemplo. Este atributo apunta a un archivo XML que contiene reglas de copias de seguridad.<application ... android:fullBackupContent="@xml/backup_rules"> </application>
Crea un archivo en formato XML llamado
@xml/backup_rulesen el directoriores/xml/. En ese archivo, agrega reglas con los elementos<include>y<exclude>. En el siguiente ejemplo, se crea una copia de seguridad de todas las preferencias compartidas, exceptodevice.xml:<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </full-backup-content>
Cómo definir las condiciones del dispositivo necesarias para la copia de seguridad
Si tu app guarda información sensible en el dispositivo, puedes especificar las condiciones en las que se incluyen sus datos en la copia de seguridad del usuario. Puedes agregar las siguientes condiciones en Android 9 (nivel de API 28) o versiones posteriores:
clientSideEncryption: La copia de seguridad del usuario está encriptada con un secreto del cliente. Esta forma de encriptación está habilitada en dispositivos que ejecutan Android 9 o versiones posteriores, siempre y cuando el usuario haya habilitado la copia de seguridad en esas versiones y haya configurado un bloqueo de pantalla (PIN, patrón o contraseña) para el dispositivo.deviceToDeviceTransfer: El usuario está transfiriendo su copia de seguridad a otro dispositivo que admite la transferencia local de un dispositivo a otro (por ejemplo, Google Pixel).
Si actualizaste tus dispositivos de desarrollo a Android 9, debes inhabilitar y volver a habilitar la copia de seguridad de datos después de la actualización. Eso se debe a que Android solo encripta las copias de seguridad con un secreto del cliente después de informar a los usuarios en Configuración o en el asistente de configuración.
Para declarar las condiciones de inclusión, configura el atributo requireFlags con los valores elegidos en los elementos <include> dentro de tu conjunto de reglas de copia de seguridad:
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 app implementa un sistema de copia de seguridad de clave-valor o si implementas BackupAgent por tu cuenta, también puedes aplicar estos requisitos condicionales a tu lógica de copia de seguridad realizando una comparación bit a bit entre el conjunto de marcas de transporte de un objeto BackupDataOutput y las marcas FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED o FLAG_DEVICE_TO_DEVICE_TRANSFER de tu agente de copia de seguridad personalizado.
En el siguiente fragmento de código, se muestra un ejemplo de uso de este método:
Kotlin
class CustomBackupAgent : 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 CustomBackupAgent 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. }
Cómo controlar las copias de seguridad en Android 12 o versiones posteriores
Si tu app se orienta a Android 12 (nivel de API 31) o versiones posteriores, sigue los pasos que se indican en esta sección para controlar de qué archivos se crea una copia de seguridad en dispositivos que ejecutan Android 12 o versiones posteriores.
En el archivo
AndroidManifest.xml, agrega el atributoandroid:dataExtractionRulesal elemento<application>, como se muestra en el siguiente ejemplo. Este atributo apunta a un archivo en formato XML que contiene reglas de copias de seguridad.<application ... android:dataExtractionRules="backup_rules.xml"> </application>
Crea un archivo en formato XML llamado
backup_rules.xmlen el directoriores/xml/. En ese archivo, agrega reglas con los elementos<include>y<exclude>. En el siguiente ejemplo, se crea una copia de seguridad de todas las preferencias compartidas, exceptodevice.xml:<?xml version="1.0" encoding="utf-8"?> <data-extraction-rules> <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </cloud-backup> </data-extraction-rules>
Sintaxis de la configuración XML
La sintaxis XML para el archivo de configuración varía según la versión de Android en la que se ejecuta la app y a la que se orienta.
Android 11 o versiones anteriores
Usa la siguiente sintaxis XML para el archivo de configuración que controla la copia de seguridad de los dispositivos que ejecutan Android 11 o versiones anteriores.
<full-backup-content> <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string" requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] /> <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string" /> </full-backup-content>
Android 12 o versiones posteriores
Si la app se orienta a Android 12 (nivel de API 31) o versiones posteriores, usa la siguiente sintaxis XML para el archivo de configuración que controla la copia de seguridad de los dispositivos que ejecutan Android 12 o versiones posteriores.
<data-extraction-rules> <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... </cloud-backup> <device-transfer> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... </device-transfer> <cross-platform-transfer platform="ios"> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <platform-specific-params bundleId="string" teamId="string" contentVersion="string"/> ... </cross-platform-transfer> </data-extraction-rules>
Cada sección de la configuración (<cloud-backup>, <device-transfer>, <cross-platform-transfer>) contiene reglas que se aplican solo a ese tipo de transferencia. Por ejemplo, esta separación te permite excluir un archivo o un directorio de las copias de seguridad en Google Drive mientras todavía lo estás enviando durante transferencias de un dispositivo a otro (D2D) o transferencias multiplataforma. Esto es útil si tienes archivos que son demasiado grandes para crear una copia de seguridad en la nube, pero que se pueden transferir entre dispositivos sin problemas.
Si no se establecen reglas para un modo particular de copia de seguridad, como si faltara la sección <device-transfer>, ese modo se habilita por completo para todo el contenido, excepto los directorios no-backup y cache, como se describe en la sección Archivos con copia de seguridad.
La app puede configurar la marca disableIfNoEncryptionCapabilities en la sección <cloud-backup> para asegurarse de que la copia de seguridad se cree solo si se puede encriptar, por ejemplo, cuando el usuario tiene una pantalla de bloqueo. Establecer esta restricción impide que las copias de seguridad se envíen a la nube si el dispositivo del usuario no es compatible con la encriptación. Sin embargo, como las transferencias de D2D no se envían al servidor, seguirán funcionando incluso en dispositivos que no admitan la encriptación.
Sintaxis para incluir y excluir elementos
Dentro de las etiquetas <full-backup-content>, <cloud-backup> y <device-transfer> (según la versión de Android del dispositivo y targetSDKVersion de la app), puedes definir los elementos <include> y <exclude>:
<include>Especifica un archivo o una carpeta que necesita copia de seguridad. De forma predeterminada, la Copia de seguridad automática incluye casi todos los archivos de la app. Si especificas un elemento
<include>, el sistema ya no incluye ningún archivo de forma predeterminada y crea una copia de seguridad solo de los archivos especificados. Para incluir varios archivos, usa varios elementos<include>.En Android 11 y versiones anteriores, este elemento también puede incluir el atributo
requireFlags, que se analiza en más detalle en la sección que describe cómo definir requisitos condicionales para la copia de seguridad.Los archivos de los directorios que muestran
getCacheDir(),getCodeCacheDir()ogetNoBackupFilesDir()siempre se excluyen, incluso si intentas incluirlos.<exclude>Especifica un archivo o una carpeta para excluir durante la copia de seguridad. Estos son algunos archivos que, por lo general, se excluyen de la copia de seguridad:
Archivos que tienen identificadores específicos del dispositivo, emitidos por un servidor o generados en el dispositivo. Por ejemplo, Firebase Cloud Messaging (FCM) necesita generar un token de registro cada vez que un usuario instala tu app en un dispositivo nuevo. Si se restablece el token de registro anterior, es posible que la app se comporte de forma inesperada.
Archivos relacionados con la depuración de app
Archivos grandes que hacen que la app exceda la cuota de copia de seguridad de 25 MB.
Cada elemento <include> y <exclude> debe incluir los siguientes dos atributos:
domainEspecifica la ubicación del recurso. Los valores válidos para este atributo incluyen lo siguiente:
root: Es el directorio en el sistema de archivos donde se almacenan todos los archivos privados que pertenecen a esta app.file: Los directorios que muestragetFilesDir().database: Los directorios que muestragetDatabasePath(). Las bases de datos creadas conSQLiteOpenHelperse almacenan aquí.sharedpref: Es el directorio en el que se almacenan losSharedPreferences.external: Es el directorio que muestragetExternalFilesDir().device_root: Es similar aroot, pero para el almacenamiento protegido por el dispositivo.device_file: Es similar afile, pero para el almacenamiento protegido por el dispositivo.device_database: Es similar adatabase, pero para el almacenamiento protegido por el dispositivo.device_sharedpref: Es similar asharedpref, pero para el almacenamiento protegido por el dispositivo.
pathEspecifica un archivo o una carpeta para incluir o excluir de la copia de seguridad. Ten en cuenta lo siguiente:
- Este atributo no admite comodines ni sintaxis de expresiones regulares.
- Puedes hacer referencia al directorio actual con
./, pero no puedes hacer referencia al directorio superior, como.., por motivos de seguridad. - Si especificas un directorio, la regla se aplicará a todos los archivos del directorio y los subdirectorios recursivos.
Cómo configurar las transferencias multiplataforma
A partir de Android 16 QPR2 (nivel de API 36.1), puedes configurar la copia de seguridad automática para transferencias de datos hacia y desde dispositivos que no son Android. Para ello, agrega el elemento <cross-platform-transfer> dentro de la configuración de <data-extraction-rules>, como se muestra en la sintaxis de Android 12 o versiones posteriores. Debes especificar la plataforma de destino con el atributo obligatorio platform. El único valor admitido es ios.
Dentro de esta sección, puedes usar los elementos <include> y <exclude> estándar, como se describe en Sintaxis para incluir y excluir elementos, para especificar qué datos transferir.
Además, debes incluir el elemento <platform-specific-params> para ayudar al sistema a hacer coincidir tu app con la app correspondiente en la plataforma de destino.
Este elemento tiene los siguientes atributos obligatorios:
bundleId: Es el ID del paquete de la app en la otra plataforma (p.ej., el ID del paquete de tu app para iOS).teamId: Es el ID del equipo de la app en la otra plataforma (p.ej., el ID del equipo de tu app para iOS).contentVersion: Es una cadena de versión que defines y que se asocia con el formato de datos que se exporta.
Los atributos bundleId y teamId se usan para ayudar a verificar la integridad de los datos y la correcta correlación entre aplicaciones. Garantizan que los datos solo se transfieran a la app especificada en la otra plataforma durante una exportación y que esta app para Android solo importe datos de esa app específica durante una importación.
Para tener un control más detallado sobre el proceso de transferencia y transformación de datos más allá de lo que proporcionan las reglas de XML, puedes implementar un BackupAgent personalizado y usar las APIs de Cross-Platform Transfer.
Asignación de archivos para transferencias de iOS
Cuando transfieres archivos a iOS, los domain y path de Android que especificas en las reglas de <include> se asignan a una estructura de directorio específica. En la siguiente tabla, se muestran las rutas de destino en iOS en relación con la raíz del destino de transferencia, según el domain de Android:
Android domain |
Ruta de acceso en iOS (relativa a la raíz de transferencia) |
|---|---|
root |
app/ |
file |
app/files/ |
database |
app/databases/ |
sharedpref |
app/shared_prefs/ |
external |
external/files/ |
device_root |
device/app/ |
device_file |
device/app/files/ |
device_database |
device/app/databases/ |
device_sharedpref |
device/app/shared_prefs/ |
Por ejemplo, un archivo incluido con <include domain="file"
path="my_settings.txt"/> estará disponible en el lado de iOS en app/files/my_settings.txt en relación con la raíz del destino de transferencia.
Cómo implementar BackupAgent
Las apps que implementan la Copia de seguridad automática no necesitan implementar un BackupAgent.
Sin embargo, de forma opcional, puedes implementar un BackupAgent personalizado. Por lo general, existen dos motivos para hacer esto:
Deseas recibir notificaciones de eventos de copia de seguridad, como
onRestoreFinished()yonQuotaExceeded(). Estos métodos de devolución de llamada se ejecutan incluso si la app no se está ejecutando.No puedes expresar fácilmente el conjunto de archivos para los que quieres crear una copia de seguridad con reglas XML. En esos casos poco frecuentes, puedes implementar un
BackupAgentque anule aonFullBackup(FullBackupDataOutput)para almacenar lo que deseas. Para retener la implementación predeterminada del sistema, llama al método correspondiente en la superclase consuper.onFullBackup().
Si implementas BackupAgent, el sistema, de forma predeterminada, espera que tu app cree una copia de seguridad de clave-valor y un restablecimiento. Si en su lugar deseas utilizar la copia de seguridad automática basada en archivos, configura el atributo android:fullBackupOnly como true en el manifiesto de tu app.
Durante las operaciones de copia de seguridad automática y restablecimiento, el sistema inicia la app en modo restringido para evitar que acceda a archivos que podrían causar conflictos y permitir que ejecute métodos de devolución de llamada en su BackupAgent. En este modo restringido, la actividad principal de la app no se inicia automáticamente, sus proveedores de contenido no se inicializan y se crea una instancia para la clase base Application en lugar de cualquier subclase declarada en el manifiesto de la app.
Tu BackupAgent debe implementar los métodos abstractos onBackup() y onRestore(), que se usan para la copia de seguridad de clave-valor. Si no deseas crear una copia de seguridad de clave-valor, puedes dejar en blanco la implementación de esos métodos.
Para obtener más información, consulta Cómo extender BackupAgent.
Cómo controlar las transferencias multiplataforma en BackupAgent
A partir de Android 16 QPR2 (nivel de API 36.1), hay varias APIs nuevas disponibles en BackupAgent para admitir mejor las transferencias de datos multiplataforma.
Nueva marca de transporte:
FLAG_CROSS_PLATFORM_TRANSFER_IOS: Esta marca se agrega al objetotransportFlagsque se proporciona a tu objetoBackupAgent.- En
onFullBackup, esta marca se establece si la operación de copia de seguridad actual forma parte de una exportación de datos a un dispositivo iOS. - En la nueva sobrecarga de
onRestoreFile, esta marca se establece si los datos se importan desde un dispositivo iOS.
- En
Nuevo método onRestoreFile:
Se introdujo una nueva sobrecarga de onRestoreFile, que toma un solo parámetro FullRestoreDataInput. Este objeto proporciona más contexto sobre la operación de restablecimiento:
FullRestoreDataInput.getTransportFlags(): Devuelve las marcas de transporte para la operación de restablecimiento actual, que pueden incluirFLAG_CROSS_PLATFORM_TRANSFER_IOS.FullRestoreDataInput.getContentVersion(): Devuelve la cadena de versión del contenido que proporciona la aplicación fuente en la otra plataforma durante una transferencia entre plataformas. Este valor es una cadena vacía si la fuente no lo proporciona.
Nuevo método de estimación del tamaño:
onEstimateFullBackupBytes(): Este método te permite proporcionar un tamaño estimado de los datos de los que tu app pretende crear una copia de seguridad. Se recomienda enfáticamente la implementación si tu app realiza transformaciones de datos significativas durante la copia de seguridad o controla un gran volumen de datos, ya que puede mejorar la eficiencia al evitar la ejecución de prueba predeterminada del sistema. Por lo general, este método no es necesario para las apps con copias de seguridad pequeñas y sencillas.
Ejemplo de uso:
Kotlin
// In your custom BackupAgent class
override fun onFullBackup(out: FullBackupDataOutput) {
// Check if this is a cross-platform export to iOS
if ((out.transportFlags and FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
Log.d(TAG, "onFullBackup for iOS transfer")
// Your custom export logic here
// Call fullBackupFile() for files to include
}
}
override fun onRestoreFile(input: FullRestoreDataInput) {
if ((input.transportFlags and FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
val sourceContentVersion = input.contentVersion
Log.d(TAG, "onRestoreFile from iOS, content version: $sourceContentVersion")
// Your custom import logic here, using input.data, input.destination, etc.
}
}
// Optional: Provide an estimate of the backup size
override fun onEstimateFullBackupBytes(): Long {
return calculateEstimatedBackupSize()
}
Java
// In your custom BackupAgent class
@Override
public void onFullBackup(FullBackupDataOutput out) throws IOException {
// Check if this is a cross-platform export to iOS
if ((out.getTransportFlags() & FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
Log.d(TAG, "onFullBackup for iOS transfer");
// Your custom export logic here
// Call fullBackupFile() for files to include
}
}
@Override
public void onRestoreFile(FullRestoreDataInput input) {
if ((input.getTransportFlags() & FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
String sourceContentVersion = input.getContentVersion();
Log.d(TAG, "onRestoreFile from iOS, content version: " + sourceContentVersion);
// Your custom import logic here, using input.getData(), input.getDestination(), etc.
}
}
// Optional: Provide an estimate of the backup size
@Override
public long onEstimateFullBackupBytes() {
return calculateEstimatedBackupSize();
}