Внедрить виртуальный A/B

Чтобы реализовать виртуальный 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-status merging , и поддерживается только в fastbootd.
  • snapshot-update cancel — устанавливает статус слияния HAL управления загрузкой в CANCELLED . Эта команда недействительна, если устройство заблокировано.
  • erase или wipeerase или wipe metadata , userdata или раздела, содержащего статус слияния для управления загрузкой, HAL должен проверить статус слияния снимка. Если статус — MERGING или SNAPSHOTTED , устройство должно прервать операцию.
  • set_active — команда set_active , изменяющая активный слот, должна проверять статус слияния снимков. Если статус — MERGING , устройство должно прервать операцию. Слот можно безопасно изменить в состоянии SNAPSHOTTED .

Эти изменения предназначены для предотвращения случайного прекращения загрузки устройства, но могут нарушить работу автоматизированных инструментов. При использовании команд в процессе прошивки всех разделов, например, при запуске fastboot flashall , рекомендуется использовать следующую последовательность действий:

  1. Запрос getvar snapshot-update-status .
  2. При merging или snapshotted выполните команду snapshot-update cancel .
  3. Продолжайте выполнять шаги по перепрошивке.

Уменьшить требования к хранению

Устройствам, которым не выделено полное хранилище 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 сек