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 da comunidade Android que não foram mesclados nos kernels de linha principal 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 (por exemplo, otimizações de posicionamento de tarefas do Energy Aware Scheduler).
  • Recursos de fornecedor/OEM que são úteis para outros parceiros do ecossistema (por exemplo, sdcardfs).

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

Quando um novo LTS é declarado upstream, o kernel comum correspondente é ramificado de android-mainline . Isto permite que os parceiros iniciem um projeto antes da declaração da versão LTS, através da fusão do android-mainline . Depois que a nova ramificação comum do kernel for criada, os parceiros poderão alterar perfeitamente a origem da mesclagem para a nova ramificação.

Outras ramificações comuns do kernel recebem mesclagens regulares de seu kernel LTS associado. Essas mesclagens normalmente são feitas imediatamente após a publicação do lançamento do LTS. Por exemplo, quando o Linux 4.19.64 foi lançado, ele foi mesclado nos kernels comuns 4.19 (por exemplo, android-4.19-q ). Os parceiros são fortemente incentivados a mesclar regularmente os kernels comuns com os kernels de seus produtos para se manterem atualizados com correções de bugs específicos do LTS e do Android.

Ramificação do kernel ACK KMI

Os kernels GKI possuem uma interface de módulo de kernel estável. O KMI é identificado exclusivamente pela versão do kernel e pelo lançamento da plataforma Android, portanto, as ramificações são denominadas <androidRelease>-<kernel version> . Por exemplo, o kernel 5.4 GKI para Android 11 é denominado android11-5.4. Para Android 12, existem dois kernels GKI adicionais, android12-5.4 e android12-5.10 .

Ramos legados de kernel de sobremesa

Os kernels de sobremesa legados foram criados para garantir que o desenvolvimento de novos recursos não interferisse na fusão do kernel comum do Android. As ramificações foram criadas antes do lançamento da sobremesa associada e recebem fusões regulares do LTS, mas sem novos recursos. Por exemplo, android-4.9-q recebe mesclagens da ramificação LTS 4.9.y.

Se uma versão do kernel não for um kernel de lançamento, nenhum kernel sobremesa será criado, mas o kernel associado à versão mais recente da plataforma será válido para atualização para versões futuras da plataforma Android. Por exemplo, android-4.9-q foi o último dos ramos sobremesa android-4.9* , por isso é compatível e testado com sua versão original da plataforma, Android 10. Ele também é compatível e testado com as versões de plataforma que suportam atualizações de dispositivos executando 4.9 kernels: Android 11 e Android 12.

Como o esquema de nomenclatura de sobremesas para lançamentos da plataforma Android foi abandonado com o Android 10, os últimos lançamentos de sobremesas que seriam chamados de android-4.14-r e android-4.19-r foram chamados de android-4.14-stable e android-4.19-stable .

Os kernels de sobremesa são substituídos pelos kernels GKI a partir do Android 11, portanto, a lista completa de kernels de sobremesa compatíveis está nesta tabela.

Lançamento da plataforma Android Núcleo Suportado até
Android 10 android-4.9-q
android-4.14-q
android-4.19-q
Janeiro de 2023
Android 11 android-4.14-stable
android-4.19-stable
Janeiro de 2024

Ramos de kernel de lançamento legado

Os kernels de lançamento são mantidos para fornecer backports de patches citados no Android Security Bulletin mensal. Eles foram criados para cada kernel de lançamento quando houve um novo lançamento da plataforma Android. Eles são preteridos quando o kernel ou a versão da plataforma associada são preteridos, conforme descrito em Tempos de vida do suporte e patches de segurança .

Todo mês, quando o Boletim de Segurança do Android é publicado, esses kernels são atualizados com backports dos patches citados no boletim que são relevantes para os kernels upstream e kernels comuns do Android. Eles não recebem patches LTS, portanto o número da versão secundária nunca muda. Eles não contêm backports para patches específicos do fornecedor.

No Android 11 e versões de plataforma posteriores, os parceiros devem mesclar os kernels sobremesa ou GKI para aplicar os patches citados no Boletim de Segurança do Android. Nenhum kernel de lançamento será criado para versões de plataforma Android 11 ou posteriores.

Portanto, a lista completa dos 14 kernels de lançamento é mostrada nesta tabela e nenhum será adicionado.

Lançamento da plataforma Android Núcleo Suportado até
Android 10 android-4.9-q-release
android-4.14-q-release
android-4.19-q-release
Janeiro de 2023

Recurso e lançamento de kernels

Cada versão da plataforma Android oferece suporte ao lançamento de novos dispositivos baseados em qualquer uma das três versões do kernel Linux. Conforme mostrado na tabela abaixo, os kernels de inicialização do Android 11 são android-4.14-stable , android-4.19-stable e android11-5.4 .

Como as atualizações do kernel geralmente não são necessárias ao atualizar a versão da plataforma, os kernels que não possuem os recursos mais recentes para uma versão da plataforma ainda podem ser usados ​​para iniciar dispositivos. Portanto, os kernels que foram projetados para o Android 10, como android-4.19-q , podem ser usados ​​em dispositivos mesmo após a atualização da versão da plataforma para o Android 11. A partir do Android 12, haverá menos kernels de recursos do que kernels de lançamento para limitar o número de KMIs estáveis ​​que devem ser suportados.

Lançamento da plataforma Android Lançar kernels Kernels de recursos
Andróide 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10 1
android14-6.1
android14-5.15
Andróide 13 (2022) android13-5.15
android13-5.10
android12-5.10 1
android12-5.4 1
android11-5.4 1
android13-5.15
android13-5.10
Andróide 12 (2021) android12-5.10
android12-5.4
android11-5.4 1
android-4.19-stable
android12-5.10
android12-5.4
Android 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android11-5.4
android-4.19-stable
android-4.14-stable
Android 10 (2019) android-4.19-q
android-4.14-q
android-4.9-q

android-4.19-q
android-4.14-q
android-4.9-q

1 Restrições adicionais poderão ser aplicadas se o BSP associado tiver sido atualizado para o lançamento da plataforma. Em termos mais gerais, o número de versão do Android do kernel deve ser maior ou igual à versão do FCM de destino . Consulte Objeto de interface do fornecedor - correspondência de ramificações do kernel para obter detalhes.

Hierarquia comum do kernel

Ramificação da linha principal do Android

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

Criando kernels comuns a partir do kernel Android-mainline

Figura 1. Criando kernels comuns a partir do kernel android-mainline

Observe que o novo kernel comum do Android android12-5.10 foi ramificado de android-mainline em 2020. Em 2021, quando o próximo LTS foi declarado, android13-5.15 foi ramificado de android-mainline .

Conforme mostrado na Figura 1, cada versão do kernel é a base para dois kernels GKI. Por exemplo, os dois kernels v5.4 são android11-5.4 e android12-5.4 , sendo que ambos são kernels de recursos para seus respectivos lançamentos de plataforma. Este será o caso também do 5.10; android12-5.10 foi criado quando o LTS foi declarado e android13-5.10 se ramificará do android12-5.10 no marco completo do recurso do kernel na primavera de 2021 para permitir o desenvolvimento de recursos para o Android 13.

Ciclo de vida da filial ACK KMI

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

5.10 Ciclo de vida da filial ACK KMI

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

Para esclarecer o processo de desenvolvimento e o ciclo de vida da ramificação, a Figura 2 concentra-se nas ramificações do ACK KMI para 5.10.

Cada ramal ACK KMI passa por três fases indicadas na Figura 2 por cores diferentes em cada ramal. Conforme mostrado, o LTS é mesclado regularmente, independentemente da fase.

Fase de desenvolvimento

Quando é criada, uma ramificação ACK KMI entra na fase de desenvolvimento ( dev na Figura 2) e fica aberta para contribuições de recursos para o próximo lançamento da plataforma Android. Na Figura 2, android12-5.10 foi criado quando o 5.10 foi declarado como o novo kernel LTS upstream. A segunda ramificação ACK KMI para uma versão do kernel pode ser criada anteriormente para permitir o desenvolvimento da versão subsequente. Na Figura 2, android13-5.10 é criado quando android12-5.10 sai da fase de desenvolvimento.

Fase de estabilização

Quando a ramificação ACK KMI é declarada como recurso completo, ela entra na fase de estabilização , rotulada como facada na Figura 2. Recursos de parceiros e correções de bugs ainda são aceitos, mas o rastreamento KMI é habilitado para detectar quaisquer alterações que afetem a interface. Nesta fase, as alterações que quebram o KMI são aceitas, mas a definição do KMI deve ser atualizada conforme necessário. Consulte a visão geral do GKI para obter detalhes sobre o monitoramento KMI.

Fase congelada KMI

Antes de uma nova versão da plataforma ser enviada ao AOSP, a ramificação ACK KMI é congelada e permanece congelada durante a vida útil da ramificação. Isso significa que nenhuma alteração que quebre o KMI será aceita, a menos que seja identificado um problema sério de segurança que não possa ser mitigado sem afetar o KMI estável. Para evitar falhas no 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 KMI existente não esteja quebrado. 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 quebradas por alterações futuras.

Por exemplo, uma alteração que adiciona um campo a uma estrutura usada por um kernel comum de interface KMI não é permitida porque 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, adicionar uma nova função é bom:

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 GKI, a compatibilidade com versões anteriores com o espaço do usuário é mantida para que o kernel possa ser usado com segurança na versão da plataforma Android com a qual o dispositivo foi iniciado. Testes contínuos com versões anteriores garantem que a compatibilidade seja mantida. Portanto, na Figura 2, o kernel android12-5.10 pode ser usado para dispositivos Android 12 e Android 13. Como o lançamento da plataforma Android também é compatível com versões anteriores, o kernel android12-5.4 pode ser usado para dispositivos Android 13 para inicialização ou atualização.

Ao entrar na fase congelada, a ramificação é marcada com git com a string da versão do KMI contendo o número de geração do KMI. Por exemplo, quando android11-5.4 foi congelado, ele foi marcado com a string de versão KMI 5.4-android11-0 , onde o 0 à direita é o número de geração do KMI. Se houver um problema de segurança ou outro evento que exija a aceitação de um patch de alteração do KMI, o número de geração do KMI será incrementado e a ramificação será remarcada. Por exemplo, se tal alteração for aceita em android11-5.4 , a ramificação será marcada com a nova versão do KMI, 5.4-android11-1 . A geração atual do KMI pode ser encontrada usando o comando uname :

$ uname -r
5.4.61-android11-0-00153-ga972f59040e4

O número após o lançamento da plataforma é a geração do KMI (0 neste caso).

Se a geração do KMI mudar, o kernel não será compatível com os módulos do fornecedor que estejam em conformidade com a geração KMI anterior, portanto, os módulos deverão ser reconstruídos e atualizados de forma síncrona com o kernel. Espera-se que as mudanças na geração do KMI sejam muito raras.

Compatibilidade entre kernels

Os requisitos de compatibilidade entre kernels da mesma família LTS estão mudando a partir dos novos kernels GKI.

Núcleos GKI

Os kernels GKI mantêm compatibilidade retroativa com todas as versões da plataforma Android que suportam a versão do kernel. Além disso, as versões da plataforma Android são compatíveis com versões anteriores dos kernels GKI de versões anteriores. Portanto, você pode usar com segurança o kernel android12-5.4 desenvolvido para Android 12 em dispositivos que executam Android 13. A compatibilidade é verificada por meio de testes VTS e CTS contínuos dos kernels GKI com todas as versões suportadas.

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

A compatibilidade do KMI não é mantida entre diferentes kernels do GKI. Assim, por exemplo, um kernel android12-5.10 não pode ser substituído por um kernel android13-5.10 sem reconstruir todos os módulos.

Os kernels GKI são suportados apenas nas versões iniciais e subsequentes. Eles não são suportados para versões mais antigas. Portanto, um kernel android13-5.10 não é compatível com dispositivos Android 12.

Kernels legados

Os kernels de sobremesa legados ( *-q e *-stable ) não são compatíveis com versões anteriores das versões da plataforma Android, mas os kernels das duas versões anteriores da plataforma Android são compatíveis com atualização. Portanto, um dispositivo lançado com Android 10 usando um kernel baseado em android-4.19-q pode continuar a usar o kernel android-4.19-q ao atualizar para Android 2020 ou atualizar o código específico do fornecedor para suportar android-4.19-stable .

Matriz de compatibilidade

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

Lançamento da plataforma Android Kernels suportados para atualização Kernels suportados para lançamento
Andróide 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
android-4.14-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Andróide 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Andróide 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android11-5.4
android-4.19-stable
android-4.14-stable
Android 10 (2019) android-4.14-stable
android-4.14-p (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android-3.18 (EOL)
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)

Vida útil do suporte e patches de segurança

Os kernels comuns do Android são suportados até que o kernel LTS associado ou a versão da plataforma Android não sejam mais suportados. Embora um kernel seja suportado, ele continua recebendo mesclagens 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 mensais do Android que são relevantes para os kernels comuns do Android.

Os parceiros podem ter certeza de que, ao mesclar regularmente os kernels comuns do Android, eles obterão todos os patches de segurança do kernel possíveis.

Teste de kernel comum

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

Teste Funcional do Kernel Linux

Os testes do Linux Kernel Functional Test (LKFT) iniciam vários conjuntos de testes, incluindo kselftest, LTP, VTS e CTS em um conjunto de dispositivos físicos arm32 e arm64. Os resultados dos testes recentes podem ser encontrados aqui .

Teste KernelCI

Os testes de compilação e inicialização do KernelCI são iniciados sempre que um novo patch é confirmado em uma ramificação comum do kernel. Várias centenas de configurações de compilação são testadas e inicializadas em diversas placas. Resultados recentes para kernels Android podem ser encontrados aqui .

Teste de pré-envio 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 novas compilações publicadas 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ê verá 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 uma compilação específica, você encontrará o status do teste na guia Test Results .

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

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

Teste de dia 0

O teste de dia 0 realiza testes patch por 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. Junte-se ao grupo público cros-kernel-buildreports

Matriz de teste

Kernel comum do Android Lançamentos da plataforma Android Conjuntos de testes
Principal 14 13 12 11 10 LKFT KernelCI Pré-envio Enviar postagem 0 dia
android-mainline
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
android-4.19-stable
android-4.14-stable

Contribua com kernels comuns do Android

Geralmente, o desenvolvimento de recursos deve ser feito no Linux principal e não nos kernels comuns do Android. O desenvolvimento upstream é fortemente encorajado e, após o desenvolvimento ser aceito lá, ele pode ser facilmente transferido para o branch ACK específico, conforme necessário. A equipe do kernel do Android tem prazer em apoiar os esforços de upstreaming para o benefício do ecossistema Android.

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