Esta página descreve o projeto de imagem de kernel genérico (GKI, na sigla em inglês) e como ele aumenta a estabilidade do Android e melhora a segurança.
Histórico
Todo dispositivo Android precisa de um kernel de produção. Antes da GKI, os kernels eram personalizados e baseados no kernel comum do Android (ACK), com mudanças específicas do dispositivo feitas por fornecedores de system on chip (SoC) e OEMs.
Essa personalização pode resultar em até 50% do código do kernel ser código fora da árvore e não de kernels Linux upstream ou ACKs. Assim, a natureza personalizada dos kernels pré-GKI resultou em uma fragmentação significativa do kernel.
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 Boletim de segurança do Android (ASB, na sigla em inglês) precisam ser portados para cada um dos kernels do dispositivo. No entanto, devido à fragmentação do kernel, é muito caro propagar correções de segurança para dispositivos Android em campo.
Difícil de mesclar atualizações de suporte de longo prazo
As versões Long-Term Supported (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, foi descoberto que 90% dos problemas de segurança do kernel informados 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 do LTS nos kernels do dispositivo.
Inibir upgrades de versões da plataforma Android
A fragmentação dificulta a adição de novos recursos do Android que exigem mudanças no kernel aos dispositivos em uso. O código do framework do Android precisava considerar as diferentes variações de kernel e não podia depender da implementação de novos recursos do Android no kernel. Isso diminuiu a inovação e aumentou o tamanho e a complexidade do código.
É difícil contribuir com mudanças no kernel para o Linux upstream
A maneira fragmentada de extrair patches para os kernels de produção causou um atraso de até 18 meses desde o momento em que uma versão do LTS estava disponível upstream até o momento em que ela estava em um dispositivo. Esse longo atraso entre o lançamento do kernel upstream e os produtos dificulta que a comunidade Android alimente os recursos e drivers necessários nos kernels upstream. Quando um usuário enviava sugestões de melhorias, a base de código já tinha mudado, o que dificultava mostrar a relevância do patch.
Corrigir a fragmentação: imagem genérica do kernel
O projeto Generic Kernel Image (GKI) aborda a fragmentação do kernel ao unificar o kernel principal e mover 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 do kernel (KMI) estável para módulos de fornecedores. Assim, os módulos e o kernel podem ser atualizados de forma independente. Algumas características do kernel GKI:
- O kernel da GKI é criado com base nas fontes do ACK.
- O kernel GKI é um único binário de kernel mais módulos carregáveis associados por arquitetura, por versão LTS.
- O kernel da GKI é testado com todas as versões da plataforma Android compatíveis com o ACK associado. Não há descontinuação de recursos durante o ciclo de vida de uma versão do kernel GKI.
- O kernel GKI expõe uma KMI estável aos drivers em um determinado LTS.
- O kernel GKI não contém código específico do SoC ou da placa.
Para uma imagem da arquitetura do GKI, consulte a Visão geral do kernel.
Imagem comum
A partir do Android 12, os dispositivos enviados com a versão 5.10 ou mais recente do kernel precisam ser enviados com o kernel GKI. Os builds de lançamento da imagem genérica do kernel (GKI) são atualizados regularmente com LTS e correções de bugs críticos. Como a estabilidade binária é mantida para a KMI, é possível instalar essas imagens de inicialização sem fazer mudanças nas imagens do fornecedor. O projeto GKI tem estas metas:
- Não introduza regressões significativas de desempenho ou energia ao substituir o kernel do produto pelo kernel GKI.
- Permitir que os parceiros ofereçam correções de segurança e de bugs do kernel sem envolvimento do fornecedor.
- Reduzir o custo de atualização da versão principal do kernel para dispositivos.
- Mantenha um único binário do kernel GKI por arquitetura atualizando as versões do kernel com um processo claro de upgrade.