Крайне важно поддерживать стабильный интерфейс модулей ядра (KMI) для модулей сторонних производителей. Ядро GKI собирается и поставляется в бинарном виде, а модули, загружаемые сторонними производителями, собираются в отдельном дереве. В результате ядро GKI и модули сторонних производителей должны работать так, как если бы они были собраны вместе.
В целом, сообщество Linux неодобрительно относится к идее стабильности ABI в ядре основной ветки. В условиях различных наборов инструментов, конфигураций и постоянно развивающегося ядра Linux поддержание стабильного KMI в основной ветке не представляется возможным. Однако в условиях сильно ограниченной среды GKI это возможно при следующих ограничениях:
Для сборки ядра можно использовать только один параметр конфигурации —
gki_defconfig.KMI стабильно работает только в рамках одной и той же версии ядра LTS и Android, например,
android14-6.1,android15-6.6илиandroid16-6.12.- Для
android-mainlineстабильность KMI не поддерживается.
- Для
Для сборки ядра и модулей используется только тот набор инструментов Clang, который входит в состав AOSP и определен для соответствующей ветки.
Для проверки стабильности и в качестве символов KMI отслеживаются только символы, используемые модулями в соответствии с указанным списком символов.
- Из этого следует, что модули поставщика должны использовать только символы KMI. Это ограничение обеспечивается при неудачной загрузке модулей, если требуются символы, отличные от KMI.
После заморозки ветки KMI изменения разрешены, но не могут нарушить работу KMI. К таким изменениям относятся следующие:
- Изменения конфигурации
- Изменения в коде ядра
- Изменения в наборе инструментов (включая обновления)
Используйте герметичный процесс сборки и набор инструментов LLVM.
Герметичный процесс сборки обеспечивает стабильность KMI за счет того, что манифесты repo в kernel/manifest полностью описывают среду сборки. Например, манифест для android16-6.12 включает в себя цепочку инструментов, систему сборки и все остальное, необходимое для сборки ядра Generic Kernel Image (GKI). Конфигурация сборки, в первую очередь BUILD.bazel , гарантирует правильное использование включенных инструментов для получения согласованных результатов сборки.
Использование герметичного процесса сборки также гарантирует согласованность описания ABI для дерева независимо от того, сгенерировано ли оно Google (например, gki/aarch64/abi.stg для android16-6.12 ) или в локальном дереве, включающем модули поставщика. Инструменты для создания и сравнения описания ABI для интерфейса модулей ядра (KMI) также предоставляются в рамках репозитория, описанного в манифесте.
Инструментарий, используемый для сборки ядра GKI, должен быть полностью совместим с инструментарием, используемым для сборки модулей сторонних производителей. Начиная с Android 10, все ядра Android должны быть собраны с использованием инструментария LLVM. В случае с GKI инструментарий LLVM, используемый для сборки ядер продуктов и модулей сторонних производителей, должен генерировать тот же ABI, что и инструментарий LLVM из AOSP, и партнеры должны обеспечить совместимость KMI с ядром GKI. Настоятельно рекомендуется использовать предоставленные инструменты сборки, поскольку они обеспечивают наилучшую совместимость.
Что дальше?
Инструкции по сборке ядра с использованием герметичного процесса сборки и инструментария LLVM см. в разделе «Сборка ядер» .
Инструкции по мониторингу ABI и устранению неполадок см. в разделе «Мониторинг ABI ядра Android».