Реализация bootconfig в Android 12

В Android 12 функция bootconfig заменяет параметры командной строки ядра androidboot.* используемые в Android 11 и более ранних версиях. Функция bootconfig — это механизм передачи сведений о конфигурации из сборки и загрузчика в Android 12.

Эта функция позволяет отделить параметры конфигурации пользовательского пространства Android от параметров ядра. Перемещение длинных параметров ядра androidboot.* в файл bootconfig освобождает место в командной строке ядра и делает его доступным для будущего расширения.

И ядро, и пользовательское пространство Android должны поддерживать bootconfig .

  • Первый выпуск с такой поддержкой: Android 12.
  • Первая версия ядра, имеющая такую ​​поддержку: ядро ​​12-5.4.xx.

Реализуйте функцию bootconfig для новых устройств, запускаемых с версией ядра 12-5.10.xx. Вам не нужно реализовывать его, если вы обновляете устройства.

Примеры и источник

Просматривая примеры и исходный код в этом разделе, обратите внимание, что формат кода bootconfig лишь немного отличается от формата командной строки ядра, используемого в Android 11 и более ранних версиях. Однако для вашего использования важна следующая разница:

  • Параметры должны быть разделены escape-последовательностью новой строки \n , а не пробелами.

Пример загрузчика

Пример загрузчика см. в реализации эталонного загрузчика U-boot Cuttlefish. Два коммита в ссылке перечислены ниже. Первый повышает поддержку версии загрузочного заголовка до последней версии. В этом примере первый коммит обновляет (или повышает) поддерживаемую версию до следующей, v4. Второй делает две вещи; он добавляет обработку bootconfig и демонстрирует добавление параметров во время выполнения:

Пример сборки

Пример сборки, демонстрирующий изменения mkbootimg для vendor_boot.img с загрузочным заголовком поставщика v4, см. в разделе mkbootimg changes for bootconfig . Посмотрите изменения в каракатицах, чтобы сделать следующее:

Выполнение

Партнеры должны добавить поддержку в свои загрузчики и переместить параметры androidboot.* времени сборки из командной строки ядра в файл bootconfig. Лучший способ реализовать это изменение — делать это постепенно; информацию о выполнении поэтапного процесса см. в разделе «Поэтапная реализация и проверка» .

Если у вас есть изменения, которые ищут в файле /proc/cmdline параметры androidboot.* , вместо этого укажите им файл /proc/bootconfig . Свойства ro.boot.* устанавливаются с использованием новых значений bootconfig , поэтому вам не нужно вносить изменения в код, использующий эти свойства.

Изменения сборки

Сначала обновите версию загрузочного заголовка до версии 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Добавьте параметр cmdline ядра bootconfig . Это заставит ядро ​​искать раздел bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

Параметры bootconfig создаются из параметров переменной BOARD_BOOTCONFIG , подобно тому, как командная строка ядра создается из BOARD\_KERNEL\_CMDLINE .

Любые параметры androidboot.* можно перемещать как есть, аналогично следующему:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

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

Загрузчик настраивает initramfs перед переходом к ядру. Конфигурация загрузки ядра ищет раздел bootconfig и ищет его в самом конце initramfs, с ожидаемым трейлером.

Загрузчик получает информацию о vendor_boot.img из заголовка загрузочного образа поставщика.

Схема распределения памяти bootconfig

Рис. 1. Распределение памяти в конфигурации загрузки Android 12.

Загрузчик создает в памяти раздел bootconfig. Раздел bootconfig содержит выделение памяти для следующего:

  • Параметры
  • 4 parameters size
  • parameters checksum размера 4 B
  • 12 B волшебная строка bootconfig ( #BOOTCONFIG\n )

Параметры поступают из двух источников: параметры, известные во время сборки, и параметры, неизвестные во время сборки. Неизвестные параметры должны быть добавлены.

Параметры, известные во время сборки, упаковываются в конец vendor_boot в разделе bootconfig. Размер раздела хранится (в байтах) в поле заголовка загрузки vendor_bootconfig_size .

Параметры, которые неизвестны во время сборки, известны только во время выполнения в загрузчике. Их необходимо добавить в конец раздела параметров bootconfig перед применением трейлера bootconfig.

Если вам нужно добавить какие-либо параметры после применения трейлера bootconfig, перезапишите трейлер и примените его повторно.

Поэтапное внедрение и проверка

Реализуйте функцию bootconfig постепенно, следуя процессу, описанному в этом разделе. Оставьте параметры cmdline ядра нетронутыми, пока добавляются параметры bootconfig.

Ниже приведены шаги поэтапной реализации с проверкой:

  1. Внесите изменения в загрузчик и сборку, затем выполните следующие действия:
    1. Используйте переменную BOARD_BOOTCONFIG , чтобы добавить новый параметр bootconfig.
    2. Сохраните параметры командной строки ядра такими, какие они есть, чтобы устройство могло продолжать правильно загружаться. Это значительно упрощает отладку и проверку.
  2. Проверьте свою работу, проверив содержимое /proc/bootconfig . Убедитесь, что вы видите новый добавленный параметр после загрузки устройства.
  3. Переместите параметры androidboot.* из командной строки ядра в bootconfig, используя переменную BOARD_BOOTCONFIG и загрузчик.
  4. Убедитесь , что каждый из параметров существует в /proc/bootconfig И что их нет в /proc/cmdline . Если вы можете это проверить, ваша реализация прошла успешно.

Рекомендации по обновлению и понижению версии OTA

Когда вы управляете OTA-обновлениями и понижениями версий между различными версиями Android или разными версиями ядра, следует проявлять особую осторожность.

Android 12 — первая версия с поддержкой bootconfig. При переходе на более раннюю версию вместо bootconfig необходимо использовать параметры cmdline ядра.

Версии ядра 12–5.4 и более поздние поддерживают bootconfig. При переходе на любую предыдущую версию (включая 11-5.4) необходимо использовать параметры командной строки ядра.

При обновлении Android 11 и более ранних версий до Android 12 и более поздних версий можно продолжать использовать параметры командной строки ядра. То же самое касается обновления версий ядра.

Поиск неисправностей

Если при выполнении шага проверки вы не видите ожидаемые параметры в /proc/bootconfig , проверьте журналы ядра в logcat . Всегда имеется запись в журнале для bootconfig, если ядро ​​поддерживает ее.

Пример вывода журнала

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

Если вы видите возвращенный журнал ошибок, значит, возникла проблема с загрузкой bootconfig. Чтобы просмотреть различные типы ошибок, просмотрите init/main.c .