Поддерживать стабильный интерфейс модуля ядра

Крайне важно поддерживать стабильный интерфейс модулей ядра (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 не поддерживается.
  • Для сборки ядра и модулей используется только конкретный набор инструментов 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».