В Android 11 введена концепция универсального образа ядра (Generic Kernel Image, GKI) и раздела загрузки поставщика (vendor boot partition). Раздел загрузки поставщика хранит модули ядра, совместимые с GKI, и загружается на первом этапе инициализации. Модули ядра, выпущенные до Android 11, также хранились в разделах поставщика и ODM и загружались процессами поставщика.
Для Android 11 и выше ядро и все модули ядра можно обновлять независимо от остальных разделов. Чтобы включить обновления для модулей ядра, хранящихся в разделе vendor (без обновления раздела vendor), переместите все модули раздела vendor в новый раздел с именем Vendor DLKM (динамически загружаемый модуль ядра). Затем вы можете обновлять этот раздел независимо. Аналогично, вы можете переместить все модули ядра, хранящиеся в разделе ODM, в новый раздел с именем ODM DLKM . Этот раздел также можно обновлять независимо.
местоположение перегородки
Разделы vendor_dlkm и odm_dlkm расположены в суперразделе как еще один динамический раздел.
Содержимое папки vendor_dlkm находится в /vendor/lib/modules
- Модули ядра от производителя
- конфигурационные файлы
modprobe - Файл
modules.load
Содержимое odm_dlkm в /odm/lib/modules
- Модули ядра ODM
- конфигурационные файлы
modprobe - Файл
modules.load
Дополнительные сведения о файлах конфигурации модулей ядра см. в разделе «Поддержка модулей ядра».
Создать поддержку
Создание разделов vendor_dlkm и odm_dlkm аналогично созданию других динамических разделов.
пример сборки vendor_dlkm
Соберите vendor_dlkm как показано в следующих примерах.
BoardConfig.mk
BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm
Замените <GROUP_NAME> на соответствующее имя группы обновлений. Группа обновлений должна совпадать с группой, в которую входит раздел поставщика.
Для устройств A/B и виртуальных A/B используйте файл device.mk.
AB_OTA_PARTITIONS += vendor_dlkm
fstab
Добавьте следующую запись для vendor_dlkm в fstab. Измените флаги в соответствии с устройством. Используйте CL Add vendor_dlkm to CF в качестве примера.
vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
пример сборки odm_dlkm
Соберите odm_dlkm как показано в следующих примерах.
BoardConfig.mk
BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm
Для устройств A/B и виртуальных A/B используйте device.mk
AB_OTA_PARTITIONS += odm_dlkm
fstab
Добавьте следующую запись для odm_dlkm в fstab. Измените флаги в соответствии с устройством. Используйте CL Add odm_dlkm to CF в качестве примера.
odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
Скопируйте модули ядра в раздел.
Чтобы выбрать модули ядра, которые вы хотите скопировать в раздел vendor_dlkm , перечислите их в BOARD_VENDOR_KERNEL_MODULES .
Если вы хотите переопределить содержимое файла modules.load , вы можете указать это в BOARD_VENDOR_KERNEL_MODULES_LOAD .
Во время сборки модули, перечисленные в BOARD_VENDOR_KERNEL_MODULES , устанавливаются в $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules . Создается символическая ссылка в /vendor/lib/modules , ведущая к /vendor_dlkm/lib/modules .
Аналогично, чтобы выбрать модули ядра, которые вы хотите скопировать в раздел odm_dlkm , перечислите их в BOARD_ODM_KERNEL_MODULES . Сборка платформы запускает depmod для этих модулей и копирует выходные файлы depmod в образ. Сборка создает файл modules.load и сохраняет его в образе. Этот файл содержит все модули, перечисленные в BOARD_ODM_KERNEL_MODULES .
Если вы хотите переопределить содержимое файла modules.load , вы можете указать это в BOARD_ODM_KERNEL_MODULES_LOAD .
Во время сборки модули, перечисленные в BOARD_ODM_KERNEL_MODULES устанавливаются в $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules . Создается символическая ссылка в /odm/lib/modules , ведущая к /odm_dlkm/lib/modules .
Для модулей ядра от поставщиков и ODM всегда используйте /vendor/lib/modules и /odm/lib/modules .
Никогда не используйте /vendor_dlkm/lib/modules. Устройства без раздела vendor_dlkm устанавливают BOARD_VENDOR_KERNEL_MODULES непосредственно в /vendor/lib/modules . Это проблематично, поскольку /vendor_dlkm/lib/modules не существует.
Никогда не используйте /odm_dlkm/lib/modules . Устройства без раздела odm_dlkm устанавливают BOARD_ODM_KERNEL_MODULES непосредственно в /odm/lib/modules . Это проблематично, поскольку /odm_dlkm/lib/modules не существует.
Монтаж перегородок и загрузка модулей
В процессе first_stage_init разделы vendor_dlkm и odm_dlkm монтируются в каталоги /vendor_dlkm и /odm_dlkm соответственно. После этого становятся доступны символические ссылки на /vendor/lib/modules и /odm/lib/modules .
Затем процесс стороннего разработчика (например, скрипт .rc ) может загрузить модули ядра в соответствии с порядком, указанным в modules.load . При необходимости процесс стороннего разработчика также может загрузить модули позже.
Соответствующая документация
Документацию по созданию загрузочного раздела поставщика (содержащего RAMDisk поставщика) см. в разделе «Поддержка модулей ядра» .