Для реализации обновлений по воздуху (OTA) загрузчик должен иметь возможность доступа к диску восстановления RAM во время загрузки. Если устройство использует неизмененный образ восстановления AOSP, загрузчик считывает первые 32 байта в разделе misc
; если данные там соответствуют boot-recovery
, загрузчик загружается в образ recovery
. Этот метод позволяет продолжить любую отложенную работу по восстановлению (например, применение OTA или удаление данных) до завершения.
Подробную информацию о содержимом блока флэш-памяти, используемого для связи между восстановлением и загрузчиком, см. в файле bootable/recovery/bootloader_message/bootloader_message.h .
Устройства с обновлениями A/B
Для поддержки обновлений OTA на устройствах, использующих обновления A/B , убедитесь, что загрузчик устройства соответствует следующим критериям.
Общие критерии
Все разделы, обновленные через OTA, должны обновляться во время загрузки основной системы (и не обновляться в процессе восстановления).
Для загрузки
system
раздела загрузчик передает следующее значение в командной строке ядра:ro root=/dev/[node] rootwait init=/init
.Вызов
markBootSuccessful
из HAL — обязанность Android-фреймворка. Загрузчик никогда не должен отмечать раздел как успешно загруженный.
Поддержка управления загрузкой HAL
Загрузчик должен поддерживать boot_control
HAL, как определено в hardware/libhardware/include/hardware/boot_control.h
. Обновление запрашивает boot control HAL , обновляет неиспользуемый слот загрузки, изменяет активный слот с помощью HAL и перезагружается в обновленную операционную систему. Подробности см. в разделе Реализация boot control HAL .
Поддержка слотов
Загрузчик должен поддерживать функциональность, связанную с разделами и слотами, включая:
Имена разделов должны включать суффикс, который определяет, какие разделы принадлежат определенному слоту в загрузчике. Для каждого такого раздела есть соответствующая переменная
has-slot: partition base name
со значениемyes
. Слоты именуются в алфавитном порядке как a, b, c и т. д., что соответствует разделам с суффиксом_a
,_b
,_c
и т. д. Загрузчик должен сообщить операционной системе, какой слот был загружен, с помощью свойства командной строкиandroidboot.slot_suffix
. Это свойство задается через bootconfig для устройств, запускаемых с Android 12 или выше.Значение
slot-retry-count
сбрасывается на положительное значение (обычно3
) либо загрузочным управлением HAL через обратный вызовsetActiveBootSlot
, либо через командуfastboot set_active
. При изменении раздела, который является частью слота, загрузчик очищает «успешно загружен» и сбрасывает счетчик повторов для слота.
Загрузчик также должен определить, какой слот загружать. На рисунке показан пример процесса принятия решения.

Определите, какой слот следует попробовать. Не пытайтесь загрузить слот, помеченный как
slot-unbootable
. Этот слот должен соответствовать значениям, возвращаемым fastboot, и называется текущим слотом.Если текущий слот не отмечен как
slot-successful
и имеетslot-retry-count = 0
, отметить текущий слот какslot-unbootable
. Затем выберите другой слот, который не отмечен какunbootable
и отмечен какslot-successful
; этот слот теперь является выбранным слотом. Если текущий слот недоступен, загрузитесь в режим восстановления или отобразите пользователю осмысленное сообщение об ошибке.Выберите соответствующий
boot.img
и укажите путь к правильному системному разделу в командной строке ядра.Заполните параметр
slot_suffix
командной строки ядра.Загрузка. Если не отмечено как
slot-successful
, уменьшитеslot-retry-count
.
Утилита fastboot
определяет, какой раздел прошивать при запуске любых команд прошивки. Например, запуск команды fastboot flash system system.img
сначала запрашивает переменную current-slot
, а затем объединяет результат с system для генерации имени раздела, который должен быть прошит ( system_a
, system_b
и т. д.).
При установке текущего слота с помощью команды fastboot set_active
или команды управления загрузкой HAL setActiveBootSlot
загрузчик должен обновить текущий слот, очистить slot-unbootable
и slot-successful
и сбросить счетчик повторов (это единственный способ очистить slot-unbootable
).
Устройства без обновлений A/B
Для поддержки обновлений OTA на устройствах, не использующих обновления A/B (см. Устройства, не поддерживающие обновление A/B ), убедитесь, что загрузчик устройства соответствует следующим критериям.
Раздел
recovery
должен содержать образ, способный считывать образ системы из некоторого поддерживаемого раздела (cache
,userdata
) и записывать его вsystem
раздел.Загрузчик должен поддерживать загрузку непосредственно в режиме восстановления.
Если поддерживаются обновления образа радио, раздел
recovery
также должен иметь возможность прошивать радио. Это можно сделать одним из двух способов:Загрузчик прошивает радио. В этом случае должна быть возможность перезагрузиться из раздела восстановления обратно в загрузчик, чтобы завершить обновление.
Образ восстановления прошивает радио. Эта функциональность может быть предоставлена как бинарная библиотека или утилита.