Функция автоматического резервного копирования приложений автоматически создает резервные копии данных пользователя из приложений, работающих на 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 Диска пользователя, размер которой ограничен 25 МБ на приложение. Сохранённые данные не учитываются в личной квоте пользователя на Google Диске. Сохраняется только самая последняя резервная копия. При создании резервной копии все предыдущие резервные копии удаляются. Данные резервной копии не могут быть прочитаны пользователем или другими приложениями на устройстве.
Список приложений, резервные копии которых были созданы, доступен в приложении Google Диск для Android. На устройствах Android этот список находится в панели навигации приложения Диск в разделе «Настройки» > «Резервное копирование и сброс» .
Резервные копии каждого device-setup-lifetime хранятся в отдельных наборах данных, как описано в следующих примерах:
Если у пользователя два устройства, то резервный набор данных существует для каждого устройства.
Если пользователь выполняет сброс настроек устройства до заводских, а затем настраивает его с той же учётной записью, резервная копия сохраняется в новом наборе данных. Устаревшие наборы данных автоматически удаляются после определённого периода бездействия.
Расписание резервного копирования
Резервное копирование происходит автоматически при соблюдении всех следующих условий:
- Пользователь включил резервное копирование на устройстве. В Android 9 эта настройка находится в разделе «Настройки» > «Система» > «Резервное копирование» .
- С момента последнего резервного копирования прошло не менее 24 часов.
- Устройство находится в режиме ожидания.
- Устройство подключено к сети Wi-Fi (если пользователь устройства не включил резервное копирование мобильных данных).
На практике такие ситуации возникают примерно каждую ночь, но устройство может вообще не создавать резервные копии (например, если оно вообще не подключается к сети). Для экономии пропускной способности сети загрузка выполняется только в случае изменения данных приложения.
Во время автоматического резервного копирования система завершает работу приложения, чтобы убедиться, что оно больше не записывает данные в файловую систему. По умолчанию система резервного копирования игнорирует приложения, работающие в фоновом режиме, чтобы избежать неудобств для пользователя. Вы можете переопределить это поведение по умолчанию, установив атрибут android:backupInForeground в значение true.
Для упрощения тестирования в Android предусмотрены инструменты, позволяющие вручную инициировать резервное копирование приложения. Подробнее см. в разделе Тестирование резервного копирования и восстановления .
Восстановить расписание
Данные восстанавливаются при каждой установке приложения, будь то из Play Маркета, во время настройки устройства (когда система устанавливает ранее установленные приложения) или при запуске adb install. Восстановление происходит после установки APK-файла, но до того, как приложение станет доступно для запуска пользователем.
В мастере первоначальной настройки устройства пользователю отображается список доступных резервных копий данных и предлагается выбрать, из какого набора данных восстанавливать данные. Выбранный резервный набор данных становится наследственным набором данных для устройства. Устройство может восстановить данные как из собственных резервных копий, так и из наследственного набора данных. Если доступны резервные копии из обоих источников, устройство отдаёт приоритет своей резервной копии. Если пользователь не выполнил мастер настройки устройства, устройство может восстановить данные только из собственных резервных копий.
Для упрощения тестирования в Android предусмотрены инструменты, позволяющие вручную инициировать восстановление приложения. Подробнее см. в разделе Тестирование резервного копирования и восстановления .
Включить и отключить резервное копирование
Приложения, предназначенные для Android 6.0 (уровень API 23) или выше, автоматически участвуют в функции автоматического резервного копирования. В файле манифеста приложения задайте логическое значение android:allowBackup , чтобы включить или отключить резервное копирование. Значение по умолчанию — true , но мы рекомендуем явно задать этот атрибут в манифесте, как показано в следующем примере:
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
Вы можете отключить резервное копирование, установив для параметра android:allowBackup значение false . Это может пригодиться, если ваше приложение может восстанавливать своё состояние с помощью какого-либо другого механизма или если оно работает с конфиденциальной информацией.
Включать и исключать файлы
По умолчанию система создает резервные копии практически всех данных приложений. Подробнее см. в разделе о файлах, подлежащих резервному копированию .
Вы можете управлять данными, включаемыми в резервную копию, в зависимости от типа передачи. Auto Backup поддерживает резервное копирование в облако на Google Диск и прямую передачу данных с устройства на устройство (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. }
Ява
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 или ниже
Используйте следующий синтаксис XML для файла конфигурации, который управляет резервным копированием для устройств под управлением Android 11 или ниже .
<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 Диска, не прерывая их передачу при передаче с устройства на устройство (D2D) или кроссплатформенной передаче. Это полезно, если у вас есть файлы, которые слишком велики для резервного копирования в облако, но могут быть без проблем перенесены между устройствами.
Если для определенного режима резервного копирования нет правил, например, если отсутствует раздел <device-transfer> , этот режим полностью включен для всего содержимого, за исключением каталогов no-backup и cache , как описано в разделе «Файлы, для которых выполняется резервное копирование» .
Ваше приложение может установить флаг disableIfNoEncryptionCapabilities в разделе <cloud-backup> , чтобы резервное копирование выполнялось только при наличии шифрования, например, когда у пользователя заблокирован экран. Установка этого ограничения предотвращает отправку резервных копий в облако, если устройство пользователя не поддерживает шифрование. Однако, поскольку 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 и более поздних версий . Необходимо указать целевую платформу с помощью обязательного атрибута 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:
Android- domain | Путь на iOS (относительно переноса корня) |
|---|---|
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()
}
Ява
// 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();
}