Чтобы реализовать виртуальный 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
илиwipe
—erase
илиwipe
metadata
,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 сек |