Kernels comuns do Android

Os kernels comuns AOSP (também conhecidos como 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 mesclados nos kernels principais ou LTS (Long Term Supported). Esses patches podem incluir:

  • Backports e seleções de funcionalidade 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 fornecedores/OEM que são úteis para outros parceiros do ecossistema (por exemplo, sdcardfs).

android-mainline é o principal ramo de desenvolvimento para recursos do Android. A linha principal do Linux é mesclada com android-mainline sempre que Linus Torvalds publica um lançamento ou um 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 de android-mainline . Este novo modelo evita o esforço significativo para encaminhar a porta e testar os 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 . Isso permite que os parceiros iniciem um projeto antes da declaração da versão LTS, mesclando o android-mainline . Depois que a nova ramificação do kernel comum é criada, os parceiros podem alterar facilmente a origem da mesclagem para a nova ramificação.

Outras ramificações comuns do kernel recebem mesclagens regulares de seu kernel LTS associado. Essas fusões são normalmente 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 encorajados a mesclar regularmente os kernels comuns em seus kernels de produtos para se manterem atualizados com LTS e correções de bugs específicas do Android.

Ramificação do kernel ACK KMI

Os kernels GKI têm uma interface de módulo de kernel estável. A KMI é identificada 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 legados

Os kernels de sobremesa legados foram criados para garantir que o desenvolvimento de novos recursos não interfira 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 da ramificação 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 de plataforma mais recente é 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 android-4.9* , por isso é suportado e testado com sua versão original da plataforma, Android 10. Também é suportado e testado com as versões de plataforma que suportam atualizações de dispositivos executando 4.9 núcleos: Android 11 e Android 12.

Como o esquema de nomenclatura de sobremesa para lançamentos da plataforma Android foi descartado 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 de sobremesa foram substituídos pelos kernels GKI a partir do Android 11, então 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 Android Security Bulletin mensal. Eles foram criados para cada lançamento do kernel quando havia um novo lançamento da plataforma Android. Eles são obsoletos quando o kernel associado ou a versão da plataforma é obsoleta, conforme descrito em Durações 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 Android Security Bulletin. 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

Kernels de recurso e lançamento

Cada versão da plataforma Android oferece suporte ao lançamento de novos dispositivos com base em qualquer uma das três versões do kernel do 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 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
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
Androide 12 (2021) android-4.19-stable
android11-5.4 1
android12-5.4
android12-5.10
android12-5.4
android12-5.10
Andróide 13 (2022) android11-5.4 1
android12-5.4 1
android12-5.10 1
android13-5.10
android13-5.15
android13-5.10
android13-5.15

1 Restrições adicionais podem ser aplicadas se o BSP associado tiver sido atualizado para o lançamento da plataforma. Em termos mais gerais, o número da versão Android do kernel deve ser maior ou igual à versão de destino do FCM . 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 comum do kernel é 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 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 para 5.10 também; 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 ramificação ACK KMI

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

5.10 Ciclo de vida da ramificação 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 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 é criada, uma ramificação ACK KMI entra na fase de desenvolvimento ( dev na Figura 2) e está aberta 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 a ramificação ACK KMI é declarada como recurso completo, ela entra na fase de estabilização , rotulada como stab na Figura 2. Os recursos do parceiro e as correções de bugs ainda são aceitos, mas o rastreamento KMI é ativado 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.

KMI fase congelada

Antes de um novo lançamento de plataforma ser enviado para o AOSP, a ramificação ACK KMI é congelada e permanece congelada durante o tempo de vida da ramificação. Isso significa que nenhuma alteração que quebre o KMI é aceita, a menos que seja identificado um problema de segurança sério 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 seja 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 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 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 a aceitação de um patch de alteração de KMI, o número de geração de KMI é incrementado e a ramificação é marcada novamente. Por exemplo, se essa alteração for aceita no android11-5.4 , a ramificação será marcada com a nova versão do 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 de KMI sejam muito raras.

Compatibilidade entre kernels

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

Kernel GKI

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

A KMI é estável para que o kernel possa ser atualizado sem exigir a 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 a reconstrução de todos os módulos.

Os kernels GKI são suportados apenas para seus lançamentos 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 as versões anteriores 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 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
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
Androide 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
Andróide 13 (2022) android-4.9-q
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
android13-5.10
android13-5.15
android11-5.4
android12-5.4
android12-5.10
android13-5.10
android13-5.15

Vidas de 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. Enquanto um kernel é 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 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 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 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. 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

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 neste momento.

O teste pós-envio do Android é executado 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 0 dias realiza testes patch a 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 teste
Mestre 13 12 11 10 9 (Torta) LKFT Kernel CI Pré-envio 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

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 lá, ele pode ser facilmente transferido 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 .