Manter uma interface estável do módulo do kernel

É fundamental manter uma interface de módulo de kernel (KMI) estável para módulos do fornecedor. O kernel da GKI é criado e enviado em formato binário, e os módulos carregáveis pelo fornecedor são criados em uma árvore separada. O kernel e os módulos do fornecedor do GKI resultantes precisam funcionar como se tivessem sido criados juntos.

Em geral, a comunidade Linux não aceita a noção de estabilidade da ABI no kernel para o kernel principal. Diante de diferentes toolchains, configurações e um kernel principal do Linux em constante evolução, não é viável manter uma KMI estável no módulo principal. No entanto, é possível manter um KMI estável no ambiente GKI altamente restrito com estas restrições:

  • Apenas uma configuração, gki_defconfig, pode ser usada para criar o kernel.

  • A KMI só é estável na mesma versão LTS e do Android de um kernel, como android14-6.1, android15-6.6 ou android16-6.12.

    • Nenhuma estabilidade de KMI é mantida para android-mainline.
  • Somente a cadeia de ferramentas Clang específica fornecida no AOSP e definida para a ramificação correspondente é usada para criar o kernel e os módulos.

  • Somente os símbolos conhecidos por serem usados por módulos, conforme especificado em uma lista de símbolos, são monitorados para estabilidade e considerados símbolos da KMI.

    • O corolário é que os módulos do fornecedor precisam usar apenas símbolos KMI. Essa restrição é aplicada ao falhar no carregamento de módulos se símbolos não KMI forem necessários.
  • Depois que a ramificação do KMI é congelada, as mudanças são permitidas, mas não podem interromper o KMI. Essas mudanças incluem o seguinte:

    • Mudanças de configuração
    • Mudanças no código do kernel
    • Mudanças no conjunto de ferramentas (incluindo atualizações)

Usar o processo de build hermético e o conjunto de ferramentas LLVM

O processo de build hermético garante um KMI estável porque os manifestos repo em kernel/manifest descrevem completamente o ambiente de build. Por exemplo, o manifesto para android16-6.12 inclui o conjunto de ferramentas, o sistema de build e tudo mais necessário para criar o kernel de imagem genérica do kernel (GKI). A configuração de build, principalmente BUILD.bazel, garante que as ferramentas incluídas sejam usadas corretamente para gerar resultados de build consistentes.

Usar um processo de build hermético também garante que a descrição da ABI para a árvore seja consistente, seja gerada pelo Google (por exemplo, gki/aarch64/abi.stg para android16-6.12) ou em uma árvore local que inclua os módulos do fornecedor. As ferramentas para criar e comparar a descrição da ABI da interface do módulo do kernel (KMI) também são fornecidas como parte do repositório descrito pelo manifesto.

A cadeia de ferramentas usada para criar o kernel GKI precisa ser totalmente compatível com a cadeia de ferramentas usada para criar módulos do fornecedor. A partir do Android 10, todos os kernels do Android precisam ser criados com uma cadeia de ferramentas LLVM. Com o GKI, a cadeia de ferramentas LLVM usada para criar kernels de produtos e módulos de fornecedores precisa gerar a mesma ABI que a cadeia de ferramentas LLVM do AOSP, e os parceiros precisam garantir que a KMI seja compatível com o kernel do GKI. É altamente recomendável usar as ferramentas de build fornecidas, já que elas oferecem a melhor compatibilidade.

Quais são as próximas etapas?