Os kernels comuns do 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 aos kernels principais ou com suporte de longo prazo (LTS, na sigla em inglês). Esses patches podem incluir:
- Backports e cherry-picks de funcionalidades upstream necessárias para recursos do Android.
- Recursos prontos para dispositivos Android, mas ainda em desenvolvimento upstream
- Recursos de fornecedores/OEMs úteis para outros parceiros do ecossistema
A android-mainline
é a principal ramificação de desenvolvimento de recursos do Android. O kernel principal do Linux é mesclado ao android-mainline
sempre que Linus Torvalds publica uma versão ou um candidato a lançamento. Antes de 2019, os kernels comuns do Android eram
criados clonando o kernel LTS declarado recentemente e adicionando os
patches específicos do Android. Esse processo mudou em 2019 para ramificar o novo kernel
comum do Android de android-mainline
. Esse novo modelo evita o esforço significativo de portar e testar patches do Android, alcançando o mesmo resultado de forma incremental. android-mainline
passa por testes contínuos significativos, e esse modelo inclui 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 comecem um projeto antes da
declaração da versão LTS, fazendo a fusão de android-mainline
. Depois que a
nova ramificação do kernel comum é criada, os parceiros podem mudar a origem
da fusão para a nova ramificação sem problemas.
Outras ramificações comuns do kernel recebem fusões regulares do kernel LTS associado.
Essas fusões são feitas imediatamente após a postagem da versão LTS. Por exemplo, quando o Linux 6.1.75 foi postado, ele foi mesclado ao kernel comum 6.1 (android14-6.1
). Recomendamos que os parceiros atualizem os kernels para ficar em dia com as correções de bugs específicas do LTS e do Android.
Ramificação do kernel KMI ACK
Os kernels GKI têm uma interface de módulo de kernel estável. A KMI é identificada exclusivamente pela versão do kernel e pelo lançamento da plataforma Android. Portanto, as ramificações são chamadas de ANDROID_RELEASE
-KERNEL_VERSION
.
Por exemplo, o kernel GKI 6.1 para Android 14 é chamado de android14-6.1
. No
Android 15, o kernel de GKI android15-6.6
foi
introduzido.
Recurso e lançamento de kernels
Antes do Android 15, qualquer um dos três kernels mais recentes
podia ser usado para o lançamento do dispositivo. A partir do Android 15, as duas versões mais recentes do kernel podem ser usadas para o lançamento de dispositivos. Os kernels de lançamento do
Android 15 são android15-6.6
e android14-6.1
.
Como os upgrades de kernel não são necessários ao atualizar a versão da plataforma, os kernels que não têm os recursos mais recentes de uma versão da plataforma ainda podem ser usados para iniciar dispositivos. Portanto, kernels projetados para o
Android 14, como o android14-6.1
, podem ser usados em
dispositivos mesmo depois de fazer upgrade da versão da plataforma para o
Android 15.
Versão da plataforma Android | Iniciar kernels | Kernels de atributos |
---|---|---|
Android 16 (2025) |
android16-6.12
android15-6.6
|
android16-6.12
|
Android 15 (2024) |
android15-6.6
android14-6.1
|
android15-6.6
|
Android 14 (2023) |
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
|
android14-6.1
android14-5.15
|
Android 13 (2022) |
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
android13-5.15
android13-5.10
|
Android 12 (2021) |
android12-5.10
android12-5.4
android11-5.4
|
android12-5.10
android12-5.4
|
1 Outras restrições podem ser aplicadas se o BSP associado tiver sido atualizado para o lançamento da plataforma. Consulte Objeto de interface do fornecedor: corresponder ramificações do kernel para mais detalhes. |
Hierarquia comum do kernel
Ramificação de android-mainline
O nível superior da hierarquia do kernel comum é mostrado na Figura 1.
Figura 1. Como criar kernels comuns do kernel android-mainline
Um novo kernel comum do Android android14-6.1
foi ramificado de
android-mainline
em 2022. Em 2023, quando a próxima LTS foi declarada, o android15-6.6
foi ramificado do android-mainline
.
Como mostrado na Figura 1, cada versão do kernel pode ser a base para dois kernels GKI.
Por exemplo, os dois kernels v5.15 são android13-5.15
e android14-5.15
,
ambos kernels de recursos para as respectivas versões da plataforma. Esse também foi o caso da versão 5.10. O android12-5.10
foi criado quando o LTS foi declarado, e o android13-5.10
foi ramificado do android12-5.10
no marco de conclusão de recursos do kernel na primavera de 2021 para permitir o desenvolvimento de recursos para o Android 13. A partir do Android
15 (2024), há apenas
um novo kernel GKI por versão do kernel (não há kernel android15-6.1
).
Ciclo de vida da ramificação KMI do ACK
O ciclo de vida de uma ramificação de KMI do ACK é mostrado na Figura 2.
Figura 2. 6.6 Ciclo de vida da ramificação KMI de ACK
Para esclarecer o processo de desenvolvimento e o ciclo de vida das ramificações, a Figura 2 se concentra nas ramificações do KMI do ACK para 6.6.
Cada ramificação do KMI de ACK passa por três fases indicadas na Figura 2 por cores diferentes em cada ramificação. Como mostrado, o LTS é mesclado regularmente, independente da fase.
Fase de desenvolvimento
Quando ela é criada, uma ramificação do ACK KMI entra na fase de desenvolvimento (marcada como
dev na Figura 2) e fica aberta para contribuições de recursos para a próxima versão da plataforma
Android. Na Figura 2, android15-6.6
foi criado quando 6.6 foi
declarado como o novo kernel LTS upstream.
Fase de estabilização
Quando a ramificação do ACK KMI é declarada como concluída, ela entra na fase de estabilização (marcada como estável na Figura 2). Recursos de parceiros e correções de bugs ainda são aceitos, mas o rastreamento de KMI está ativado para detectar mudanças que afetam a interface. Nessa fase, as mudanças interruptivas do KMI são aceitas e a definição do KMI é atualizada em uma cadência predefinida (normalmente a cada duas semanas). Consulte a visão geral do GKI para mais detalhes sobre o monitoramento de KMI.
Fase congelada do KMI
Antes que uma nova versão da plataforma seja enviada para o AOSP, a ramificação do ACK KMI é congelada e permanece assim durante toda a vida útil da ramificação. Isso significa que nenhuma mudança que quebre o KMI será aceita, a menos que um problema de segurança grave seja identificado e não possa ser mitigado sem afetar o KMI estável. Para evitar falhas na 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 atual não seja interrompido. 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 interrompidas por mudanças futuras.
Por exemplo, uma mudança que adiciona um campo a uma estrutura usada por uma interface KMI do kernel comum não é permitida porque muda 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 não é um problema:
struct foo2 {
struct foo orig_foo;
int new_field;
};
int do_foo2(struct foo2 &myarg)
{
do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);
Durante todo o ciclo de vida do kernel GKI, a compatibilidade com versões anteriores do espaço do usuário é mantida para que o kernel possa ser usado com segurança na versão da plataforma Android com que o dispositivo foi lançado. Os testes contínuos com versões anteriores
mantêm a compatibilidade. Portanto, na Figura 2, o kernel android15-6.6
pode ser usado em dispositivos com Android 15 e versões mais recentes. Como a versão da plataforma Android também é compatível com versões anteriores, o kernel android14-6.1
pode ser usado em dispositivos Android 15 para lançamento ou upgrade.
Número de geração do KMI
Se houver uma fusão de LTS durante a fase de estabilização ou um problema de segurança ou
outro evento após isso que exija a aceitação de um patch de mudança de KMI, o
número de geração de KMI registrado em build.config.common
será incrementado. A geração atual do KMI pode ser encontrada usando o comando uname
:
$ uname -r
6.6.30-android15-6-g86d10b30f51f
O número após o lançamento da plataforma é a geração do KMI (6
neste caso).
Se a geração de KMI mudar, o kernel não será compatível com módulos do fornecedor que estejam de acordo com a geração de KMI anterior. Portanto, os módulos precisam ser recriados e atualizados de forma síncrona com o kernel. Após o congelamento do KMI, as mudanças na geração do KMI devem ser muito raras.
Compatibilidade entre kernels
Os requisitos de compatibilidade entre kernels na mesma família LTS vão mudar com os novos kernels GKI.
Kernels de GKI
Os kernels da GKI mantêm a compatibilidade com versões anteriores de todas as versões da plataforma Android que ofereciam suporte à versão do kernel. Além disso, as versões da plataforma Android são compatíveis com versões anteriores de kernels GKI. Assim, você pode usar com segurança o kernel android14-6.1
desenvolvido para o Android 14 (2023) em dispositivos com o Android 15 (2024). A compatibilidade é verificada por testes contínuos de VTS e CTS dos kernels da GKI com todas as versões compatíveis.
A KMI é estável para que o kernel possa ser atualizado sem exigir uma recriação dos módulos do kernel na imagem do fornecedor.
A compatibilidade da KMI não é mantida entre diferentes kernels GKI. Por exemplo, um kernel android14-6.1
não pode ser substituído por um kernel android15-6.6
sem a reconstrução de todos os módulos.
Os kernels GKI são compatíveis apenas com as versões inicial e subsequentes.
Elas não são compatíveis com versões mais antigas. Portanto, um kernel
android15-6.6
não é compatível com dispositivos que executam o
Android 14 (2023).
Matriz de compatibilidade
Esta tabela mostra as versões do kernel compatíveis e testadas com cada lançamento da plataforma Android.
Versão da plataforma Android | Kernels compatíveis |
---|---|
Android 16 (2025) |
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
Android 15 (2024) |
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
Android 14 (2023) |
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
Android 13 (2022) |
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
|
Android 12 (2021) |
android12-5.10
android12-5.4
android11-5.4
|
Ciclos de vida de suporte e patches de segurança
Os ACKs recebem fusões de 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 do Android mensais relevantes para o ACK.
Os ACKs podem ter suporte por mais tempo do que o kernel estável upstream correspondente em kernel.org. Nesse caso, o Google oferece suporte estendido até a data de fim de vida útil (EOL) mostrada nesta seção. Quando os kernels chegam ao fim da vida útil, eles não são mais compatíveis com o Google, e os dispositivos que os executam são considerados vulneráveis.
A partir do kernel 6.6, o ciclo de vida de suporte para os kernels estáveis é de quatro anos.
Esta tabela mostra os tempos de vida útil dos ACKs compatíveis:
Ramificação ACK | Data de lançamento |
Support lifetime (years) |
EOL |
---|---|---|---|
android11-5.4 | 2019-11-24 | 6 | 2026-01-01 |
android12-5.4 | 2019-11-24 | 6 | 2026-01-01 |
android12-5.10 | 2020-12-13 | 6 | 2027-07-01 |
android13-5.10 | 2020-12-13 | 6 | 2027-07-01 |
android13-5.15 | 2021-10-31 | 6 | 2028-07-01 |
android14-5.15 | 2021-10-31 | 6 | 2028-07-01 |
android14-6.1 | 2022-12-11 | 6 | 2029-07-01 |
android15-6.6 | 2023-10-29 | 4 | 2028-07-01 |
android16-6.12 | 2024-11-17 | 4 | 2029-07-01 |
Teste comum de kernel
Os kernels comuns são testados com vários sistemas de CI, além de testes downstream feitos por fornecedores.
Teste funcional do kernel do Linux
O teste funcional do kernel do Linux (LKFT) inicia 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 na página android-lkft.
Teste do KernelCI
Os testes de build e inicialização do KernelCI são iniciados sempre que um novo patch é confirmado em uma ramificação do kernel comum. Centenas de configurações de build são testadas e inicializadas em várias placas. Os resultados recentes para kernels do Android podem ser encontrados no site KernelCL.
Testes de pré 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 dos resultados do teste pode ser encontrado na guia "Verificações" da mudança de código no kernel comum do Android gerrit.
Os testes pós-envio do Android são realizados
em novas builds publicadas nas ramificações do kernel comum do Android quando novos patches são
confirmados em uma ramificação do kernel comum do Android em ci.android.com. Ao
inserir aosp_kernel
como um nome de ramificação parcial em ci.android.com, você
vai ver uma lista de ramificações do kernel com
resultados disponíveis. Por exemplo, os resultados de android-mainline
podem ser encontrados no
painel de integração contínua de builds do Android (Android CI). Clique em um build específico para encontrar o status do teste na guia Test Results
.
Os testes definidos por test-mapping
com o grupo de teste kernel-presubmit
na árvore de origem da plataforma Android são executados como
pré-envio para ramificações do kernel do Android. Por exemplo, a configuração a seguir em
test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING
ativa vts_kernel_proc_file_api_test
como um teste de pré-envio no check-in do código
do kernel comum do Android.
{
"kernel-presubmit": [
{
"name": "vts_kernel_proc_file_api_test"
}
]
}
Teste de dia zero
O teste de dia zero realiza testes patch a patch em todas as ramificações do kernel comum do Android quando novos patches são confirmados. Vários testes de inicialização, funcionais e de desempenho são executados. Participe do grupo público cros-kernel-buildreports.
Matriz de teste
Kernel comum do Android | Versões da plataforma Android | Pacotes de testes | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Principal | 16 | 15 | 14 | 13 | 12 | LKFT | KernelCI | Pré-envio | Pós-envio | 0 dia | |
android-mainline
|
✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android16-6.12
|
✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android15-6.6
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android14-6.1
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Contribuir com kernels comuns do Android
Em geral, o desenvolvimento de recursos deve ser feito no Linux principal e não em kernels comuns do Android. O desenvolvimento upstream é altamente recomendado e, depois que o desenvolvimento é aceito, ele pode ser portado para a ramificação específica do ACK, 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 o Gerrit e siga estas diretrizes de contribuição.