Kernels comuns do Android

Os kernels comuns do AOSP (também conhecidos como kernels comuns do Android ou ACKs) são downstream dos kernels do kernel.org e incluem patches de interesse para a comunidade do Android que não foram mesclados em kernels principais ou de suporte de longo prazo (LTS, na sigla em inglês). 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 para recursos do Android. A linha principal do Linux é mesclada em android-mainline sempre que Linus Torvalds posta uma versão ou candidato a versão. Antes de 2019, os kernels comuns do Android eram criados clonando o kernel LTS declarado recentemente e adicionando os patches específicos do Android. Esse processo mudou em 2019 para ramificar o novo kernel comum do Android a partir de android-mainline. Esse novo modelo evita o esforço significativo para encaminhar e testar patches do Android, alcançando o mesmo resultado de forma incremental. O 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 upstream, o kernel comum correspondente é ramificado a partir de android-mainline. Isso permite que os parceiros iniciem um projeto antes da declaração da versão LTS, mesclando a partir de android-mainline. Depois que a nova ramificação do kernel comum é criada, os parceiros podem mudar a origem da mesclagem para a nova ramificação.

Outras ramificações comuns do kernel recebem mesclagens regulares do kernel 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 mesclado ao kernel comum 6.1 (android14-6.1). Recomendamos que os parceiros atualizem os kernels para ficarem atualizados com o LTS e correções de bugs específicos do Android.

Ramificação do kernel do ACK KMI

Os kernels do GKI têm uma interface estável de módulo de kernel. O KMI é identificado de forma exclusiva pela versão do kernel e pela versão da plataforma Android. Portanto, as filiais são nomeadas ANDROID_RELEASE-KERNEL_VERSION. Por exemplo, o kernel GKI 6.1 para o Android 14 é chamado de android14-6.1. No Android 15, o kernel de GKI android15-6.6 foi lançado.

Kernels de recurso e de inicialização

Antes do Android 15, qualquer um dos três kernels mais recentes poderia ser usado para a inicialização do dispositivo. A partir do Android 15, as duas versões mais recentes do kernel podem ser usadas para inicialização do dispositivo. Os kernels de inicialização do Android 15 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 criados para o Android 14, como o android14-6.1, podem ser usados em dispositivos mesmo após o upgrade da versão da plataforma para o Android 15.

Versão da plataforma Android Iniciar kernels Kernels de recursos
Android 15 (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.10
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
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 de interface do fornecedor: correspondência de ramos do kernel para mais detalhes.

Hierarquia de kernel comum

Ramificação do android-mainline

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

Como criar kernels comuns usando o kernel android-mainline

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

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, 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 da v5.15 são android13-5.15 e android14-5.15, ambos são kernels de recursos para as respectivas versões da plataforma. Isso também foi o caso da 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 de conclusão do recurso do kernel na primavera de 2021 para permitir o desenvolvimento de recursos para o Android 13. A partir do Android 15 (2024), há apenas um novo kernel 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 de KMI do ACK é mostrado abaixo na Figura 2.

6.6 Ciclo de vida da ramificação da ACK KMI

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

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 da KMI do ACK passa por três fases indicadas na Figura 2 por cores diferentes em cada ramificação. Como mostrado, o LTS é mesclado regularmente, independentemente da fase.

Fase de desenvolvimento

Quando é criado, uma ramificação de KMI do ACK 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, android15-6.6 foi criado quando o 6.6 foi declarado como o novo kernel LTS upstream.

Fase de estabilização

Quando a ramificação KMI do ACK é declarada como recurso concluído, 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 que quebram o KMI são aceitas e a definição do 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 da 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 que quebre o KMI é aceita, a menos que um problema de segurança grave seja identificado que não possa ser mitigado sem afetar o KMI estável. Para evitar falhas no KMI, alguns patches mesclados do LTS podem ser modificados ou descartados se a correção não for necessária para dispositivos Android.

Quando uma ramificação do KMI do ACK é congelada, correções de bugs e recursos do parceiro podem ser aceitos, desde que o kernel comum do KMI não esteja corrompido. O KMI pode ser estendido com novos símbolos exportados, desde que as interfaces que compõem 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 interrompidas por mudanças futuras.

Por exemplo, uma mudança que adiciona um campo a uma estrutura usada por um kernel comum de interface do KMI não é permitida porque 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, a adição de uma nova função é aceitável:

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

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

Durante a vida útil do kernel do GKI, a compatibilidade com o espaço do usuário é mantida para que o kernel possa ser usado com segurança para a versão da plataforma Android com que o dispositivo foi lançado. O teste contínuo com versões anteriores garante a manutenção da compatibilidade. Na Figura 2, o kernel android15-6.6 pode ser usado para dispositivos Android 15 e 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 para dispositivos Android 15 para lançamento ou atualização.

Número de geração do KMI

Se houver uma mesclagem de LTS durante a fase de estabilização ou um problema de segurança ou outro evento após isso que exija a aceitação de um patch de mudança de KMI, o número de geração de KMI registrado em build.config.common será incrementado. A geração atual de 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 do 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 na mesma família LTS estão mudando, começando pelos novos kernels do GKI.

Kernels de GKI

Os kernels da GKI mantêm a compatibilidade com versões anteriores de todas as plataformas do 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 do kernel GKI. Assim, é possível usar com segurança o kernel android14-6.1 desenvolvido para o Android 14 (2023) em dispositivos com o Android 15 (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 do KMI não é mantida entre diferentes kernels do 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 do GKI têm suporte apenas para as versões iniciais e subsequentes. Elas não são compatíveis com versões mais antigas. Portanto, um kernel android15-6.6 não oferece suporte a dispositivos com o Android 14 (2023).

Matriz de compatibilidade

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

Versão da plataforma Android Kernels com suporte para upgrade Kernels com suporte para inicialização
Android 15 (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

Suporte a tempos de vida e patches de segurança

Os ACKs recebem mesclagens de LTS do upstream e correções de bugs para 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 a ACK.

Os ACKs podem ter suporte por mais tempo do que o kernel estável upstream correspondente em kernel.org. Nesse caso, o Google oferece suporte estendido até a data de fim de vida útil (EOL) mostrada nesta seção. Quando os kernels chegam ao fim da vida útil, eles não têm mais suporte do Google, e os dispositivos que os executam são considerados vulneráveis.

A partir do kernel 6.6, o período de suporte para os kernels estáveis é de 4 anos.

Esta tabela mostra as durações dos ACKs compatíveis:

Ramificação ACK Data de
lançamento
Suporte
vida útil
(anos)
EOL
android-4.19-stable 2018-10-22 6 2025-01-01
android11-5.4 2019-11-24 6 2026-01-01
android12-5.4 2019-11-24 6 2026-01-01
android12-5.10 2020-12-13 6 2027-07-01
android13-5.10 2020-12-13 6 2027-07-01
android13-5.15 2021-10-31 6 2028-07-01
android14-5.15 2021-10-31 6 2028-07-01
android14-6.1 2022-12-11 6 2029-07-01
android15-6.6 2023-10-29 4 2028-07-01

Testes comuns 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 do Linux Kernel Functional Test (LKFT) inicializam vários conjuntos de testes, incluindo kselftest, LTP, VTS e CTS em um conjunto de dispositivos físicos arm32 e arm64. Confira os resultados de testes recentes 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 mais recentes para kernels do Android podem ser encontrados aqui.

Testes antes e depois do envio no 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 em ramificações comuns do kernel do Android quando novos patches são confirmados em uma ramificação comum do kernel do Android em ci.android.com. Ao inserir aosp_kernel como um nome de ramificação parcial em ci.android.com, você vai ver uma lista de ramificações do kernel com resultados disponíveis. Por exemplo, os resultados de android-mainline podem ser encontrados aqui. Ao clicar em um build específico, você encontra 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 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 Versões 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
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

Contribuir com 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 é fortemente incentivado. Depois que o desenvolvimento é aceito, ele pode ser facilmente transferido de volta para a ramificação ACK específica, conforme necessário. A Equipe do kernel do Android fica feliz em apoiar os esforços de upstreaming para o benefício do ecossistema Android.

Envie patches para o Gerrit e siga estas diretrizes de contribuição.