Kernels comuns do Android

Os kernels comuns do AOSP (também conhecidos como kernels comuns do Android ou ACKs ) são descendentes dos kernels kernel.org e incluem patches de interesse para a comunidade Android que não foram mesclados nos kernels mainline ou Long Term Supported (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 upstream (por exemplo, otimizações de posicionamento de tarefas do Energy Aware Scheduler).
  • Recursos de fornecedor/OEM úteis para outros parceiros do ecossistema (por exemplo, sdcardfs).

android-mainline é a principal ramificação de desenvolvimento para 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 os patches específicos do Android. Esse processo mudou em 2019 para ramificar o novo kernel comum do Android do android-mainline . Este novo modelo evita o esforço significativo de encaminhar e testar patches do Android realizando 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 . Isso permite que os parceiros iniciem um projeto antes da declaração da versão LTS, mesclando android-mainline . Depois que a nova ramificação de kernel comum é criada, os parceiros podem alterar facilmente a origem de mesclagem para a nova ramificação.

Outras ramificações comuns do kernel recebem merges regulares de seu kernel LTS associado. Essas mesclagens normalmente são feitas imediatamente após a publicação da versão LTS. Por exemplo, quando o Linux 4.19.64 foi publicado, ele foi mesclado nos kernels comuns 4.19 (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 bugs específicas do LTS e do Android.

Ramo do kernel ACK KMI

Os kernels GKI têm uma interface de módulo de kernel estável. O KMI é identificado exclusivamente pela versão do kernel e pela versão 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 o Android 12, existem dois kernels GKI adicionais, android12-5.4 e android12-5.10 .

Ramos de kernel de sobremesa herdados

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 merges da ramificação LTS 4.9.y.

Se uma versão do kernel não for um kernel de inicialização, 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.9-q foi o último dos ramos de sobremesa do android-4.9* , por isso é compatível e testado com sua versão original da plataforma, o Android 10. 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 sobremesa para versões da plataforma Android foi descartado com o Android 10, as últimas versões de sobremesa que seriam chamadas android-4.14-r e android-4.19-r foram chamadas 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 suportados 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

Ramificações do kernel de versão legada

Os kernels de lançamento são mantidos para fornecer backports de patches citados no Boletim de Segurança do Android 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 associado ou a versão da plataforma são preteridos conforme descrito em Tempos de vida 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, 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 posteriores da plataforma, os parceiros devem mesclar os kernels de sobremesa ou GKI para aplicar os patches citados no Boletim de segurança do Android. Nenhum kernel de lançamento será criado para o Android 11 ou versões posteriores da plataforma.

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 10 android-4.9-q-release
android-4.14-q-release
android-4.19-q-release
Janeiro de 2023

Recurso e kernels de lançamento

Cada versão da plataforma Android suporta o lançamento de novos dispositivos com base 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 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 Iniciar kernels Kernels de recursos
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 2
android12-5.4
android12-5.10
android12-5.4
android12-5.10
Android T (AOSP experimental) (2022) 1 android12-5.4 2
android12-5.10 2
android13-5.10
android13-5.15
android13-5.10
android13-5.15

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

2 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 - corresponda às ramificações do kernel para obter detalhes.

Hierarquia de kernel comum

Ramificação do android-mainline

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

Criando kernels comuns 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 , ambos são kernels de recursos para suas respectivas versões de plataforma. Este será o caso do 5.10 também; android12-5.10 foi criado quando o LTS foi declarado e o android13-5.10 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 T (AOSP experimental).

Ciclo de vida da ramificação ACK KMI

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

5.10 Ciclo de vida do ramo 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 se concentra nas ramificações ACK KMI para 5.10.

Cada ramificação ACK KMI percorre 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, um branch ACK 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 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 o branch ACK KMI é declarado feature complete, ele entra na fase de estabilização , rotulada como stab na Figura 2. Os 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, as 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 de KMI.

Fase congelada KMI

Antes de uma nova versão da plataforma ser enviada para o AOSP, a ramificação ACK KMI é congelada e permanece congelada durante a vida útil da ramificação. Isso significa que nenhuma alteração de quebra de KMI é aceita, a menos que seja identificado um sério problema de segurança que não possa ser mitigado sem afetar o KMI estável. Para evitar quebras de 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 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 imediatamente se tornam estáveis ​​e não podem ser quebradas 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 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 para a 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 dispositivos Android T (experimental AOSP). Como a versão da plataforma Android também é compatível com versões anteriores, o kernel android12-5.4 pode ser usado para dispositivos Android T (AOSP experimental) para lançamento ou atualização.

Ao entrar na fase congelada, a ramificação é git-tagged 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 do 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 de KMI, o número de geração de 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 KMI, 5.4-android11-1 . A geração atual de 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 KMI (0 neste caso).

Se a geração KMI for alterada, o kernel não será 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 de KMI sejam muito raras.

Compatibilidade entre núcleos

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 a compatibilidade com versões anteriores com todas as versões da plataforma Android compatíveis com 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. Assim, você pode usar com segurança o kernel android12-5.4 desenvolvido para o Android 12 em dispositivos que executam o Android T (AOSP experimental). A compatibilidade é verificada por meio de testes contínuos de VTS e CTS 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 KMI não é mantida entre diferentes kernels GKI. Assim, por exemplo, um 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 para suas versões iniciais e subsequentes. Eles não são compatíveis com versões mais antigas. Portanto, um kernel android13-5.10 não é compatível com dispositivos Android 12.

Kernels legados

Os kernels de sobremesa herdados ( *-q e *-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 o Android 10 usando um kernel baseado no 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 suportados para atualização Kernels suportados para lançamento
Android 10 (2019) android-3.18 (EOL)
android-4.4-o (EOL)
android-4.9-o
android-4.4-p
(EOL)
android-4.9-p (EOL)
android-4.14-p (EOL)
android-4.9-q
android-4.14-q
android-4.19-q
Android 11 (2020) android-4.4-o (EOL)
android-4.4-p (EOL)
android-4.9-o (EOL)
android-4.9-p (EOL)
android-4.9-q
android-4.14-p (EOL)
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 (EOL)
android-4.9-p (EOL)
android-4.9-q
android-4.14-p (EOL)
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 a tempos de vida 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. Enquanto um kernel é suportado, ele continua a receber merges 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 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, eles estão obtendo todos os patches de segurança do kernel possíveis.

Testes comuns do kernel

Os kernels comuns são testados com vários sistemas CI, além de testes downstream 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 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 várias placas. Resultados recentes para kernels do Android podem ser encontrados aqui .

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

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 pós-envio do Android é realizado quando um novo patch é confirmado em uma ramificação comum do kernel. Ao inserir aosp_kernel como um nome de ramificação parcial, você verá uma lista de ramificações do kernel com resultados disponíveis. Por exemplo, os resultados para android-mainline podem ser encontrados aqui .

teste de 0 dias

O teste de dia 0 executa o teste 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 Versões da plataforma Android Conjuntos de teste
Mestre 12 11 10 9 (Torta) LKFT Kernel CI Pré-envio Enviar postagem 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

Contribuindo 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, após o desenvolvimento ser aceito, ele pode ser facilmente transferido para o branch ACK específico, conforme necessário. A equipe do Android Kernel tem o prazer de apoiar os esforços de upstream em benefício do ecossistema Android.

Envie patches para o Gerrit e obedeça a essas diretrizes de contribuição .