O projeto Generic Kernel Image (GKI)

Os kernels comuns do Android (ACKs) são a base para todos os kernels de produtos Android. Os kernels do fornecedor e do dispositivo estão a jusante dos ACKs. Os fornecedores adicionam suporte para SoCs e dispositivos periféricos modificando o código-fonte do kernel e adicionando drivers de dispositivo. Essas modificações podem ser extensas a ponto de até 50% do código em execução em um dispositivo ser código fora da árvore e não do Linux upstream ou de kernels comuns AOSP.

Assim, um kernel de dispositivo é composto por:

  • Upstream: O kernel Linux de kernel.org
  • AOSP: patches adicionais específicos do Android de kernels comuns do AOSP
  • Fornecedor: ativação de SoC e periféricos e patches de otimização de fornecedores
  • OEM/dispositivo: drivers de dispositivo adicionais e personalizações

Quase todos os dispositivos têm um kernel personalizado. Esta é a fragmentação do kernel.

Hierarquia do kernel do Android leva à fragmentação

Figura 1. A hierarquia do kernel do Android leva à fragmentação

Os custos da fragmentação

A fragmentação do kernel tem vários efeitos negativos na comunidade Android.

As atualizações de segurança são trabalhosas

Os patches de segurança citados no Android Security Bulletin (ASB) devem ser retroportados em cada um dos kernels do dispositivo. No entanto, devido à fragmentação do kernel, é proibitivamente caro propagar correções de segurança para dispositivos Android em campo.

Difícil de mesclar atualizações com suporte de longo prazo

As versões com suporte de longo prazo (LTS) incluem correções de segurança e outras correções de bugs críticos. Manter-se atualizado com as versões LTS provou ser a maneira mais eficaz de fornecer correções de segurança. Em dispositivos Pixel, descobriu-se que 90% dos problemas de segurança do kernel relatados no ASB já haviam sido corrigidos para dispositivos que permanecem atualizados.

No entanto, com todas as modificações personalizadas nos kernels do dispositivo, é difícil apenas mesclar as correções LTS nos kernels do dispositivo.

Inibe atualizações de versão da plataforma Android

A fragmentação dificulta a adição de novos recursos do Android que exigem que alterações de kernel sejam adicionadas aos dispositivos em campo. O código do Android Framework deve assumir que até cinco versões de kernel são suportadas e que nenhuma alteração de kernel foi feita para a nova versão da plataforma (o Android 10 suporta kernels 3.18, 4.4, 4.9, 4.14 e 4.19, que em alguns casos não foram aprimorado com novos recursos desde o Android 8 em 2017).

Difícil contribuir com alterações do kernel de volta ao Linux upstream

Com todas as mudanças sendo feitas no kernel, a maioria dos principais dispositivos vem com uma versão do kernel que já tem pelo menos 18 meses. Por exemplo, o kernel 4.14 foi lançado pela kernel.org em novembro de 2017 e os primeiros telefones Android usando kernels 4.14 foram lançados na primavera de 2019.

Esse longo atraso entre o lançamento do kernel upstream e os produtos torna difícil para a comunidade Android alimentar os recursos e drivers necessários nos kernels upstream.

Corrigindo a fragmentação: imagem genérica do kernel

O projeto Generic Kernel Image (GKI) aborda a fragmentação do kernel unificando o kernel principal e movendo o SoC e o suporte de placa do kernel principal para módulos carregáveis ​​do fornecedor. O GKI também apresenta uma interface de módulo de kernel (KMI) estável para módulos de fornecedores, para que os módulos e o kernel possam ser atualizados independentemente. Algumas características do kernel GKI são:

  • O kernel GKI é construído a partir das fontes ACK.
  • O kernel GKI é um binário de kernel único mais módulos carregáveis ​​associados por arquitetura, por versão LTS (atualmente apenas arm64 para android11-5.4 e android12-5.4 ).
  • O kernel GKI é testado com todas as versões da plataforma Android compatíveis com o ACK associado. Não há depreciação de recursos durante a vida útil de uma versão do kernel GKI.
  • O kernel GKI expõe um KMI estável para drivers dentro de um determinado LTS.
  • O kernel GKI não contém código específico do SoC ou da placa.

Para obter uma imagem da arquitetura GKI, consulte a visão geral do Kernel .

O GKI é uma mudança complexa que foi implementada em vários estágios, começando com os kernels v5.4 na versão da plataforma Android 11.

Atualmente, existem dois estágios do GKI:

  • O GKI 1.0 foi introduzido no Android 11 para dispositivos com kernels 5.4. O GKI 1.0 se aplica a todos os dispositivos enviados com kernels 5.4, mesmo aqueles lançados com Android 12 ou Android T (AOSP experimental).
  • O GKI 2.0 foi introduzido no Android 12 para dispositivos com kernels 5.10 e é o novo padrão para todos os dispositivos fornecidos com kernels 5.10 ou posteriores.

GKI 1.0

No GKI 1.0, os dispositivos iniciados com a versão 5.4 do kernel devem passar no teste GKI (Android 11 e versões de plataforma posteriores). As metas do GKI 1.0 incluem o seguinte:

  • Evite regressões no Vendor Test Suite (VTS) ou Compatibility Test Suite (CTS) ao substituir o kernel do produto pelo kernel GKI.
  • Reduza a carga do parceiro de manter seu kernel atualizado com kernels comuns AOSP.
  • Inclua as principais alterações do Android nos kernels para atualização e lançamento de dispositivos com novas versões do Android.
  • Não quebre o espaço de usuário do Android.
  • Separe os componentes específicos de hardware do kernel principal como módulos carregáveis.

Para obter a documentação do GKI 1.0, consulte a seção GKI 1.0 .

GKI 2.0

No GKI 2.0, os dispositivos iniciados com kernel versão 5.10 ou superior devem ser fornecidos com o kernel GKI (começando com o Android 12). As imagens de inicialização assinadas estão disponíveis e atualizadas regularmente com LTS e correções críticas de bugs. Como a estabilidade binária é mantida para o KMI, você pode instalar essas imagens de inicialização sem fazer alterações nas imagens do fornecedor. As metas do GKI 2.0 incluem o seguinte:

  • Não introduza regressões significativas de desempenho ou energia ao substituir o kernel do produto pelo kernel GKI.
  • Permita que os parceiros forneçam correções de segurança do kernel e correções de bugs sem o envolvimento do fornecedor.
  • Reduza o custo de atualização da versão principal do kernel para dispositivos (por exemplo, da v5.10 para o kernel LTS 2021).
  • Mantenha um único binário de kernel GKI por arquitetura atualizando as versões do kernel com um processo claro de atualização.

GKI 2.0 representa o estado mais atual dos kernels do Android. A documentação do kernel fora das subseções GKI 1.0 e kernels anteriores (<=4.19) refletem a arquitetura GKI 2.0.