O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Android Common Kernels

Os kernels AOSP comuns (também conhecidos como os kernels ou ACKs comuns Android) estão a jusante do kernel.org kernels e incluem manchas de interesse para a comunidade Android que não tenham sido incorporadas pela linha principal ou a longo prazo suportados (LTS) kernels. 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 ramo de desenvolvimento principal para recursos Android. Linux linha principal é incorporada android-mainline sempre que mensagens Linus Torvalds um release candidate ou liberação. 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. Este processo mudou em 2019 a ramificar o novo kernel comum Android a partir android-mainline . Este novo modelo evita o esforço significativo de encaminhar e testar patches do Android, obtendo o mesmo resultado de forma incremental. android-mainline teste contínuo sofre significativa, este modelo garante um kernel de alta qualidade a partir do dia em que é publicado.

Quando um novo LTS é declarado a montante, o núcleo comum correspondente é ramificado a partir android-mainline . Isso permite que parceiros para iniciar um projeto antes da declaração da versão LTS, através da fusão de 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 do kernel comuns receber fusões regulares de sua associada kernel do LTS . Isso normalmente é feito imediatamente após a publicação do LTS. Por exemplo, quando Linux 4.19.64 foi publicado, foi incorporada as 4.19 kernels comuns (por exemplo, android-4.19-q ). Os parceiros são fortemente encorajados a mesclar regularmente os kernels comuns nos kernels de seus produtos para se manterem atualizados com as correções de bug 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

Kernels que são reforçadas com características para a versão mais recente plataforma Android são chamados kernels metragens. 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 12, haverá dois kernels de recursos e três kernels de lançamento.

Imagem Genérica do Kernel

Começando com o 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 mais detalhes, consulte a visão geral GKI .

Interface do Módulo Kernel

GKI introduz o conceito de um estábulo Kernel Module Interface (KMI) que permite que o kernel do núcleo para ser atualizado de forma assíncrona a partir dos módulos de fornecedores. Quando o KMI está congelado, nenhuma mudança pode ser feita que interrompa a compatibilidade binária com os módulos existentes do fornecedor. Veja a visão geral GKI para obter detalhes sobre o KMI.

Kernel de lançamento

Os grãos de lançamento designados pode ser usado para o lançamento de dispositivos com uma liberação plataforma Android particular. 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

Kernels KMI tem um estábulo Kernel Module Interface. O KMI é unicamente identificado pela versão do kernel eo lançamento da plataforma Android, de modo que os ramos são nomeados <androidRelease>-<kernel version> . Por exemplo, o 5.4 do kernel KMI para Android 11 é nomeado android11-5.4. Para Android 12 existem dois núcleos adicionais KMI, android12-5.4 e android12-5.10 .

Ramos de kernel de sobremesa legados

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 fusões do ramo 4.9.y LTS.

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 era o último dos android-4.4* sobremesa ramos, por isso é suportado e testado com o lançamento da plataforma original, Android 9 (torta). 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.

Porque o esquema de sobremesa nomeação para plataforma lançamentos Android foi lançada com Android 10, os últimos sobremesa lançamentos que teriam sido chamados android-4.14-r e android-4.19-r foram em vez chamado 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 do kernel de lançamento legado

Kernels libertação são mantidos para fornecer backports de patches de citados no mensal do Boletim de Segurança Android . Eles foram criados para cada kernel de lançamento quando havia um novo lançamento da plataforma Android. Eles estão obsoletos quando a versão do kernel ou plataforma associada é obsoleto como descrito na vidas 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 versão da plataforma Android suporta o lançamento de novos dispositivos baseados em qualquer uma das três versões do kernel Linux. Como mostrado na tabela abaixo, os grãos de lançamento 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 kernels que foram projetados para Android 10, como android-4.19-q , pode ser usado em dispositivos, mesmo depois de atualizar a liberação plataforma para Android 11. Começando com Android 12, haverá menos kernels característica de lançamento kernels 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 12 (2021) android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
android12-5.4
android12-5.10
T Android (AOSP experimental) (2022) 1 android12-5.4
android12-5.10
android13-5.10
android13-5.x
android13-5.10
android13-5.x 2

1 T Android (AOSP experimental) (2022) não está comprometida e é mostrado apenas para demonstrar como o novo modelo de ramificação vai progredir no futuro com dois recurso e três kernels de lançamento.

2 Onde 5.x é a versão do kernel selecionado 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. Criação de núcleos comuns de android-linha principal do kernel

Observe que o novo comum Android kernel do android12-5.10 foi ramificada de android-mainline em 2020. Em 2021, quando o próximo LTS é declarado, android13-5.x (onde 5.xy é a versão do kernel selecionado como LTS) vai 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 recurso para seus respectivos lançamentos da plataforma. Este também será o caso do 5.10; android12-5.10 foi criada quando o LTS foi declarada e android13-5.10 vai ramificar de android12-5.10 no recurso do kernel marco completa na Primavera de 2021 para permitir o desenvolvimento de recursos para T Android (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 do 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 ramo KMI entra na fase de desenvolvimento (dev na Figura 2), e está aberto para contribuições de recursos para a próxima versão 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 antes para permitir o desenvolvimento da versão subsequente. Na Figura 2, android13-5.10 é criado quando android12-5.10 transições para fora da fase de desenvolvimento.

Fase de estabilização

Quando o ramo KMI é declarada completa recurso, ele entra na fase de estabilização, rotulado como facada na Figura 2. Parceiro recursos e correções de bugs ainda são aceitos, mas o rastreamento KMI está habilitado para detectar quaisquer alterações que afetam a interface. Nesta fase, as alterações de quebra de KMI são aceitas, mas a definição de KMI deve ser atualizada conforme necessário. Veja a visão geral GKI para obter detalhes sobre monitoramento KMI.

Fase congelada KMI

Antes de uma nova versão da plataforma é empurrado para AOSP, o ramo KMI é congelada e restos congelados durante a vida útil do ramo. 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 um branch KMI é congelado, 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, 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 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. Assim, na Figura 2, o android12-5.10 núcleo pode ser usado para Android 12 dispositivos e t Android (AOSP experimental) dispositivos. Porque o lançamento da plataforma Android também é compatível com versões anteriores, o android12-5.4 kernel pode ser usado para T Android (AOSP experimental) dispositivos tanto para o lançamento ou atualizar.

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, que foi etiquetada com a versão de cadeia KMI 5.4-android11-0 onde a fuga 0 é 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 uma tal mudança é aceito no android11-5.4 , o ramo será etiquetado com a nova versão KMI, 5.4-android11-1 . A geração KMI atual pode ser encontrada usando o uname comando:

$ 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 todos os lançamentos da plataforma Android que suportam a versão do kernel. Além disso, as versões da plataforma Android são compatíveis com os kernels KMI de versões anteriores. Assim você pode usar com segurança o android12-5.4 do kernel desenvolvido para Android 12 em dispositivos que executam T Android (AOSP experimental). A compatibilidade é verificada por meio de testes VTS e CTS contínuos dos kernels KMI com todas as versões com suporte.

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.

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

Os kernels KMI são suportados apenas para suas versões iniciais e subsequentes. Eles não são compatíveis com versões mais antigas. Assim, um android13-5.10 kernel não é suportado em Android 12 dispositivos.

Kernels legados

O legado de sobremesa kernels ( *-o , *-p , *-q , *-stable ) não são compatíveis com versões anteriores através de plataforma lançamentos Android, mas kernels das duas versões da plataforma Android anteriores são suportados para upgrade. Portanto, um dispositivo lançado com Android 10 usando um kernel baseado em android-4.19-q pode continuar a usar o android-4.19-q kernel para Android 2020 ou atualizar o código específico do fornecedor para suporte 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 12 (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 o lançamento da plataforma Android não sejam mais suportados. Embora um kernel seja suportado, ele continua a receber 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 citado em mensais os Boletins 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 Linaro Kernel

Linaro Kernel funcionais Testing (LKFT) testes de iniciar várias suites de teste, incluindo kselftest, LTP, VTS, e CTS de um conjunto de dispositivos ARM32 e arm64 físicas. Os recentes resultados de teste pode ser encontrada aqui .

Teste KernelCI

KernelCI testes de build-e-inicialização são iniciados sempre que um novo patch está empenhada em um ramo do kernel comum. Várias centenas de configurações de construção são testadas e inicializadas em várias placas. Os resultados recentes para kernels Android pode ser encontrada 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.

Testes postsubmit Android é realizada quando um novo patch está empenhada em um ramo do kernel comum. Ao entrar aosp_kernel como um nome de ramificação parcial, você verá uma lista de ramos de kernel, com resultados disponíveis. Por exemplo, os resultados para android-mainline pode ser encontrada aqui .

Teste de 0 dia

0-day realiza testes de patch-por-patch testes em todos os ramos do kernel comum Android quando novos patches são cometidos. Vários testes de inicialização, funcionais e de desempenho são executados. Se juntar ao grupo público Cros-kernel-buildreports

Matriz de teste

Kernel comum Android Lançamentos da plataforma Android Suites de teste
Mestre 12 11 10 9 (torta) LKFT KernelCI Pré-enviar Postar enviar 0 dia
android-mainline
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
android-4.14-q
android-4.9-q
android-4.14-p
android-4.9-p
android-4.4-p

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 lá, pode ser facilmente retrocedido para o branch ACK específico, conforme necessário. O Kernel Android Team tem o prazer de apoiar os esforços upstreaming para o benefício do ecossistema Android.

Enviar patches para Gerrit e em conformidade com estas diretrizes de contribuição .