Крайне важно поддерживать стабильный интерфейс модулей ядра (KMI) для модулей поставщиков. Ядро GKI собирается и поставляется в двоичном формате, а загружаемые поставщиком модули собираются в отдельном дереве. Полученное ядро GKI и модули поставщиков должны работать так, как будто они были собраны вместе.
В целом, сообщество Linux неодобрительно отнеслось к идее стабильности ABI в основной ветке ядра . Учитывая разнообразие инструментальных цепочек, конфигураций и постоянно развивающееся ядро основной ветки Linux, поддерживать стабильный KMI в основной ветке нецелесообразно. Однако поддерживать стабильный KMI в среде GKI с высокой степенью ограничений возможно, учитывая следующие:
Для сборки ядра можно использовать только одну конфигурацию —
gki_defconfig
.KMI стабилен только в пределах одной и той же версии ядра LTS и Android, например
android14-6.1
,android15-6.6
илиandroid16-6.12
.- Стабильность KMI для
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».