Чтобы реализовать виртуальный A/B на новом устройстве или модернизировать запущенное устройство, необходимо внести изменения в код, специфичный для устройства.
Флаги сборки
Устройства, использующие виртуальный A/B, должны быть настроены как устройство A/B и должны запускаться с динамическими разделами .
Для устройств, запускаемых с виртуальным A/B, настройте их на наследование базовой конфигурации виртуального устройства A/B:
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
 Устройствам, запускаемым с виртуальным A/B, требуется только половина размера платы для BOARD_SUPER_PARTITION_SIZE , поскольку слоты B больше не находятся в супер. То есть BOARD_SUPER_PARTITION_SIZE должен быть больше или равен сумме (размер групп обновлений) + накладные расходы , которая, в свою очередь, должна быть больше или равна сумме (размер разделов) + накладные расходы .
Для Android 13 и выше, чтобы включить сжатые снимки с помощью Virtual A/B, унаследуйте следующую базовую конфигурацию:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)
 Это позволяет создавать снимки пользовательского пространства с помощью Virtual A/B, используя метод сжатия без операций. Затем можно выбрать один из поддерживаемых методов сжатия: zstd или lz4 . В Android 15 сжатие можно дополнительно настроить в соответствии с потребностями устройства. Подробнее см. в разделе «Точная настройка сжатия» .
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Для Android 12, чтобы включить сжатые снимки с помощью Virtual A/B, унаследуйте следующую базовую конфигурацию:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
сжатие XOR
 На устройствах с обновлением до Android 13 и выше функция сжатия XOR по умолчанию отключена. Чтобы включить сжатие XOR, добавьте следующее в .mk файл устройства.
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true
 Сжатие XOR включено по умолчанию для устройств, наследующих android_t_baseline.mk .
Объединение пользовательского пространства
В современной версии Virtual A/B (Android T и более поздние версии) процесс слияния снимков происходит полностью в пользовательском пространстве. Это изменение стало возможным благодаря snapuserd и dm-user. На устройствах с Android 13 и более поздними версиями слияние пользовательского пространства включено по умолчанию, а для более старых устройств, обновляемых с помощью обновления, это свойство можно настроить следующим образом:
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
Управление загрузкой HAL
HAL управления загрузкой предоставляет клиентам OTA интерфейс для управления загрузочными слотами. Virtual A/B требует обновления минорной версии HAL управления загрузкой, поскольку для защиты загрузчика во время прошивки или сброса к заводским настройкам необходимы дополнительные API. Актуальную версию определения HAL см. в файлах IBootControl.hal и types.hal.
// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
    NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };
// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
    setSnapshotMergeStatus(MergeStatus status)
        generates (bool success);
    getSnapshotMergeStatus()
        generates (MergeStatus status);
}
// Recommended implementation
Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
    // Write value to persistent storage
    // e.g. misc partition (using libbootloader_message)
    // bootloader rejects wipe when status is SNAPSHOTTED
    // or MERGING
}
Изменения в Fstab
 Целостность раздела метаданных критически важна для процесса загрузки, особенно сразу после применения обновления OTA. Поэтому раздел метаданных необходимо проверить до того, как first_stage_init его смонтирует. Для этого добавьте флаг check fs_mgr к записи для /metadata . Ниже приведен пример:
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
Требования к ядру
 Чтобы включить моментальные снимки, установите для CONFIG_DM_SNAPSHOT значение true .
Для устройств, использующих F2FS, включите флаг f2fs: export FS_NOCOW_FL в патч ядра пользователя для исправления закрепления файлов. Также включите патч ядра f2fs: support aligned pinned file .
 Виртуальный A/B использует функции, добавленные в ядре версии 4.3: бит состояния переполнения в целях snapshot и snapshot-merge . Все устройства с Android 9 и более поздними версиями должны иметь ядро версии 4.4 или более поздней.
 Для включения сжатых снимков минимальная поддерживаемая версия ядра — 4.19. Установите CONFIG_DM_USER=m или CONFIG_DM_USER=y . При использовании первого варианта (модуля) модуль должен быть загружен в RAM-диск первой ступени. Этого можно добиться, добавив следующую строку в Makefile устройства: 
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
Изменения в инструментах Fastboot
Android 11 вносит следующие изменения в протокол fastboot:
-  getvar snapshot-update-status— Возвращает значение, которое HAL управления загрузкой передал загрузчику:-  Если состояние — MERGING, загрузчик должен вернутьmerging.
-  Если состояние SNAPSHOTTED, загрузчик должен вернутьsnapshotted.
-  В противном случае загрузчик должен вернуть none.
 
-  Если состояние — 
-  snapshot-update merge— завершает операцию слияния, при необходимости загружаясь в recovery/fastbootd. Эта команда действительна только в том случае, еслиsnapshot-update-statusmerging, и поддерживается только в fastbootd.
-  snapshot-update cancel— устанавливает статус слияния HAL управления загрузкой вCANCELLED. Эта команда недействительна, если устройство заблокировано.
-  eraseилиwipe—eraseилиwipemetadata,userdataили раздела, содержащего статус слияния для управления загрузкой, HAL должен проверить статус слияния снимка. Если статус —MERGINGилиSNAPSHOTTED, устройство должно прервать операцию.
-  set_active— командаset_active, изменяющая активный слот, должна проверять статус слияния снимков. Если статус —MERGING, устройство должно прервать операцию. Слот можно безопасно изменить в состоянииSNAPSHOTTED.
 Эти изменения предназначены для предотвращения случайного прекращения загрузки устройства, но могут нарушить работу автоматизированных инструментов. При использовании команд в процессе прошивки всех разделов, например, при запуске fastboot flashall , рекомендуется использовать следующую последовательность действий:
-  Запрос getvar snapshot-update-status.
-  При mergingилиsnapshottedвыполните командуsnapshot-update cancel.
- Продолжайте выполнять шаги по перепрошивке.
Уменьшить требования к хранению
 Устройствам, которым не выделено полное хранилище A/B в super и которые планируют использовать /data по мере необходимости, настоятельно рекомендуется использовать инструмент сопоставления блоков. Инструмент сопоставления блоков обеспечивает единообразие распределения блоков между сборками, сокращая количество ненужных записей в снимок. Это описано в разделе «Сокращение размера OTA» .
Алгоритмы сжатия OTA
 Пакеты OTA можно настраивать для различных показателей производительности. Android поддерживает несколько методов сжатия ( lz4 , zstd и none ), которые обеспечивают компромисс между временем установки, использованием пространства COW, временем загрузки и временем слияния снимков. Для виртуального ab со сжатием по умолчанию включен lz4 compression method .
Тонкая настройка сжатия
 Алгоритмы сжатия можно дополнительно настраивать двумя способами: ( уровень сжатия ) (степень сжатия, достигаемая за счёт скорости) и ( коэффициент сжатия ) (максимальный размер сжимаемого окна). Уровень сжатия доступен для некоторых алгоритмов, таких как zstd , и изменение уровня влечёт за собой компромисс между скоростью и степенью сжатия. Коэффициент сжатия описывает максимальный размер окна сжатия, используемый при установке OTA. Значение по умолчанию — 64 КБ, но его можно переопределить, настроив параметр сборки PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR . Поддерживаемые коэффициенты сжатия: 4 КБ, 8 КБ, 16 КБ, 32 КБ, 64 КБ, 128 КБ и 256 КБ. 
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Инкрементальное обновление OTA на Pixel 8 Pro
| Время установки без фазы после установки | Использование пространства COW | Время загрузки после OTA | Время слияния снимков | |
|---|---|---|---|---|
| lz4 | 18 мин 15с | 2,5 ГБ | 32,7 сек. | 98,6 сек | 
| zstd | 24 мин 49с | 2,05 ГБ | 36,3 сек. | 133,2 сек | 
| никто | 16 мин 42с | 4,76 ГБ | 28,7 сек. | 76,6 сек. | 
Полное обновление OTA на Pixel 8 Pro
| Время установки без фазы после установки | Использование пространства COW | Время загрузки после OTA | Время слияния снимков | |
|---|---|---|---|---|
| lz4 | 15 мин 11с | 4,16 ГБ | 17,6 сек. | 82,2 сек | 
| zstd | 16 мин 19с | 3,46 ГБ | 21,0 сек | 106,3 сек | 
| никто | 13 мин 33с | 6,39 ГБ | 18,5 сек | 92,5 сек | 
