Um kernel do produto, também conhecido como kernel do dispositivo ou kernel OEM, é o kernel que você envia no dispositivo. Antes do GKI, o kernel do produto era derivado de uma série de mudanças upstream do kernel. A Figura 1 mostra como as adições do kernel geram um kernel de produto (kernel OEM/do dispositivo):
Figura 1. Construção do kernel do produto antes do GKI.
- O kernel Linux Long Term Supported (LTS) do kernel.org foi modificado com patches específicos do Android, resultando em um kernel comum do Android (ACK).
- O ACK foi modificado por fornecedores que adicionaram suporte ao system-on-a-chip (SoC). Os fornecedores também podem adicionar otimizações de desempenho ou de energia. O kernel resultante é chamado de kernel do fornecedor.
- Por fim, o kernel do fornecedor foi modificado por OEMs com outros drivers de dispositivo e personalizações que eles consideravam 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 fora da árvore e não de kernels do Linux ou ACKs upstream. Antes do GKI, quase todos os dispositivos tinham um kernel personalizado que resultava na fragmentação do kernel.
Custos da fragmentação
A fragmentação do kernel tem vários efeitos negativos na comunidade do 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 repassados para cada um dos kernels do dispositivo. No entanto, devido à fragmentação do kernel, é extremamente caro propagar correções de segurança para os dispositivos Android em campo.
Dificuldade em combinar atualizações com suporte de longo prazo
As versões Long Term Support (LTS) incluem correções de segurança e outras correções de bugs críticas. Manter-se atualizado com as versões do 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 relatados no ASB já foram corrigidos para dispositivos atualizados.
No entanto, com todas as modificações personalizadas nos kernels do dispositivo, é difícil mesclar as correções do LTS nos kernels do dispositivo.
Inibir upgrades de versão da plataforma Android
A fragmentação dificulta a adição de novos recursos do Android que exigem a adição de mudanças de kernel aos dispositivos em campo. O código do Android Framework precisa presumir que até cinco versões do kernel têm suporte e que nenhuma mudança no kernel foi feita para a nova versão da plataforma. O Android 10 oferece suporte aos kernels 3.18, 4.4, 4.9, 4.14 e 4.19, que, em alguns casos, não foram aprimorados com novos recursos desde o Android 8, em 2017.
Dificuldade em contribuir com alterações do kernel de volta para o Linux upstream
Com todas as mudanças sendo feitas no kernel, a maioria dos dispositivos principais é fornecida
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 smartphones Android com kernels 4.14 foram lançados no segundo trimestre de 2019.
Esse longo atraso entre o lançamento do kernel upstream e os produtos dificulta que a comunidade do Android alimente os recursos e drivers necessários nos kernels upstream.
Corrigir a fragmentação: imagem genérica do kernel
O projeto Generic Kernel Image (GKI) aborda a fragmentação do kernel ao unir o kernel principal e mover o SoC e o suporte de placa do kernel principal para módulos de fornecedores carregáveis. A GKI também apresenta uma interface estável do módulo do kernel (KMI, na sigla em inglês) para módulos de fornecedores. Assim, os módulos e o kernel podem ser atualizados de forma independente. Algumas características do kernel do GKI são:
- O kernel do GKI é criado a partir das fontes do 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 do GKI é testado com todas as versões da plataforma Android que têm suporte para o ACK associado. Não há descontinuação de recursos para a vida útil de uma versão do kernel do GKI.
- O kernel do GKI expõe um KMI estável aos drivers em um determinado LTS.
- O kernel do GKI não contém código específico do SoC ou da placa.
Para conferir uma imagem da arquitetura do GKI, consulte a Visão geral do kernel.
A GKI é uma mudança complexa que foi lançada em várias etapas, começando com os kernels da v5.4 na versão da plataforma Android 11.
Há duas etapas da GKI:
- A GKI 1.0 foi introduzida no Android 11 para dispositivos com kernels 5.4. A GKI 1.0 se aplica a todos os dispositivos com kernels 5.4, mesmo aos lançados com o Android 12 ou o 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 que são enviados com kernels 5.10 ou mais recentes.
GKI 1.0
Na GKI 1.0, os dispositivos lançados com a versão 5.4 do kernel precisam passar no teste da GKI (versões da plataforma Android 11 e mais recentes). As metas da GKI 1.0 incluem:
- Evite regressões no Conjunto de teste de fornecedor (VTS, na sigla em inglês) ou Conjunto de teste de compatibilidade (CTS, na sigla em inglês) ao substituir o kernel do produto pelo kernel do GKI.
- Reduza a carga do parceiro de manter o kernel atualizado com os kernels comuns do AOSP.
- Incluir mudanças principais do Android nos kernels para dispositivos que estão sendo atualizados e lançados com novas versões do Android.
- Não prejudique o espaço do usuário do Android.
- Separar componentes específicos do hardware do kernel principal como módulos carregáveis.
Para conferir a documentação do GKI 1.0, consulte a seção do GKI 1.0.
GKI 2.0
Na GKI 2.0, os dispositivos lançados com a versão 5.10 ou mais recente do kernel precisam ter o kernel de GKI (a partir do Android 12). As imagens de inicialização assinhadas 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 mudanças nas imagens do fornecedor. As metas da 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 do 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 do LTS de 2021).
- Mantenha um único binário de kernel de GKI por arquitetura atualizando as versões do kernel com um processo claro de upgrade.
O GKI 2.0 representa o estado mais atual dos kernels do Android. A documentação do kernel fora das seções GKI 1.0 e Kernels anteriores (<=4.19) refletem a arquitetura da GKI 2.0.