Функция автоматического резервного копирования приложений автоматически создает резервные копии данных пользователя из приложений, работающих на Android 6.0 (уровень API 23) или выше. Android сохраняет данные приложения, загружая их на Google Диск пользователя, где они защищены учетными данными учетной записи Google. На устройствах под управлением Android 9 или выше резервная копия шифруется сквозным шифрованием с использованием PIN-кода, графического ключа или пароля устройства. Каждое приложение может выделить до 25 МБ резервных данных на одного пользователя. Хранение резервных копий бесплатно. Ваше приложение может настроить процесс резервного копирования или отключить его .
Обзор возможностей резервного копирования в Android, а также рекомендации по выбору данных для резервного копирования и восстановления см. в разделе «Обзор резервного копирования данных» .
Файлы, которые находятся в резервной копии
По умолчанию автоматическое резервное копирование включает файлы в большинстве каталогов, назначенных вашему приложению системой:
Файлы общих настроек
Файлы, сохраненные во внутренней памяти вашего приложения и доступные через
getFilesDir()илиgetDir(String, int)Файлы в каталоге, возвращаемые функцией
getDatabasePath(String), включая файлы, созданные с помощью классаSQLiteOpenHelperФайлы на внешнем накопителе в каталоге, возвращаемом функцией
getExternalFilesDir(String)
Функция автоматического резервного копирования исключает файлы из каталогов, возвращаемых функциями getCacheDir() , getCodeCacheDir() и getNoBackupFilesDir() . Файлы, сохраненные в этих местах, необходимы только временно и намеренно исключаются из операций резервного копирования.
Вы можете настроить приложение таким образом, чтобы оно включало и исключало определенные файлы. Для получения дополнительной информации см. раздел «Включение и исключение файлов» .
Место резервного копирования
Резервные копии данных хранятся в личной папке в учетной записи Google Drive пользователя, размер которой ограничен 25 МБ на приложение. Сохраненные данные не учитываются в личной квоте пользователя Google Drive. Сохраняется только самая последняя резервная копия. При создании резервной копии все предыдущие резервные копии удаляются. Данные резервной копии недоступны для чтения пользователем или другими приложениями на устройстве.
В приложении Google Drive для Android пользователи могут увидеть список приложений, резервные копии которых были созданы. На устройствах Android этот список можно найти в меню навигации приложения Drive в разделе «Настройки» > «Резервное копирование и сброс» .
Резервные копии данных за весь период эксплуатации каждого устройства хранятся в отдельных наборах данных, как описано в следующих примерах:
Если у пользователя два устройства, то для каждого устройства существует резервная копия данных.
Если пользователь сбрасывает настройки устройства до заводских, а затем настраивает его с той же учетной записью, резервная копия сохраняется в новом наборе данных. Устаревшие наборы данных автоматически удаляются после периода бездействия.
Резервный график
Резервное копирование происходит автоматически при выполнении всех следующих условий:
- Пользователь включил резервное копирование на устройстве. В Android 9 эта настройка находится в разделе «Настройки» > «Система» > «Резервное копирование» .
- С момента последнего резервного копирования прошло не менее 24 часов.
- Устройство находится в режиме ожидания.
- Устройство подключено к сети Wi-Fi (если пользователь устройства не включил резервное копирование данных через мобильный интернет).
На практике такие ситуации возникают примерно каждую ночь, но устройство может никогда не создавать резервные копии (например, если оно никогда не подключается к сети). Для экономии пропускной способности сети загрузка происходит только в том случае, если данные приложения изменились.
Во время автоматического резервного копирования система закрывает приложение, чтобы убедиться, что оно больше не записывает данные в файловую систему. По умолчанию система резервного копирования игнорирует приложения, работающие на переднем плане, чтобы избежать неудобств для пользователя. Вы можете изменить поведение по умолчанию, установив атрибут android:backupInForeground в значение true.
Для упрощения тестирования Android включает инструменты, позволяющие вручную инициировать резервное копирование приложения. Дополнительную информацию см. в разделе «Тестирование резервного копирования и восстановления» .
Восстановить расписание
Восстановление данных происходит при каждой установке приложения: из Play Store, во время настройки устройства (когда система устанавливает ранее установленные приложения) или с помощью команды adb install. Операция восстановления происходит после установки APK-файла, но до того, как приложение станет доступно для запуска пользователем.
В процессе первоначальной настройки устройства пользователю отображается список доступных наборов резервных копий, и ему предлагается выбрать, из какого из них восстанавливать данные. Выбранный набор резервных копий становится исходным набором данных для устройства. Устройство может восстанавливать данные либо из собственных резервных копий, либо из исходного набора данных. Если доступны резервные копии из обоих источников, устройство отдает приоритет собственной резервной копии. Если пользователь не проходил мастер настройки устройства, устройство может восстанавливать данные только из собственных резервных копий.
Для упрощения тестирования Android включает инструменты, позволяющие вручную инициировать восстановление приложения. Дополнительную информацию см. в разделе «Тестирование резервного копирования и восстановления» .
Включение и отключение резервного копирования
Приложения, ориентированные на Android 6.0 (уровень API 23) или выше, автоматически участвуют в автоматическом резервном копировании. В файле манифеста приложения установите логическое значение android:allowBackup , чтобы включить или отключить резервное копирование. Значение по умолчанию — true , но мы рекомендуем явно указать этот атрибут в манифесте, как показано в следующем примере:
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
Вы можете отключить резервное копирование, установив параметр android:allowBackup в значение false . Это может быть необходимо, если ваше приложение может восстанавливать свое состояние с помощью какого-либо другого механизма или если ваше приложение работает с конфиденциальной информацией.
Включать и исключать файлы
По умолчанию система создает резервные копии почти всех данных приложения. Для получения дополнительной информации см. раздел о файлах, которые резервируются .
Вы можете управлять тем, какие данные будут включены в резервную копию в зависимости от типа передачи. Функция автоматического резервного копирования поддерживает резервное копирование в облако Google Drive и прямую передачу данных между устройствами (D2D). Методы настройки зависят от версии Android и targetSdkVersion вашего приложения.
- Для устройств под управлением Android 11 или более ранних версий см. раздел «Резервное копирование в системе управления на устройствах Android 11 и более ранних версий» .
- Для устройств под управлением Android 12 и выше приложения, ориентированные на API уровня 31 и выше, используют формат
data-extraction-rules. Подробнее см. раздел «Управление резервным копированием на Android 12 и выше» . - Формат
data-extraction-rulesтакже поддерживает кроссплатформенную передачу (например, на iOS). Эта возможность доступна начиная с Android 16 QPR2 . Подробнее см. в разделе «Настройка кроссплатформенной передачи» .
Управление резервным копированием на Android 11 и более ранних версиях.
Выполните действия, описанные в этом разделе, чтобы управлять резервным копированием файлов на устройствах под управлением Android 11 (уровень API 30) или более ранних версий.
В файле
AndroidManifest.xmlдобавьте атрибутandroid:fullBackupContentк элементу<application>, как показано в следующем примере. Этот атрибут указывает на XML-файл, содержащий правила резервного копирования.<application ... android:fullBackupContent="@xml/backup_rules"> </application>
Создайте XML-файл с именем
@xml/ backup_rulesв каталогеres/xml/. В этот файл добавьте правила с элементами<include>и<exclude>. Следующий пример создает резервную копию всех общих настроек, кромеdevice.xml:<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </full-backup-content>
Определите необходимые условия для работы устройства при резервном копировании.
Если ваше приложение сохраняет конфиденциальную информацию на устройстве, вы можете указать условия, при которых данные вашего приложения будут включены в резервную копию пользователя. В Android 9 (уровень API 28) и выше можно добавить следующие условия:
-
clientSideEncryption: резервная копия пользователя шифруется с помощью секретного ключа на стороне клиента. Этот вид шифрования включен на устройствах под управлением Android 9 или выше, если пользователь включил резервное копирование в Android 9 или выше и установил блокировку экрана (PIN-код, графический ключ или пароль) для своего устройства. -
deviceToDeviceTransfer: пользователь переносит свою резервную копию на другое устройство, поддерживающее локальную передачу данных между устройствами (например, Google Pixel).
Если вы обновили свои устройства для разработки до Android 9, вам необходимо отключить, а затем снова включить резервное копирование данных после обновления. Это связано с тем, что Android шифрует резервные копии с помощью секретного ключа на стороне клиента только после уведомления пользователей в настройках или мастере настройки.
Чтобы задать условия включения, установите атрибут requireFlags на выбранное значение или значения в элементах <include> в вашем наборе правил резервного копирования:
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>
Если ваше приложение использует систему резервного копирования «ключ-значение» или если вы самостоятельно реализовали BackupAgent , вы также можете применить эти условные требования к своей логике резервного копирования, выполнив побитовое сравнение между набором транспортных флагов объекта BackupDataOutput и флагами FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED или FLAG_DEVICE_TO_DEVICE_TRANSFER вашего пользовательского агента резервного копирования.
Следующий фрагмент кода демонстрирует пример использования этого метода:
Котлин
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. }
Управление резервным копированием на Android 12 или выше
Если ваше приложение ориентировано на Android 12 (уровень API 31) или выше, выполните действия, описанные в этом разделе, чтобы контролировать, какие файлы будут резервно копироваться на устройствах под управлением Android 12 или выше.
В файле
AndroidManifest.xmlдобавьте атрибутandroid:dataExtractionRulesк элементу<application>, как показано в следующем примере. Этот атрибут указывает на XML-файл, содержащий правила резервного копирования.<application ... android:dataExtractionRules="backup_rules.xml"> </application>
Создайте XML-файл с именем
backup_rules .xmlв каталогеres/xml/. В этот файл добавьте правила с элементами<include>и<exclude>. Следующий пример создает резервную копию всех общих настроек, кромеdevice.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>
Синтаксис XML-конфигурации
Синтаксис XML-файла конфигурации различается в зависимости от версии Android, на которой ориентировано и работает ваше приложение.
Android 11 или ниже
Для файла конфигурации, управляющего резервным копированием на устройствах под управлением Android 11 или более ранних версий , используйте следующий XML-синтаксис.
<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 или выше
Если ваше приложение ориентировано на Android 12 (уровень API 31) или выше, используйте следующий XML-синтаксис для файла конфигурации, управляющего резервным копированием для устройств под управлением Android 12 или выше .
<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>
Каждый раздел конфигурации ( <cloud-backup> , <device-transfer> , <cross-platform-transfer> ) содержит правила, которые применяются только к данному типу передачи. Такое разделение позволяет, например, исключить файл или каталог из резервного копирования в Google Drive, но при этом обеспечить их передачу при передаче между устройствами (D2D) или межплатформенной передаче. Это полезно, если у вас есть файлы, слишком большие для резервного копирования в облако, но которые можно без проблем передать между устройствами.
Если для конкретного режима резервного копирования отсутствуют правила, например, если отсутствует раздел <device-transfer> , то этот режим полностью активируется для всего содержимого, за исключением каталогов, для которых no-backup , и каталогов cache , как описано в разделе « Файлы, которые резервируются» .
В разделе <cloud-backup> вашего приложения можно установить флаг disableIfNoEncryptionCapabilities , чтобы резервное копирование выполнялось только в том случае, если файл можно зашифровать, например, при включенном экране блокировки. Установка этого ограничения предотвращает отправку резервных копий в облако, если устройство пользователя не поддерживает шифрование, но поскольку D2D-передача не отправляется на сервер, она продолжает работать даже на устройствах, не поддерживающих шифрование.
Синтаксис для включения и исключения элементов
Внутри тегов <full-backup-content> , <cloud-backup> и <device-transfer> (в зависимости от версии Android на устройстве и targetSDKVersion вашего приложения) вы можете определить элементы <include> и <exclude> :
-
<include> Указывает файл или папку для резервного копирования. По умолчанию автоматическое резервное копирование включает почти все файлы приложения. Если вы укажете элемент
<include>, система больше не будет включать файлы по умолчанию и будет создавать резервные копии только указанных файлов . Чтобы включить несколько файлов, используйте несколько элементов<include>.В Android 11 и более ранних версиях этот элемент также может содержать атрибут
requireFlags, который более подробно рассматривается в разделе, посвященном определению условных требований для резервного копирования .Файлы в каталогах, возвращаемых функциями
getCacheDir(),getCodeCacheDir()илиgetNoBackupFilesDir(), всегда исключаются, даже если вы попытаетесь их включить.-
<exclude> Указывает файл или папку, которые следует исключить из резервного копирования. Вот некоторые файлы, которые обычно исключаются из резервного копирования:
Файлы, содержащие идентификаторы, специфичные для устройства, либо выданные сервером, либо сгенерированные на самом устройстве. Например, Firebase Cloud Messaging (FCM) необходимо генерировать регистрационный токен каждый раз, когда пользователь устанавливает ваше приложение на новое устройство. Если будет восстановлен старый регистрационный токен, приложение может вести себя непредсказуемо.
Файлы, относящиеся к отладке приложения.
Большие файлы, из-за которых приложение превышает квоту на резервное копирование в 25 МБ.
Каждый элемент <include> и <exclude> должен содержать следующие два атрибута:
-
domain Указывает местоположение ресурса. Допустимые значения для этого атрибута включают следующие:
-
root: каталог в файловой системе, где хранятся все личные файлы, принадлежащие этому приложению. -
file: каталоги, возвращаемые функциейgetFilesDir(). -
database: каталоги, возвращаемые функциейgetDatabasePath(). Здесь хранятся базы данных, созданные с помощьюSQLiteOpenHelper. -
sharedpref: каталог, в котором хранятсяSharedPreferences. -
external: каталог, возвращаемый функциейgetExternalFilesDir(). -
device_root: аналогичноroot, но для защищенного устройства хранилища. -
device_file: аналогичноfile, но для защищенного устройством хранилища. -
device_database: аналогdatabase, но для защищенного устройства хранилища. -
device_sharedpref: аналогичноsharedpref, но для защищенного устройством хранилища.
-
-
path Указывает файл или папку, которые следует включить или исключить из резервного копирования. Обратите внимание на следующее:
- Этот атрибут не поддерживает синтаксис подстановочных символов или регулярных выражений.
- Вы можете указать текущий каталог с помощью
./`, но вы не можете указать родительский каталог, например, с помощью.., по соображениям безопасности. - Если вы укажете каталог, то правило будет применяться ко всем файлам в этом каталоге и его рекурсивных подкаталогах.
Настройка межплатформенной передачи данных
Начиная с Android 16 QPR2 (уровень API 36.1) вы можете настроить автоматическое резервное копирование для передачи данных на устройства, отличные от Android, и обратно. Для этого добавьте элемент <cross-platform-transfer> в конфигурацию <data-extraction-rules> , как показано в синтаксисе Android 12 или выше . Необходимо указать целевую платформу, используя атрибут required platform . Единственное поддерживаемое значение — ios .
В этом разделе вы можете использовать стандартные элементы <include> и <exclude> , как описано в разделе «Синтаксис элементов include и exclude», чтобы указать, какие данные следует передать.
Кроме того, необходимо добавить элемент <platform-specific-params> , чтобы помочь системе сопоставить ваше приложение с соответствующим приложением на целевой платформе. Этот элемент имеет следующие обязательные атрибуты:
-
bundleId: Идентификатор пакета приложения на другой платформе (например, идентификатор пакета вашего iOS-приложения). -
teamId: Идентификатор команды приложения на другой платформе (например, идентификатор команды вашего iOS-приложения). -
contentVersion: Строка версии, которую вы определяете, связанная с форматом экспортируемых данных.
Атрибуты bundleId и teamId используются для проверки целостности данных и корректного сопоставления приложений. Они гарантируют, что данные передаются только в указанное приложение на другой платформе во время экспорта, и что данное приложение Android импортирует данные только из этого конкретного приложения во время импорта.
Для более точного контроля над процессом преобразования и передачи данных, выходящего за рамки возможностей правил XML, вы можете реализовать собственный BackupAgent и использовать API кроссплатформенной передачи .
Сопоставление файлов для передачи данных на iOS
При передаче файлов на iOS domain Android и path указанные в правилах <include> , сопоставляются с определенной структурой каталогов. В следующей таблице показаны пути назначения на iOS относительно корневого каталога назначения для передачи, исходя из domain Android:
domain Android | Путь на iOS (относительно передачи root-прав) |
|---|---|
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/ |
Например, файл, включенный в состав пакета <include domain="file" path="my_settings.txt"/> будет доступен на стороне iOS по адресу app/files/my_settings.txt относительно корневого каталога места назначения передачи.
Внедрить BackupAgent
Приложениям, реализующим автоматическое резервное копирование, не требуется реализовывать BackupAgent . Однако вы можете дополнительно реализовать собственный BackupAgent . Как правило, для этого есть две причины:
Вы хотите получать уведомления о событиях резервного копирования, таких как
onRestoreFinished()иonQuotaExceeded(). Эти методы обратного вызова выполняются, даже если приложение не запущено.С помощью правил XML сложно легко указать набор файлов, которые вы хотите скопировать. В таких редких случаях можно реализовать
BackupAgent, который переопределяетonFullBackup(FullBackupDataOutput)для хранения нужных данных. Чтобы сохранить реализацию по умолчанию, вызовите соответствующий метод в суперклассе с помощьюsuper.onFullBackup().
Если вы используете BackupAgent , по умолчанию система ожидает, что ваше приложение будет выполнять резервное копирование и восстановление по принципу «ключ-значение» . Чтобы использовать вместо этого автоматическое резервное копирование на основе файлов, установите атрибут android:fullBackupOnly в true в манифесте вашего приложения.
Во время операций автоматического резервного копирования и восстановления система запускает приложение в ограниченном режиме, чтобы предотвратить доступ приложения к файлам, которые могут вызвать конфликты, и позволить приложению выполнять методы обратного вызова в своем BackupAgent . В этом ограниченном режиме основная активность приложения не запускается автоматически, его поставщики контента не инициализируются, и вместо любого подкласса, объявленного в манифесте приложения, создается экземпляр базового класса Application .
Ваш BackupAgent должен реализовывать абстрактные методы onBackup() и onRestore() , которые используются для резервного копирования по ключу и значению. Если вы не хотите выполнять резервное копирование по ключу и значению, вы можете оставить реализацию этих методов пустой.
Для получения дополнительной информации см. раздел «Расширение BackupAgent» .
Обработка межплатформенных передач в BackupAgent
Начиная с Android 16 QPR2 (уровень API 36.1), в BackupAgent доступны несколько новых API для улучшения поддержки кроссплатформенной передачи данных.
Новый транспортный флаг:
-
FLAG_CROSS_PLATFORM_TRANSFER_IOS: Этот флаг добавляется кtransportFlags, предоставляемому вашемуBackupAgent.- В
onFullBackupэтот флаг устанавливается, если текущая операция резервного копирования является частью экспорта данных на устройство iOS. - В новой перегрузке
onRestoreFileэтот флаг устанавливается, если данные импортируются с устройства iOS.
- В
Новый метод onRestoreFile :
Введена новая перегрузка метода onRestoreFile , принимающая один параметр FullRestoreDataInput . Этот объект предоставляет дополнительную информацию об операции восстановления:
-
FullRestoreDataInput.getTransportFlags(): Возвращает транспортные флаги для текущей операции восстановления, которые могут включатьFLAG_CROSS_PLATFORM_TRANSFER_IOS. -
FullRestoreDataInput.getContentVersion(): Возвращает строку версии контента, предоставленную исходным приложением на другой платформе во время кроссплатформенной передачи. Это значение является пустой строкой, если оно не предоставлено источником.
Новый метод оценки размеров:
-
onEstimateFullBackupBytes(): Этот метод позволяет указать приблизительный размер данных, которые ваше приложение планирует скопировать. Его использование настоятельно рекомендуется, если ваше приложение выполняет значительные преобразования данных во время резервного копирования или обрабатывает большой объем данных, поскольку это может повысить эффективность за счет избежания стандартного системного пробного запуска. Для приложений с небольшими, простыми резервными копиями этот метод обычно не требуется.
Пример использования:
Котлин
// 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();
}