Для реализации беспроводных обновлений (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
Загрузчик должен поддерживать уровень HAL boot_control , как определено в hardware/libhardware/include/hardware/boot_control.h . Программа обновления запрашивает уровень HAL управления загрузкой , обновляет неиспользуемый загрузочный слот, изменяет активный слот с помощью уровня HAL и перезагружается в обновлённую операционную систему. Подробнее см. в разделе «Реализация уровня 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. При изменении раздела, входящего в слот, загрузчик сбрасывает состояние «successfully booted» и сбрасывает счётчик повторных попыток для слота.
Загрузчик также должен определить, какой слот загружать. На рисунке показан пример процесса принятия решения.

Определите, какой слот использовать. Не пытайтесь загрузить слот, помеченный как
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также должен поддерживать прошивку радио. Это можно сделать одним из двух способов:Загрузчик прошивает радио. В этом случае должна быть возможность перезагрузиться из раздела восстановления обратно в загрузчик для завершения обновления.
Образ восстановления прошивает радио. Эта функция может быть реализована в виде двоичной библиотеки или утилиты.