Перенос Fastboot в пользовательское пространство

Android 10 и выше поддерживает разделы с изменяемым размером, перемещая реализацию fastboot из загрузчика в пользовательское пространство. Это перемещение позволяет перемещать мигающий код в обслуживаемое и тестируемое общее место, где только части fastboot, зависящие от поставщика, реализованы на уровне аппаратной абстракции (HAL). Кроме того, Android 12 и выше поддерживает прошивку RAM-дисков с помощью добавленной команды fastboot.

Объединение fastboot и recovery

Поскольку fastboot и восстановление в пользовательском пространстве похожи, вы можете объединить их в один раздел или двоичный файл. Это дает такие преимущества, как использование меньшего пространства, меньшее количество разделов в целом, а также совместное использование ядра и библиотек для быстрой загрузки и восстановления.

Для поддержки fastbootd , загрузчик должен реализовать команду новой управления загрузочного блока (В) в boot-fastboot . Для входа в fastbootd режима, загрузчик пишет boot-fastboot в командном поле сообщения BCB и оставляет recovery поля BCB неизмененнома (для того, чтобы перезапустить любые прерванные задачи восстановления). status , stage и reserved поля остаются неизменными , а также. В загрузчик загружает и загружается в образ восстановления, увидев boot-fastboot в поле команды BCB. Восстановление затем анализирует сообщение BCB и переключается в fastbootd режима.

Команды ADB

В этом разделе описывается adb команды для интеграции fastbootd . Команда дает разные результаты в зависимости от того, выполняется она системой или восстановлением.

Командование Описание
reboot fastboot
  • Перегружает в fastbootd (системы).
  • Ввод fastbootd непосредственно без перезагрузки (восстановления).

Команды Fastboot

В этом разделе описаны команды FastBoot для интеграции fastbootd , в том числе новых команд для прошивки и управления логическими разделами. Некоторые команды имеют разные результаты, в зависимости от уже ли они выполнены загрузчиком или fastbootd .

Командование Описание
reboot recovery
  • Перезагружается в рекавери (загрузчик).
  • Начало восстановления непосредственно без перезагрузки ( fastbootd ).
reboot fastboot Перегружает в fastbootd .
getvar is-userspace
  • Возвращает yes ( fastbootd ).
  • Возвращает no (загрузчика).
getvar is-logical: <partition> Возвращает yes , если данный раздел не является логическим разделом, no иначе. Логические разделы поддерживают все перечисленные ниже команды.
getvar super-partition-name Возвращает имя суперраздела. Имя включает суффикс текущего слота, если супер-раздел является разделом A / B (обычно это не так).
create-logical-partition <partition> <size> Создает логический раздел с заданным именем и размером. Имя не должно существовать как логический раздел.
delete-logical-partition <partition> Удаляет данный логический раздел (фактически стирает раздел).
resize-logical-partition <partition> <size> Изменяет размер логического раздела до нового размера без изменения его содержимого. Ошибка, если недостаточно места для изменения размера.
update-super <partition> Объединяет изменения в метаданные суперраздела. Если слияние невозможно (например, формат на устройстве - неподдерживаемая версия), то эта команда не выполняется. По желанию wipe параметр перезаписывает метаданные устройства, а не выполнение слияния.
flash <partition> [ <filename> ] Записывает файл во флеш-раздел. Устройство должно быть в разблокированном состоянии.
erase <partition> Стирает раздел (не требуется для безопасного стирания). Устройство должно быть в разблокированном состоянии.
getvar <variable> | all Отображает переменную загрузчика или все переменные. Если переменная не существует, возвращает ошибку.
set_active <slot>

Наборы данная А / В начальной загрузке слот в качестве active . При следующей попытке загрузки система загружается из указанного слота.

Для поддержки A / B слоты - это дублированные наборы разделов, из которых можно загружаться независимо. Слоты названы a , b , и так далее, и дифференцированы, добавляя суффиксы _a , _b , и так далее к имени раздела.

reboot Перезагружает устройство нормально.
reboot-bootloader (или reboot bootloader ) Перезагружает устройство в загрузчик.
fastboot fetch vendor_boot <out.img>

Использование в Android 12 и выше для поддержки мигающего RAMдиска , поставщика.

Получает полный размер раздела и размер блока. Получает данные для каждого блока, а затем сшивает вместе , чтобы данные <out.img>

Для получения дополнительной информации см fastboot fetch vendor_boot <out.img> .

fastboot flash vendor_boot:default <vendor-ramdisk.img>

Использование в Android 12 и выше для поддержки мигающего RAMдиска , поставщика.

Это особый вариант команды flash. Он выполняет fetch vendor_boot функции изображения, как если бы fastboot fetch была вызвана. Новый vendor_boot изображения он мигает , зависит от того , версия заголовка загрузки является версия 3 или 4 версии.

Для получения дополнительной информации см fastboot flash vendor_boot:default <vendor-ramdisk.img> - fastboot flash vendor_boot:default <vendor-ramdisk.img> по fastboot flash vendor_boot:default <vendor-ramdisk.img> .

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> Использование в Android 12 и выше для поддержки мигающего RAMдиска , поставщика.

Выдает vendor_boot изображение. Возвращает ошибку, если загрузочный заголовок поставщика имеет версию 3. Если это версия 4, он находит правильный фрагмент виртуального диска поставщика (если доступен). Он заменяет , что с данным изображением, пересчитывает размеры и смещение, и вспыхивает новый vendor_boot image .

Для получения дополнительной информации см fastboot flash vendor_boot: <foo> <vendor-ramdisk.img>

Fastboot и загрузчик

Загрузчик вспыхнет bootloader , radio и boot/recovery разделы, после чего устройство загружается в FastBoot (пользовательский) и мигают все остальные разделы. Загрузчик должен поддерживать следующие команды.

Командование Описание
download Скачивает образ на прошивку.
flash recovery <image> / flash boot <image> / flash bootloader <image> / Вспыхивает recovery/boot раздел и загрузчик.
reboot Перезагружает устройство.
reboot fastboot Перезагружается в фастбут.
reboot recovery Перезагружается в рекавери.
getvar Получает переменную загрузчика , который необходим для восстановления миганием / загрузочного образа (например, current-slot и max-download-size ).
oem <command> Команда определена OEM.

Динамические перегородки

Загрузчик не должен допускать мигание или стирание динамических разделов и возвращать ошибку , если эти операции делаются попытки. Для модифицированных устройств с динамическими разделами инструмент fastboot (и загрузчик) поддерживает принудительный режим для прямой прошивки динамического раздела в режиме загрузчика. Например, если system представляет собой динамический раздел на модернизированы устройства, с помощью fastboot --force flash system - fastbootd fastboot --force flash system команд включает загрузчик (вместо fastbootd ) флэш раздела.

Зарядка в выключенном состоянии

Если устройство поддерживает внедорожных режим зарядки или иначе autoboots в специальный режим при подаче питания, реализацию в fastboot oem off-mode-charge 0 команда должна обойти эти специальные режимы, так что сапоги устройства , как если бы пользователь нажал кнопку питания.

Fastboot OEM HAL

Чтобы полностью заменить загрузчик fastboot, fastboot должен обрабатывать все существующие команды fastboot. Многие из этих команд предоставлены OEM-производителями и задокументированы, но требуют индивидуальной реализации. Многие команды OEM-специфические не документированы. Для обработки таких команд HAL fastboot определяет необходимые OEM-команды. OEM-производители также могут реализовывать свои собственные команды.

Определение fastboot HAL следующее:

import IFastbootLogger;

/**
 * IFastboot interface implements vendor specific fastboot commands.
 */
interface IFastboot {
    /**
     * Returns a bool indicating whether the bootloader is enforcing verified
     * boot.
     *
     * @return verifiedBootState True if the bootloader is enforcing verified
     * boot and False otherwise.
     */
    isVerifiedBootEnabled() generates (bool verifiedBootState);

    /**
     * Returns a bool indicating the off-mode-charge setting. If off-mode
     * charging is enabled, the device autoboots into a special mode when
     * power is applied.
     *
     * @return offModeChargeState True if the setting is enabled and False if
     * not.
     */
    isOffModeChargeEnabled() generates (bool offModeChargeState);

    /**
     * Returns the minimum battery voltage required for flashing in mV.
     *
     * @return batteryVoltage Minimum battery voltage (in mV) required for
     * flashing to be successful.
     */
    getBatteryVoltageFlashingThreshold() generates (int32_t batteryVoltage);

    /**
     * Returns the file system type of the partition. This is only required for
     * physical partitions that need to be wiped and reformatted.
     *
     * @return type Can be ext4, f2fs or raw.
     * @return result SUCCESS if the operation is successful,
     * FAILURE_UNKNOWN if the partition is invalid or does not require
     * reformatting.
     */
    getPartitionType(string partitionName) generates (FileSystemType type, Result result);

    /**
     * Executes a fastboot OEM command.
     *
     * @param oemCmd The oem command that is passed to the fastboot HAL.
     * @response result Returns the status SUCCESS if the operation is
     * successful,
     * INVALID_ARGUMENT for bad arguments,
     * FAILURE_UNKNOWN for an invalid/unsupported command.
     */
    doOemCommand(string oemCmd) generates (Result result);

};

Включение fastbootd

Чтобы включить fastbootd на устройстве:

  1. Добавить fastbootd в PRODUCT_PACKAGES в device.mk : PRODUCT_PACKAGES += fastbootd .

  2. Убедитесь, что HAL для быстрой загрузки, HAL для управления загрузкой и HAL для работоспособности упакованы как часть образа для восстановления.

  3. Добавьте любое специфическое для устройства разрешения SEPolicy необходимого fastbootd . Например, fastbootd требует записи доступа к устройству-конкретного раздела флэш этот раздел. Кроме того, для реализации fastboot HAL также могут потребоваться разрешения для конкретных устройств.

Чтобы проверить пользовательское приложение FastBoot запустите Vendor Test Suite (СДС) .

Прошивка ramdisks поставщиков

Android 12 и выше обеспечивает поддержку мигания RAMдиска , с добавлением команды FastBoot , который тянет весь vendor_boot изображение с устройства. Команда предлагает инструменту fastboot на стороне хоста прочитать загрузочный заголовок поставщика, повторно создать образ и прошить новый образ.

Для того, чтобы вытащить полный vendor_boot образ, команда fetch:vendor_boot был добавлен как протокол FastBoot, и fastbootd реализации протокола в Android 12. Обратите внимание , что fastbootd делает осуществить это, но сам загрузчик не может. OEM - производители могут добавлять fetch:vendor_boot команды к их реализации загрузчика протокола. Однако, если команда не распознается в режиме загрузчика, то прошивка RAM-дисков отдельных поставщиков в режиме загрузчика не поддерживается производителем.

Изменения загрузчика

Команды getvar:max-fetch-size и fetch:name реализуются в fastbootd . Для поддержки прошивки RAM-дисков поставщика в загрузчике вы должны реализовать эти две команды.

Изменения Fastbootd

getvar:max-fetch-size похож на max-download-size . Он определяет максимальный размер, который устройство может отправить в одном ответе DATA. Драйвер не должен получать размер больше этого значения.

fetch:name[:offset[:size]] выполняет ряд проверок на устройстве. Если все следующие истинны, то fetch:name[:offset[:size]] команда возвращает данные:

  • На устройстве выполняется отлаживаемая сборка.
  • Устройство разблокировано (состояние загрузки оранжевый).
  • Неправдоподобное имя раздела vendor_boot .
  • size значение находится в пределах 0 < size <= max-fetch-size .

Когда они будут проверены, fetch:name[:offset[:size]] возвращает размер раздела и смещение. Обратите внимание на следующее:

  • fetch:name эквивалентно fetch:name:0 , что эквивалентно fetch:name:0:partition_size .
  • fetch:name:offset эквивалентно fetch:name:offset:(partition_size - offset)

Поэтому fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset)

Когда offset или partition_size (или оба) не определены, используются значения по умолчанию, которые для offset равно 0, и size это расчетное значение partition_size - offset .

  • Смещение указанного размера, не определен: size = partition_size - offset
  • Ни указания: Значения по умолчанию не используется для обоих, size = partition_size - 0.

Например, fetch:foo извлекает весь foo раздел по смещению 0.

Смена драйвера

В инструмент fastboot были добавлены команды для внесения изменений в драйверы. Каждый связан с его полным определением в таблице команд FastBoot .

  • fastboot fetch vendor_boot out.img

    • Вызовы getvar max-fetch-size , чтобы определить размер порции.
    • Вызывает getvar partition-size:vendor_boot[_a] , чтобы определить размер всего раздела.
    • Вызовы fastboot fetch vendor_boot[_a]:offset:size для каждой порции. (Размер порции составляет больше , чем vendor_boot размера, так что обычно только один фрагмент.)
    • Швы данные вместе, чтобы out.img .
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Это особый вариант команды flash. Он извлекает vendor_boot изображения, как если бы fastboot fetch называется.

    • Если загрузочный вендор заголовок версии 3 , он выполняет следующие действия :
      • Заменяет виртуальный диск поставщика указанным образом.
      • Вспыхивает новый vendor_boot изображение.
    • Если заголовок загрузки поставщика является версия 4 , он делает следующее:
      • Заменяет весь поставщик псевдодиск с данным изображением , так что данное изображение становится единственным фрагментом поставщик электронного диска в vendor_boot изображении.
      • Пересчитывает размер и смещение в таблице виртуального диска поставщика.
      • Вспыхивает новый vendor_boot изображение.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    Выдает vendor_boot image , как если бы fastboot fetch называется.

    • Если загрузочный заголовок поставщика имеет версию 3, он возвращает ошибку.
    • Если загрузочный заголовок поставщика имеет версию 4, он выполняет следующие действия:

      • Находит фрагмент электронного диска поставщика с именем foo . Если не найден или есть несколько совпадений, возвращает ошибку.
      • Заменяет фрагмент виртуального диска поставщика указанным изображением.
      • Пересчитывает каждый размер и смещение в таблице виртуального диска поставщика.
      • Вспыхивает новый vendor_boot изображение.

mkbootimg

Имя по default зарезервировано для обозначения фрагментов поставщика Ramdisk в Android 12 и выше. В то время быстрой загрузки flash vendor_boot:default по default flash vendor_boot:default семантика остаются теми же, вы не должны назвать свои фрагменты Ramdisk как по default .

Изменения SELinux

Изменение было сделано в fastbootd.te для поддержки мигающего RAMдиска , поставщика.