Внедрение OTA-обновлений

Для реализации обновлений по беспроводной сети (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 .

  • Платформа Android отвечает за вызов markBootSuccessful из HAL. Загрузчик никогда не должен отмечать раздел как успешно загруженный.

Поддержка управления загрузкой 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 . При изменении раздела, являющегося частью слота, загрузчик очищает сообщение «загружено успешно» и сбрасывает счетчик повторов для слота.

Загрузчик также должен определить, какой слот загружать. На рисунке показан пример процесса принятия решения.

Порядок слотирования загрузчика
Рисунок 1. Порядок выделения слотов загрузчика
  1. Определите, какой слот попробовать. Не пытайтесь загрузить слот с пометкой slot-unbootable . Этот слот должен соответствовать значениям, возвращаемым fastboot, и называется текущим слотом.

  2. Если текущий слот не помечен как slot-successful и имеет slot-retry-count = 0 , отметьте текущий слот как slot-unbootable . Затем выберите другой слот, который не помечен как unbootable и помечен как slot-successful ; этот слот теперь является выбранным слотом. Если текущий слот недоступен, загрузитесь в режиме восстановления или отобразите пользователю значимое сообщение об ошибке.

  3. Выберите соответствующий boot.img и укажите путь к правильному системному разделу в командной строке ядра.

  4. Заполните параметр slot_suffix командной строки ядра.

  5. Ботинок. Если slot-successful , уменьшите slot-retry-count .

Утилита fastboot определяет, какой раздел прошивать при выполнении любых команд прошивки. Например, при запуске команды fastboot flash system system.img сначала запрашивается переменная current-slot , а затем объединяется результат с системой, чтобы сгенерировать имя раздела, который следует прошить ( 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 также должен иметь возможность прошить радио. Это можно сделать одним из двух способов:

    • Загрузчик прошивает радио. В этом случае должна быть возможность перезагрузиться из раздела восстановления обратно в загрузчик для завершения обновления.

    • Образ рекавери прошивает магнитолу. Эта функциональность может быть предоставлена ​​в виде двоичной библиотеки или утилиты.

,

Для реализации обновлений по беспроводной сети (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 .

  • Платформа Android отвечает за вызов markBootSuccessful из HAL. Загрузчик никогда не должен отмечать раздел как успешно загруженный.

Поддержка управления загрузкой 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 . При изменении раздела, являющегося частью слота, загрузчик очищает сообщение «загружено успешно» и сбрасывает счетчик повторов для слота.

Загрузчик также должен определить, какой слот загружать. На рисунке показан пример процесса принятия решения.

Порядок слотирования загрузчика
Рисунок 1. Порядок выделения слотов загрузчика
  1. Определите, какой слот попробовать. Не пытайтесь загрузить слот с пометкой slot-unbootable . Этот слот должен соответствовать значениям, возвращаемым fastboot, и называется текущим слотом.

  2. Если текущий слот не помечен как slot-successful и имеет slot-retry-count = 0 , отметьте текущий слот как slot-unbootable . Затем выберите другой слот, который не помечен как unbootable и помечен как slot-successful ; этот слот теперь является выбранным слотом. Если текущий слот недоступен, загрузитесь в режиме восстановления или отобразите пользователю значимое сообщение об ошибке.

  3. Выберите соответствующий boot.img и укажите путь к правильному системному разделу в командной строке ядра.

  4. Заполните параметр slot_suffix командной строки ядра.

  5. Ботинок. Если slot-successful , уменьшите slot-retry-count .

Утилита fastboot определяет, какой раздел прошивать при выполнении любых команд прошивки. Например, при запуске команды fastboot flash system system.img сначала запрашивается переменная current-slot , а затем объединяется результат с системой, чтобы сгенерировать имя раздела, который следует прошить ( 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 также должен иметь возможность прошить радио. Это можно сделать одним из двух способов:

    • Загрузчик прошивает радио. В этом случае должна быть возможность перезагрузиться из раздела восстановления обратно в загрузчик для завершения обновления.

    • Образ рекавери прошивает магнитолу. Эта функциональность может быть предоставлена ​​в виде двоичной библиотеки или утилиты.