Kernels comuns do Android

Os kernels comuns do AOSP (também conhecidos como kernels comuns do Android ou ACKs) são posteriores aos kernels kernel.org e incluem patches de interesse para a comunidade Android que não foram mesclados com kernels principais ou com suporte de longo prazo (LTS). Esses patches podem incluir:

  • Backports e seleções de funcionalidades upstream necessárias para recursos do Android
  • Recursos prontos para dispositivos Android, mas ainda em desenvolvimento upstream
  • Recursos do fornecedor/OEM que são úteis para outros parceiros do ecossistema

android-mainline é a principal ramificação de desenvolvimento de recursos do Android. A linha principal do Linux é mesclada em android-mainline sempre que Linus Torvalds posta um candidato a versão ou lançamento. Antes de 2019, os kernels comuns do Android eram construídos clonando o kernel do LTS recentemente declarado e adicionando os patches específicos do Android. Esse processo mudou em 2019 para ramificar o novo kernel comum do Android de android-mainline. Esse novo modelo evita o esforço significativo para encaminhar portas e testar patches do Android ao atingir o mesmo resultado de forma incremental. android-mainline passa por testes contínuos significativos, esse modelo garante um kernel de alta qualidade desde o dia em que é publicado.

Quando um novo LTS é declarado de forma upstream, o kernel comum correspondente é ramificado de android-mainline. Isso permite que os parceiros iniciem um projeto antes da declaração da versão do LTS mesclando com android-mainline. Depois que a nova ramificação do kernel comum é criada, os parceiros podem alterar perfeitamente a origem da mesclagem para a nova ramificação.

Outras ramificações comuns do kernel recebem mesclagens regulares do kernel do LTS associado. Normalmente, essas mesclagens são feitas imediatamente após a publicação da versão do LTS. Por exemplo, quando o Linux 6.1.75 foi publicado, ele foi integrado ao kernel comum 6.1 (android14-6.1). É altamente recomendável que os parceiros atualizem os kernels para ficarem atualizados com as correções de bugs específicas do LTS e do Android.

Ramificação de kernel ACK KMI

Os kernels de GKI têm uma interface de módulo do kernel estável. O KMI é identificado exclusivamente pela versão do kernel e pela versão da plataforma Android. Portanto, as ramificações são chamadas de ANDROID_RELEASE-KERNEL_VERSION. Por exemplo, o kernel de GKI 6.1 para o Android 14 é chamado de android14-6.1. No Android 15 (AOSP experimental), o kernel de GKI android15-6.6 foi lançado.

Apresentar e lançar kernels

Antes do Android 15 (AOSP experimental), qualquer um dos três kernels mais recentes poderia ser usado para a inicialização do dispositivo. No Android 15 (AOSP experimental), as duas versões mais recentes do kernel podem ser usadas para a inicialização do dispositivo. Os kernels de lançamento do Android 15 (AOSP experimental) são android15-6.6 e android14-6.1.

Como os upgrades do kernel não são necessários ao atualizar a versão da plataforma, os kernels que não têm os recursos mais recentes para uma versão da plataforma ainda podem ser usados para iniciar dispositivos. Portanto, os kernels projetados para o Android 14, como android14-6.1, podem ser usados em dispositivos mesmo após fazer upgrade da versão da plataforma para o Android 15 (AOSP experimental).

Versão da plataforma Android Iniciar kernels Kernels de atributos
Android 15 (AOSP experimental) (2024) android15-6.6
android14-6.1
android15-6.6
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.101
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.101
android12-5.41
android11-5.41
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.41
android-4.19-stable
android12-5.10
android12-5.4
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

1 Outras restrições poderão ser aplicadas se o BSP associado tiver sido atualizado para a versão da plataforma. Em termos mais gerais, o número da versão do Android do kernel precisa ser maior ou igual à versão de destino do FCM. Consulte Objeto da interface do fornecedor: corresponder às ramificações do kernel para saber mais.

Hierarquia comum do kernel

Ramificação de android-mainline

O nível superior da hierarquia comum do kernel é mostrado na figura 1.

Como criar kernels comuns usando o kernel android-mainline

Figura 1. Como criar kernels comuns usando o kernel android-mainline

Observe que um novo kernel comum do Android android14-6.1 foi ramificado de android-mainline em 2022. Em 2023, quando o próximo LTS foi declarado, o android15-6.6 foi ramificado de android-mainline.

Como mostrado na Figura 1, cada versão pode ser a base para dois kernels de GKI. Por exemplo, os dois kernels v5.15 são android13-5.15 e android14-5.15, ambos de recursos para as respectivas versões de plataforma. Esse também aconteceu com a versão 5.10: android12-5.10 foi criado quando o LTS foi declarado e android13-5.10 foi ramificado de android12-5.10 no marco completo do recurso do kernel no segundo trimestre de 2021 para permitir o desenvolvimento de recursos para o Android 13. No Android 15 (AOSP experimental) (2024), há apenas um novo kernel de GKI por versão do kernel. Não há kernel android15-6.1.

Ciclo de vida da ramificação ACK KMI

O ciclo de vida de uma ramificação ACK KMI é mostrado abaixo na figura 2.

6.6 Ciclo de vida da ramificação KMI ACK

Figura 2. 6.6 Ciclo de vida da ramificação KMI ACK

Para esclarecer o processo de desenvolvimento e o ciclo de vida das ramificações, a Figura 2 se concentra nas ramificações ACK KMI da versão 6.6.

Cada ramificação ACK KMI passa por três fases indicadas na Figura 2 por cores diferentes em cada ramificação. Como mostrado, o LTS é integrado regularmente, independentemente da fase.

Fase de desenvolvimento

Quando criada, uma ramificação ACK KMI entra na fase de desenvolvimento (identificada como dev na Figura 2) e fica aberta para contribuições de recursos para a próxima versão da plataforma Android. Na Figura 2, o android15-6.6 foi criado quando a versão 6.6 foi declarada como o novo kernel de LTS upstream.

Fase de estabilização

Quando a ramificação ACK KMI é declarada como completa, ela entra na fase de estabilização (rotulada como estável na Figura 2). Recursos de parceiros e correções de bugs ainda são aceitos, mas o acompanhamento de KMI está ativado para detectar qualquer mudança que afete a interface. Nessa fase, as mudanças interruptivas de KMI são aceitas, e a definição de KMI é atualizada em uma cadência predefinida (normalmente a cada duas semanas). Consulte a visão geral de GKI para conferir detalhes sobre o monitoramento de KMI.

Fase congelada do KMI

Antes que uma nova versão da plataforma seja enviada para o AOSP, a ramificação ACK KMI está congelada e permanece congelada durante todo o ciclo de vida da ramificação. Isso significa que nenhuma mudança interruptiva de KMI é aceita, a menos que seja identificado um problema grave de segurança que não possa ser atenuado sem afetar o KMI estável. Para evitar falhas de KMI, alguns patches mesclados do LTS poderão ser modificados ou descartados se a correção não for necessária para dispositivos Android.

Quando uma ramificação ACK KMI é congelada, correções de bugs e recursos de parceiros podem ser aceitos, desde que o kernel comum do KMI existente não esteja corrompido. O KMI pode ser estendido com novos símbolos exportados, desde que as interfaces que compreendem o KMI atual não sejam afetadas. Quando novas interfaces são adicionadas ao KMI, elas se tornam imediatamente estáveis e não podem ser corrompidas por mudanças futuras.

Por exemplo, uma mudança que adicione um campo a uma estrutura usada por um kernel comum da interface KMI não é permitida porque ela muda a definição da interface:

struct foo {
  int original_field1;
  int original_field2;
  int new_field;  // Not allowed
};

int do_foo(struct foo &myarg)
{
  do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);

No entanto, não há problema em adicionar uma nova função:

struct foo2 {
  struct foo orig_foo;
  int new_field;
};

int do_foo2(struct foo2 &myarg)
{
  do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);

Durante o ciclo de vida do kernel de GKI, a compatibilidade com versões anteriores do espaço do usuário é mantida para que o kernel possa ser usado com segurança na plataforma Android com que o dispositivo foi iniciado. Os testes contínuos com versões anteriores garantem que a compatibilidade seja mantida. Portanto, na Figura 2, o kernel android15-6.6 pode ser usado para dispositivos Android 15 (AOSP experimental) e dispositivos mais recentes. Como a versão da plataforma Android também é compatível com versões anteriores, o kernel android14-6.1 pode ser usado em dispositivos Android 15 (AOSP experimental) para inicialização ou upgrade.

Número de geração do KMI

Se houver uma mesclagem de LTS durante a fase de estabilização, um problema de segurança ou outro evento que exija um patch de mudança de KMI para ser aceito, o número de geração de KMI registrado em build.config.common vai ser incrementado. A geração atual do KMI pode ser encontrada usando o comando uname:

$ uname -r
6.6.30-android15-6-g86d10b30f51f

O número após a versão da plataforma é a geração de KMI (6, neste caso).

Se a geração do KMI mudar, o kernel não será compatível com os módulos do fornecedor que estão em conformidade com a geração anterior do KMI. Portanto, os módulos precisam ser recriados e atualizados de forma síncrona com o kernel. Após o congelamento do KMI, as mudanças na geração do KMI serão muito raras.

Compatibilidade entre kernels

Os requisitos de compatibilidade entre kernels da mesma família de LTS estão mudando, começando com os novos kernels de GKI.

Kernels de GKI

Os kernels de GKI mantêm a compatibilidade com versões anteriores com todas as versões da plataforma Android que oferecem suporte à versão do kernel. Além disso, as versões da Plataforma Android são compatíveis com versões anteriores dos kernels de GKI de versões anteriores. Portanto, você pode usar com segurança o kernel android14-6.1 desenvolvido para o Android 14 (2023) em dispositivos com o Android 15 (AOSP experimental) (2024). A compatibilidade é verificada por meio de testes contínuos de VTS e CTS dos kernels de GKI com todas as versões com suporte.

O KMI é estável para que o kernel possa ser atualizado sem exigir uma recriação dos módulos do kernel na imagem do fornecedor.

A compatibilidade de KMI não é mantida entre diferentes kernels de GKI. Portanto, por exemplo, um kernel android14-6.1 não pode ser substituído por um android15-6.6 sem recriar todos os módulos.

Os kernels de GKI têm suporte apenas para as versões inicial e subsequente. Elas não são compatíveis com versões mais antigas. Portanto, um kernel android15-6.6 não tem suporte a devics que executam o Android 14 (2023).

Matriz de compatibilidade

Esta tabela mostra as versões do kernel com suporte e testada em cada versão da plataforma Android.

Versão da plataforma Android Kernels com suporte para upgrade Kernels com suporte para lançamento
Android 15 (AOSP experimental) (2024) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android15-6.6
android14-6.1
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

Ciclo de vida e patches de segurança

Os kernels comuns do Android serão aceitos até que o kernel de LTS associado ou a versão da Plataforma Android não seja mais compatível. Embora um kernel tenha suporte, ele continua recebendo mesclagens de LTS de upstream e correções de bugs para o código específico do Android. Essas correções incluem todos os patches de segurança do kernel citados nos Boletins de segurança do Android mensais que são relevantes para os kernels comuns do Android.

Os parceiros podem ter certeza de que, ao usar os kernels de GKI, vão receber todos os patches de segurança do kernel possíveis.

Teste comum do kernel

Os kernels comuns são testados com vários sistemas de CI, além de testes downstream feitos pelos fornecedores.

Teste funcional do kernel do Linux

Os testes de Teste funcional do kernel do Linux (LKFT, na sigla em inglês) iniciam vários conjuntos de testes, incluindo kselftest, LTP, VTS e CTS em um conjunto de dispositivos físicos arm32 e arm64. Os resultados de testes recentes estão disponíveis aqui.

Teste do KernelCI

Os testes de build e inicialização do KernelCI são iniciados sempre que um novo patch é confirmado em uma ramificação do kernel comum. Várias centenas de configurações de build são testadas e inicializadas em várias placas. Os resultados recentes dos kernels do Android podem ser encontrados neste link.

Testes de pré e pós-envio do Android

Os testes de pré-envio são usados para evitar que falhas sejam introduzidas nos kernels comuns do Android. O resumo do resultado do teste pode ser encontrado na guia "Verificações" da mudança de código no kernel comum do Android gerrit.

O teste pós-envio do Android é realizado em novos builds publicados nas ramificações comuns do kernel do Android quando novos patches são confirmados em uma ramificação do kernel comum do Android em ci.android.com. Ao inserir aosp_kernel como um nome de ramificação parcial em ci.android.com, você vai encontrar uma lista de ramificações do kernel com resultados disponíveis. Por exemplo, os resultados para android-mainline podem ser encontrados aqui. Ao clicar em um build específico, você vai encontrar o status do teste na guia Test Results.

Os testes definidos por test-mapping com o grupo de testes kernel-presubmit na árvore de origem da plataforma Android serão executados como pré-envio para as ramificações do kernel do Android. Por exemplo, seguir a configuração em test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING vai ativar o vts_kernel_proc_file_api_test como um teste de presbunção no check-in do código comum do kernel do Android.

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

Teste de 0 dia

O teste de dia 0 realiza testes patch a patch em todas as ramificações comuns do kernel do Android quando novos patches são confirmados. Vários testes de inicialização, funcionais e de desempenho são executados. Participe do grupo público cros-kernel-buildreports

Matriz de teste

Kernel comum do Android Lançamentos da Plataforma Android Pacotes de teste
Principal 15 14 13 12 11 10 LKFT CI do kernel Pré-envio Pós envio dia 0
android-mainline
android5-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable

Contribuir com os kernels comuns do Android

Geralmente, o desenvolvimento de recursos precisa ser feito no Linux principal e não em kernels comuns do Android. O desenvolvimento upstream é altamente recomendado e, depois que o desenvolvimento é aceito lá, ele pode ser facilmente backport para a ramificação ACK específica, conforme necessário. A Equipe do kernel do Android tem o prazer de oferecer suporte a esforços de upstreaming para beneficiar o ecossistema do Android.

Envie patches para o Gerrit e siga estas diretrizes de contribuição (links em inglês).