Внедрить виртуальный 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 больше не находятся в super. То есть, 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. См. IBootControl.hal и types.hal для получения последней версии определения 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 alignment pinned file .

Virtual A/B опирается на функции, добавленные в версии ядра 4.3: бит состояния переполнения в целях snapshot и snapshot-merge . Все устройства, запускаемые с Android 9 и более поздними версиями, должны иметь версию ядра 4.4 или более позднюю.

Для включения сжатых снимков минимальная поддерживаемая версия ядра — 4.19. Установите CONFIG_DM_USER=m или CONFIG_DM_USER=y . Если используется первый вариант (модуль), модуль должен быть загружен в ramdisk первой стадии. Этого можно добиться, добавив следующую строку в 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, временем загрузки и временем слияния снимков. Параметр по умолчанию, включенный для virtual ab со сжатием, — это lz4 compression method .

Тонкая настройка сжатия

Алгоритмы сжатия можно дополнительно настроить двумя способами: ( уровень сжатия ) (величина сжатия, достигаемая за счет скорости) и ( коэффициент сжатия ) (максимальный размер сжимаемого окна). Уровень сжатия доступен для определенных алгоритмов, таких как zstd , и изменение уровня влечет за собой компромисс между скоростью и степенью сжатия. Коэффициент сжатия описывает максимальный размер окна сжатия, используемый во время установки OTA. Значение по умолчанию составляет 64k, но его можно переопределить, настроив параметр сборки PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR . Поддерживаемые коэффициенты сжатия: 4k, 8k, 16k, 32k, 64k, 128k и 256k.

PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

Инкрементное OTA на Pixel 8 Pro

Время установки без фазы после установки Использование пространства COW Время загрузки после OTA Время слияния снимков
lz4 18 мин 15с 2,5 ГБ 32,7 сек. 98,6 сек.
зстд 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 сек.
зстд 16 мин 19с 3,46 ГБ 21,0 сек. 106.3 сек.
никто 13 мин 33с 6,39 ГБ 18,5 сек. 92,5 сек.