O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

Android Common Kernels

Os kernels comuns 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 em kernels mainline ou Long Term Supported (LTS). Esses patches podem incluir:

  • Backports e escolhas certas de funcionalidades upstream necessárias para recursos do Android
  • Recursos prontos para dispositivos Android, mas ainda em desenvolvimento upstream (por exemplo, otimizações de posicionamento de tarefas do Energy Aware Scheduler).
  • Recursos do fornecedor / OEM que são úteis para outros parceiros do ecossistema (por exemplo, sdcardfs).

android-mainline é o principal ramo de desenvolvimento dos recursos do Android. A linha principal do Linux é mesclada com android-mainline sempre que Linus Torvalds posta 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 os patches específicos do Android. Esse processo mudou em 2019 para ramificar o novo kernel comum do android-mainline do android-mainline . Esse novo modelo evita o esforço significativo de encaminhar 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 do android-mainline . Isso permite que os parceiros comecem um projeto antes da declaração da versão LTS, mesclando do android-mainline . Depois que o novo branch de kernel comum é criado, os parceiros podem alterar perfeitamente a fonte de mesclagem para o novo branch.

Outros ramos de kernel comuns recebem mesclagens regulares de seu kernel LTS associado. Isso normalmente é feito imediatamente após a publicação do LTS. Por exemplo, quando o Linux 4.19.64 foi postado, ele foi incorporado aos kernels comuns do 4.19 (por exemplo, android-4.19-q ). Os parceiros são fortemente encorajados a mesclar regularmente os kernels comuns com os kernels de seus produtos para se manterem atualizados com as correções de bugs específicas do LTS e do Android.

Termos

Aqui estão alguns novos termos usados ​​neste documento para descrever as políticas comuns do kernel do Android.

Kernel de recurso

Os kernels aprimorados com recursos para o lançamento mais recente da plataforma Android são chamados de kernels de recursos . Para o Android 11, os kernels de recursos são baseados nas versões de kernel 4.14.y, 4.19.y e 5.4.y. Em versões anteriores da plataforma, os kernels de recursos eram iguais aos kernels de lançamento. No entanto, no Android S (AOSP experimental), haverá dois kernels de recursos e três kernels de lançamento.

Imagem Genérica do Kernel

A partir do Android 11, os kernels comuns do Android são usados ​​para criar imagens de kernel genéricas (GKIs), que são imagens de kernel Aarch64 que podem ser usadas para executar qualquer dispositivo com o SoC e suporte de driver implementado em módulos do fornecedor. Para obter detalhes, consulte a visão geral do GKI .

Interface do Módulo Kernel

A GKI apresenta o conceito de Kernel Module Interface (KMI) estável que permite que o kernel central seja atualizado de forma assíncrona a partir dos módulos do fornecedor. Quando o KMI está congelado, nenhuma mudança pode ser feita que interrompa a compatibilidade binária com os módulos existentes do fornecedor. Consulte a visão geral do GKI para obter detalhes sobre o KMI.

Kernel de lançamento

Os kernels de lançamento designados podem ser usados ​​para lançar dispositivos com uma versão específica da plataforma Android. Para o Android 11, os dispositivos podem ser iniciados com kernels baseados nas versões de kernel 4.14.y, 4.19.y e 5.4.y.

Tipos comuns de ramificação do kernel

KMI kernel branch

Os kernels KMI têm 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, os ramos são nomeados <androidRelease>-<kernel version> . Por exemplo, o kernel 5.4 KMI para Android 11 é denominado android11-5.4. Para Android S (experimental AOSP), existem dois kernels KMI adicionais, android12-5.4 e android12-5.10 .

Ramos legados de kernel de sobremesa

Os kernels de sobremesas 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 mesclagens regulares do LTS, mas sem novos recursos. Por exemplo, android-4.9-q recebe mesclagens do branch LTS 4.9.y.

Se uma versão do kernel não era um kernel de lançamento, nenhum kernel de sobremesa foi criado, mas o kernel associado à versão mais recente da plataforma é válido para atualização para versões futuras da plataforma Android. Por exemplo, android-4.4-p foi o último dos branches android-4.4* , então é compatível e testado com sua versão de plataforma original, Android 9 (Pie). Também é compatível e testado com os lançamentos de plataforma que oferecem suporte a atualizações de dispositivos rodando kernels 4.4: Android 10 e Android 11.

Como o esquema de nomenclatura de sobremesa para lançamentos da plataforma Android foi abandonado com o Android 10, os últimos lançamentos de sobremesa 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 para sobremesas são substituídos pelos kernels KMI a partir do Android 11, portanto, a lista completa de kernels para sobremesas com suporte está nesta tabela.

Lançamento da plataforma Android Núcleo Suportado até
Android 8.1 (Oreo) android-4.4-o
android-4.9-o
Junho de 2021
Android 9 (torta) android-4.4-p
android-4.9-p
android-4.14-p
Janeiro de 2022
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 boletim mensal de segurança do Android . Eles foram criados para cada kernel de lançamento quando havia um novo lançamento da plataforma Android. Eles são preteridos quando o kernel associado ou a versão da plataforma são preteridos conforme descrito em Vida útil de suporte e patches de segurança .

Todos os meses, 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, então 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 posteriores da plataforma, os parceiros devem fazer a fusão dos kernels dessert ou KMI para aplicar os patches citados no Boletim de Segurança do Android. Nenhum kernel de lançamento será criado para Android 11 ou versões de plataforma posteriores.

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

Lançamento da plataforma Android Núcleo Suportado até
Android 8.0 (Oreo) android-3.18-o-release
android-4.4-o-release
android-4.9-o-release
Janeiro de 2021
Android 8.1 (Oreo MR1) android-3.18-o-mr1
android-4.4-o-mr1
android-4.9-o-mr1
Junho de 2021
Android 9 (torta) android-4.4-p-release
android-4.9-p-release
android-4.14-p-release
Janeiro de 2022
Android 10 android-4.9-q-release
android-4.14-q-release
android-4.19-q-release
Janeiro de 2023

Apresentar e lançar kernels

Cada lançamento da plataforma Android suporta o 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 para 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 o android-4.19-q , podem ser usados ​​em dispositivos mesmo após a atualização do lançamento da plataforma para o Android 11. A partir do Android S (AOSP experimental), haverá menos kernels de recursos do que os 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 Apresentar kernels
Android 9 (2018) android-4.4-p
android-4.9-p
android-4.14-p
android-4.4-p
android-4.9-p
android-4.14-p

Android 10 (2019) android-4.9-q
android-4.14-q
android-4.19-q

android-4.9-q
android-4.14-q
android-4.19-q
Android 11 (2020) android-4.14-stable
android-4.19-stable
android11-5.4
android-4.14-stable
android-4.19-stable
android11-5.4
Android S (AOSP experimental) (2021) android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android12-5.4
android12-5.10
Android T (AOSP experimental) (2022) 1 android12-5.4
android12-5.10
android13-5.10
android13-5.x
android13-5.10
android13-5.x 2

1 Android T (AOSP experimental) (2022) não está comprometido e é mostrado apenas para demonstrar como o novo modelo de ramificação progredirá no futuro com dois recursos e três núcleos de inicialização.

2 Onde 5.x é a versão do kernel selecionada como LTS no final de 2021.

Hierarquia de kernel comum

Ramificação do android-mainline

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

Criação de 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 Android android12-5.10 foi ramificado do android-mainline em 2020. Em 2021, quando o próximo LTS for declarado, android13-5.x (onde 5.xy é a versão do kernel selecionada como LTS) irá ramificar android-mainline .

Conforme mostrado na Figura 1, cada versão do kernel é a base para dois kernels KMI. 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 também será o caso do 5.10; android12-5.10 foi criado quando o LTS foi declarado e android13-5.10 ramificará de android12-5.10 no marco de conclusão de recursos do kernel na primavera de 2021 para permitir o desenvolvimento de recursos para Android T (AOSP experimental).

Ciclo de vida da filial KMI

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

5.10 Ciclo de vida da filial KMI

Figura 2. 5.10 Ciclo de vida do ramo KMI

Para esclarecer o processo de desenvolvimento e o ciclo de vida do branch, a Figura 2 enfoca os branches KMI para 5.10.

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

Fase de desenvolvimento

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

Fase de estabilização

Quando o branch KMI é declarado como recurso concluído, ele entra na fase de estabilização , rotulado como stab na Figura 2. Recursos do parceiro 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, alterações de quebra de KMI são aceitas, mas a definição de 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 que uma nova versão da plataforma seja enviada ao AOSP, a ramificação KMI é congelada e permanece congelada por toda a vida da ramificação. Isso significa que nenhuma alteração de quebra de KMI é aceita, a menos que um problema sério de segurança seja identificado e não possa ser mitigado sem afetar o KMI estável. Para evitar quebras de KMI, alguns patches mesclados de LTS podem ser modificados ou descartados se a correção não for necessária para dispositivos Android.

Quando uma ramificação 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 estáveis ​​imediatamente e não podem ser interrompidas por mudanças 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 KMI, a compatibilidade com versões anteriores 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 a qual o dispositivo foi lançado. O teste contínuo com versões anteriores garante que a compatibilidade seja mantida. Portanto, na Figura 2, o kernel android12-5.10 pode ser usado para dispositivos Android S (experimental AOSP) e dispositivos Android T (experimental AOSP). Como o lançamento da plataforma Android também é compatível com as versões anteriores, o kernel android12-5.4 pode ser usado para dispositivos Android T (experimental AOSP) para inicialização ou atualização.

Ao entrar na fase de congelamento, o branch é marcado com git com a string de versão KMI contendo o número de geração 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 KMI. Se houver um problema de segurança ou outro evento que exija que um patch de alteração de KMI seja aceito, o número de geração do KMI é incrementado e a ramificação marcada novamente. Por exemplo, se essa alteração for aceita no android11-5.4 , o branch será marcado com a nova versão KMI, 5.4-android11-1 . A geração KMI atual 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 KMI (0 neste caso).

Se a geração KMI mudar, o kernel não é compatível com os módulos do fornecedor que estão em conformidade com a geração KMI anterior, portanto, os módulos devem 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 os kernels da mesma família LTS estão mudando, começando com os novos kernels KMI.

KMI kernels

Os novos kernels KMI mantêm compatibilidade retroativa com todas as versões da plataforma Android que suportam a versão do kernel. Portanto, o kernel android12-5.4 desenvolvido para Android S (AOSP experimental) pode ser usado com segurança em dispositivos que executam o Android 11. Os testes VTS e CTS contínuos dos kernels estáveis ​​com versões anteriores garantem que a compatibilidade seja preservada.

O KMI é estável para que o kernel possa ser atualizado sem a necessidade de reconstruir os módulos do kernel na imagem do fornecedor.

Kernels legados

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

Matriz de compatibilidade

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

Lançamento da plataforma Android Kernels com suporte para atualização Kernels com suporte para lançamento
Android 9 (2018) android-3.10
android-3.18
android-4.4-o
android-4.9-o
android-4.4-p
android-4.9-p
android-4.14-p
Android 10 (2019) android-3.18
android-4.4-o
android-4.9-o
android-4.4-p
android-4.9-p
android-4.14-p
android-4.9-q
android-4.14-q
android-4.19-q
Android 11 (2020) android-4.4-o
android-4.4-p
android-4.9-o
android-4.9-p
android-4.9-q
android-4.14-p
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
Android S (AOSP experimental) (2021) android-4.9-o
android-4.9-p
android-4.9-q
android-4.14-p
android-4.14-q
android-4.19-q
android-4.14-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10

Suporte vitalício 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 compatível, ele continua a receber mesclagens LTS do upstream e correções de bugs para códigos específicos do Android. Essas correções incluem todos os patches de segurança do kernel citados nos boletins mensais de segurança 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, estão obtendo 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 de testes posteriores por fornecedores.

Teste Funcional do Kernel Linaro

Os testes Linaro Kernel Functional Testing (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 de testes recentes podem ser encontrados aqui .

Teste KernelCI

Os testes de construção e inicialização do KernelCI são iniciados sempre que um novo patch é enviado para um branch comum do kernel. Várias centenas de configurações de construção são testadas e inicializadas em várias placas. Os 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. Os resultados não estão disponíveis publicamente no momento.

O teste de pós-envio do Android é executado quando um novo patch é enviado para um branch de kernel comum. Ao inserir aosp_kernel como um nome de branch parcial, você verá uma lista de branches do kernel com resultados disponíveis. Por exemplo, os resultados para android-mainline podem ser encontrados aqui .

Teste de 0 dia

O teste de dia zero executa o teste patch por patch em todos os branches 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 Android Lançamentos da plataforma Android Suites de teste
Mestre 11 10 9 (torta) 8 (Oreo) LKFT KernelCI Pré-enviar Postar enviar 0 dia
android-mainline
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q
android-4.14-q
android-4.9-q
android-4.14-p
android-4.9-p
android-4.4-p
android-4.9-o
android-4.4-o
android-3.18

Contribuir para 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, depois que o desenvolvimento é aceito, pode ser facilmente retransmitido para o branch ACK específico, conforme necessário. A equipe do kernel do Android tem o prazer de apoiar os esforços de upstreaming para o benefício do ecossistema Android.

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