Kernels comuns do Android

Kernels comuns do AOSP (também conhecidos como os kernels comuns do Android ou ACKs) são downstream dos Kernels kernel.org e incluem patches de interesse para a comunidade Android que não foram incluídos nas versões principal Kernels com suporte de longo prazo (LTS). Esses patches podem incluir:

  • Backports e seleções de funcionalidades upstream necessárias para o Android atributos
  • 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. Linux a linha principal é mesclada em android-mainline sempre que Linus Torvalds posta um candidata a lançamento ou lançamento. Antes de 2019, os kernels comuns do Android eram construído clonando o kernel do LTS recentemente declarado e adicionando o Patches específicos do Android. Esse processo mudou em 2019 para ramificar o novo Android kernel comum de android-mainline. Esse novo modelo evita a sobrecarga esforço para encaminhar portas e testar patches do Android com o mesmo resultado de forma incremental. O android-mainline passa por testes contínuos significativos, 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 a partir de android-mainline. Isso permite que os parceiros iniciem um projeto antes do declaração da versão do LTS, mesclando do android-mainline. Após o uma nova ramificação comum do kernel for criada, os parceiros poderão alterar a mesclagem origem para a nova ramificação.

Outras ramificações de kernel comuns recebem mesclagens regulares dos respectivos Kernel do LTS: Normalmente, essas mesclagens são feitas imediatamente após a publicação da versão do LTS. Para Por exemplo, quando o Linux 6.1.75 foi publicado, ele foi mesclado com a versão 6.1 kernel (android14-6.1). É altamente recomendável que os parceiros atualizar os kernels para ficarem em dia 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 é único identificada pela versão do kernel e pela versão da plataforma Android, de modo que a as ramificações são nomeadas ANDROID_RELEASE-KERNEL_VERSION. Por exemplo, a GKI 6.1 do kernel do Android 14 é chamado de android14-6.1. Para Android 15 (AOSP experimental), o kernel de GKI android15-6.6 era surgiu.

Apresentar e lançar kernels

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

Porque os upgrades do kernel não são necessários ao atualizar a plataforma lançamento, os kernels que não têm os recursos mais recentes para um lançamento de plataforma podem ainda pode ser usado para iniciar dispositivos. Portanto, os kernels que foram projetados para O Android 14, como android14-6.1, pode ser usado em mesmo depois de fazer upgrade da versão da plataforma para 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 foi atualizado para o lançamento da plataforma. Em termos mais gerais, Número da versão do Android do kernel deve ser maior ou igual ao versão de destino do FCM. Consulte Objeto da interface do fornecedor: corresponder às ramificações do kernel para mais detalhes.

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, 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 são kernels de recursos para as respectivas versões de plataforma. Isso também foi o caso do 5.10, A android12-5.10 foi criada quando o LTS foi declarado e android13-5.10 ramificado de android12-5.10 no kernel marco completo do recurso no segundo semestre de 2021 para permitir o desenvolvimento de recursos para Android 13 Começando com o Android 15 (AOSP experimental) (2024), haverá 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 foca no Ramificações ACK KMI para 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 (rotulada como dev na Figura 2) e está aberto a contribuições de recursos para o próximo lançamento uma nova plataforma. Na Figura 2, android15-6.6 foi criado quando a versão 6.6 declarado como o novo kernel do LTS upstream.

Fase de estabilização

Quando a ramificação ACK KMI é declarada como recurso completo, ela entra no fase de estabilização (identificada como estável na Figura 2). Recursos de parceiros e correções de bugs ainda são aceitas, mas o acompanhamento KMI está ativado para detectar quaisquer alterações que afetam a interface. Nessa fase, são aceitas alterações interruptivas do KMI e a definição KMI é atualizada em um ritmo predefinido (normalmente a cada dois semanas). Consulte a Visão geral do GKI para detalhes sobre o monitoramento do KMI.

Fase congelada do KMI

Antes de uma nova versão da plataforma ser enviada ao 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ças interruptivas do KMI são aceitas, a menos que um problema grave de segurança seja identificado que não podem ser atenuadas sem afetar o KMI estável. Para evitar o KMI de segurança, alguns patches mesclados com o LTS podem ser modificados ou descartados não é necessário 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 KMI existente não esteja corrompido. O KMI pode ser estendido com novos símbolos exportados, desde que as interfaces compreendendo o KMI atual não são afetadas. Quando novas interfaces são adicionadas ao KMI, elas imediatamente se tornar estável e não ser corrompida por alterações futuras.

Por exemplo, uma mudança que adiciona um campo a uma estrutura usada por uma interface KMI kernel comum não é permitido porque ele altera 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 todo o ciclo de vida do kernel de GKI, a compatibilidade com versões anteriores do espaço do usuário é mantidos para que o kernel possa ser usado com segurança pela plataforma Android com o qual o dispositivo foi iniciado. Testes contínuos com versões anteriores garante que a compatibilidade seja mantida. Na Figura 2, a android15-6.6 O kernel pode ser usado para dispositivos Android 15 (AOSP experimental) e mais recentes dispositivos. 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 (AOSP experimental) para lançamento 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 a aceitação de um patch de alteração do KMI, o O número de geração de KMI registrado em build.config.common é incrementado. A a geração do KMI atual 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 reconstruídos atualizada de forma síncrona com o kernel. Após o congelamento do KMI, a geração do KMI muda são muito raras.

Compatibilidade entre kernels

Os requisitos de compatibilidade entre kernels na mesma família de LTS sã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 em toda a Plataforma Android com suporte para a versão do kernel. Além disso, a plataforma Android são compatíveis com versões anteriores dos kernels de GKI. Então, você pode usar com segurança o kernel android14-6.1 desenvolvido para Android 14 (2023) em dispositivos com Android 15 (AOSP experimental) (2024). A compatibilidade é verificada por 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. Então, Por exemplo, um kernel android14-6.1 não pode ser substituído por um android15-6.6. sem precisar 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. Então, O kernel android15-6.6 não tem suporte para dispositivos em execução Android 14 (2023).

Matriz de compatibilidade

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

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

ACKs recebem mesclas de LTS de 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 na documentação Android Boletins de segurança que são relevantes para a ACK.

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

A partir do kernel 6.6, o ciclo de vida do suporte para os kernels estáveis é 4 anos.

Esta tabela mostra os ciclos de vida das ACKs com suporte:

Ramificação ACK Data de
lançamento
Vida útil
do suporte
(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

Teste comum do kernel

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

Teste funcional do kernel do Linux

Teste funcional do kernel do Linux (LKFT, na sigla em inglês) de testes iniciam vários conjuntos de testes, incluindo kselftest, LTP, VTS e CTS em uma de dispositivos físicos arm32 e arm64. Os resultados de testes recentes podem ser encontrados aqui.

Teste do KernelCI

Os testes de build e inicialização do KernelCI são é iniciado 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. Recentes resultados para kernels do Android podem ser encontrados aqui.

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

Os testes de pré-envio são usados para evitar que falhas sejam introduzidas no Kernels comuns do Android. O resumo do resultado do teste pode ser encontrado em "Verificações" guia 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 forem confirmados em uma ramificação do kernel comum do Android em ci.android.com (link em inglês). Ao inserir aosp_kernel como um nome de ramificação parcial em ci.android.com, você vai conferir uma lista de ramificações do kernel com resultados disponíveis. Por exemplo, é possível encontrar resultados para android-mainline 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. Diversos de inicialização, funcionalidade e desempenho. Participar do grupo público cros-kernel-buildreports (em inglês)

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
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 os kernels comuns do Android

Geralmente, o desenvolvimento de recursos deve ser feito no Linux principal e não no Kernels comuns do Android. O desenvolvimento upstream é altamente recomendado e, após desenvolvimento é aceito lá, ele pode ser facilmente reportado para a rede ACK específica conforme necessário. A equipe do kernel do Android é felizes em apoiar os esforços de upstreaming para beneficiar o ecossistema Android.

Enviar patches para o Gerrit e se adequar a essas diretrizes de contribuição.