O projeto Generic Kernel Image (GKI)

Um kernel de produto , também conhecido como kernel de dispositivo ou kernel OEM , é o kernel que você envia em seu dispositivo. Antes do GKI, o kernel do produto era derivado de uma série de alterações upstream do kernel. A Figura 1 mostra como as adições de kernel produzem um kernel de produto (OEM/kernel do dispositivo):

Construção do kernel do produto pré-GKI

Figura 1. Construção do kernel do produto pré-GKI.

  1. O kernel Linux Long Term Supported (LTS) de kernel.org foi modificado com patches específicos do Android, resultando em um Android Common Kernel (ACK) .
  2. 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 .
  3. Por fim, o kernel do fornecedor foi modificado ainda mais pelos OEMs com drivers de dispositivo adicionais e personalizações que eles consideraram necessárias. 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 ou ACKs upstream do Linux. 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 são trabalhosas

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 no 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 os lançamentos 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á foram corrigidos para dispositivos que se mantêm 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 as atualizações de lançamento da plataforma Android

A fragmentação dificulta a adição de novos recursos do Android que exigem mudanças 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 oferece suporte aos 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 upstream do Linux

Com todas as alterações feitas no kernel, a maioria dos principais dispositivos vem com uma versão do kernel com pelo menos 18 meses de idade. 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 do kernel genérico

O projeto Generic Kernel Image (GKI) aborda a fragmentação do kernel unificando o núcleo do kernel e movendo o SoC e o suporte da placa do núcleo do kernel para os módulos carregáveis ​​do fornecedor. O GKI também apresenta uma Kernel Module Interface (KMI) estável para módulos de fornecedores, de modo 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 recurso durante o tempo de vida de uma versão do kernel GKI.
  • O kernel GKI expõe um KMI estável aos drivers em um determinado LTS.
  • O kernel GKI não contém código específico de SoC ou de placa.

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

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

Atualmente, existem dois estágios 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 no teste GKI (Android 11 e versões posteriores da plataforma). Os objetivos 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 os kernels comuns AOSP.
  • Inclua as principais alterações do Android em kernels para atualização e lançamento de dispositivos com novos lançamentos do Android.
  • Não quebre o espaço de usuário do Android.
  • Separe componentes específicos de hardware do núcleo do kernel 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 o 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 atualizadas regularmente com LTS e correções de bugs críticos. 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. Os objetivos 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, de 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.

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.

,

Um kernel de produto , também conhecido como kernel de dispositivo ou kernel OEM , é o kernel que você envia em seu dispositivo. Antes do GKI, o kernel do produto era derivado de uma série de alterações upstream do kernel. A Figura 1 mostra como as adições de kernel produzem um kernel de produto (OEM/kernel do dispositivo):

Construção do kernel do produto pré-GKI

Figura 1. Construção do kernel do produto pré-GKI.

  1. O kernel Linux Long Term Supported (LTS) de kernel.org foi modificado com patches específicos do Android, resultando em um Android Common Kernel (ACK) .
  2. 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 .
  3. Por fim, o kernel do fornecedor foi modificado ainda mais pelos OEMs com drivers de dispositivo adicionais e personalizações que eles consideraram necessárias. 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 ou ACKs upstream do Linux. 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 são trabalhosas

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 no 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 os lançamentos 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á foram corrigidos para dispositivos que se mantêm 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 as atualizações de lançamento da plataforma Android

A fragmentação dificulta a adição de novos recursos do Android que exigem mudanças 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 oferece suporte aos 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 upstream do Linux

Com todas as alterações feitas no kernel, a maioria dos principais dispositivos vem com uma versão do kernel com pelo menos 18 meses de idade. 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 do kernel genérico

O projeto Generic Kernel Image (GKI) aborda a fragmentação do kernel unificando o núcleo do kernel e movendo o SoC e o suporte da placa do núcleo do kernel para os módulos carregáveis ​​do fornecedor. O GKI também apresenta uma Kernel Module Interface (KMI) estável para módulos de fornecedores, de modo 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 recurso durante o tempo de vida de uma versão do kernel GKI.
  • O kernel GKI expõe um KMI estável aos drivers em um determinado LTS.
  • O kernel GKI não contém código específico de SoC ou de placa.

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

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

Atualmente, existem dois estágios 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 no teste GKI (Android 11 e versões posteriores da plataforma). Os objetivos 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 os kernels comuns AOSP.
  • Inclua as principais alterações do Android em kernels para atualização e lançamento de dispositivos com novos lançamentos do Android.
  • Não quebre o espaço de usuário do Android.
  • Separe componentes específicos de hardware do núcleo do kernel 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 o 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 atualizadas regularmente com LTS e correções de bugs críticos. 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. Os objetivos 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, de 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.

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.