Um kernel de produto , também conhecido como kernel de dispositivo ou kernel OEM , é o kernel fornecido em seu dispositivo. Antes do GKI, o kernel do produto era derivado de uma série de alterações upstream no kernel. A Figura 1 mostra como as adições de kernel geram um kernel de produto (kernel OEM/dispositivo):
Figura 1. Construção do kernel do produto pré-GKI.
- O kernel Linux Long Term Supported (LTS) do kernel.org foi modificado com patches específicos do Android, resultando em um Android Common Kernel (ACK) .
- O ACK foi modificado por fornecedores que adicionaram suporte para seu System-on-a-Chip (SoC). Os fornecedores também podem adicionar otimizações de desempenho ou energia. O kernel resultante é chamado de kernel do fornecedor .
- Finalmente, o kernel do fornecedor foi modificado pelos OEMs com drivers de dispositivos adicionais e personalizações que eles consideraram necessários. O kernel resultante é chamado de kernel do produto .
Todas essas modificações podem resultar em até 50% do código do kernel sendo código fora da árvore e não de kernels Linux upstream ou ACKs. Antes do GKI, quase todos os dispositivos tinham um kernel personalizado que resultava na fragmentação do kernel.
Os custos da fragmentação
A fragmentação do kernel tem vários efeitos negativos na comunidade Android.
As atualizações de segurança exigem muito trabalho
Os patches de segurança citados no Android Security Bulletin (ASB) devem ser transferidos para 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 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. Nos 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 dos dispositivos, é difícil simplesmente mesclar as correções LTS nos kernels dos dispositivos.
Inibe atualizações de lançamento da plataforma Android
A fragmentação dificulta a adição de novos recursos do Android que exigem alterações no kernel 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 para o Linux upstream
Com todas as alterações feitas no kernel, a maioria dos dispositivos principais vem com uma versão do kernel que já tem pelo menos 18 meses. Por exemplo, o kernel 4.14 foi lançado pelo 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 da placa do kernel principal para módulos carregáveis do fornecedor. O GKI também apresenta uma Kernel Module Interface (KMI) estável para módulos de fornecedores, para que os módulos e o kernel possam ser atualizados de forma independente. 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
eandroid12-5.4
). - O kernel GKI é testado com todas as versões da plataforma Android compatíveis com o ACK associado. Não há descontinuação de recursos durante a vida útil de uma versão do kernel GKI.
- O kernel GKI expõe um KMI estável aos 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 Visão geral do kernel .
GKI é uma mudança complexa implementada em vários estágios, começando com os kernels v5.4 no lançamento da plataforma Android 11.
Existem atualmente 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 fornecidos com kernels 5.4, mesmo aqueles lançados com Android 12 ou Android 13.
- 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 nos testes do 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 no 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 do AOSP.
- Incluir 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 do 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 (a partir do Android 12). Imagens de inicialização assinadas estão disponíveis e são atualizadas regularmente com LTS e correções de bugs críticos. Como a estabilidade binária é mantida para o KMI, é possível instalar essas imagens de inicialização sem fazer alterações nas imagens do fornecedor. Os objetivos do GKI 2.0 incluem o seguinte:
- Não introduza regressões significativas de desempenho ou potência 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 2021 LTS).
- 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.