Os kernels comuns do AOSP (também conhecidos como kernels comuns do Android ou ACKs) são downstream dos kernels do kernel.org e incluem patches de interesse para a comunidade do Android que não foram mesclados em kernels principais ou de suporte de longo prazo (LTS, na sigla em inglês). 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
- Recursos do fornecedor/OEM que são úteis para outros parceiros do ecossistema
android-mainline
é a principal ramificação de desenvolvimento para recursos do Android. A linha
principal do Linux é mesclada em android-mainline
sempre que Linus Torvalds posta uma
versão ou candidato a versão. 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 a partir de android-mainline
. Esse novo modelo evita o esforço
significativo para encaminhar e testar patches do Android, alcançando o mesmo resultado
de forma incremental. O android-mainline
passa por testes contínuos significativos. Esse
modelo garante um kernel de alta qualidade desde o dia em que é publicado.
Quando um novo LTS é declarado upstream, o kernel comum correspondente é ramificado
a partir de android-mainline
. Isso permite que os parceiros iniciem um projeto antes da
declaração da versão LTS, mesclando a partir de android-mainline
. Depois que a
nova ramificação do kernel comum é criada, os parceiros podem mudar a origem
da mesclagem para a nova ramificação.
Outras ramificações comuns do kernel recebem mesclagens regulares do
kernel LTS associado.
Normalmente, essas mesclagens são feitas imediatamente após a publicação da versão do LTS. Por
exemplo, quando o Linux 6.1.75 foi publicado, ele foi mesclado ao kernel
comum 6.1 (android14-6.1
). Recomendamos que os parceiros
atualizem os kernels para ficarem atualizados com o LTS e correções de bugs específicos do Android.
Ramificação do kernel do ACK KMI
Os kernels do GKI têm uma interface estável de módulo de kernel. O KMI é identificado de forma exclusiva
pela versão do kernel e pela versão da plataforma Android. Portanto, as
filiais são nomeadas
ANDROID_RELEASE
-KERNEL_VERSION
.
Por exemplo, o kernel GKI 6.1
para o Android 14 é chamado de android14-6.1
. No
Android 15, o kernel de GKI android15-6.6
foi
lançado.
Kernels de recurso e de inicialização
Antes do Android 15, qualquer um dos três kernels mais recentes
poderia ser usado para a inicialização do dispositivo. A partir do
Android 15, as duas versões mais recentes do kernel podem
ser usadas para inicialização do dispositivo. Os kernels de inicialização do
Android 15 são android15-6.6
e android14-6.1
.
Como os upgrades do 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 para uma versão da plataforma ainda
podem ser usados para iniciar dispositivos. Portanto, os kernels criados para
o Android 14, como o android14-6.1
, podem ser usados em
dispositivos mesmo após o upgrade da versão da plataforma para
o Android 15.
Versão da plataforma Android | Iniciar kernels | Kernels de recursos |
---|---|---|
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
android-4.19-stable
|
android12-5.10
android12-5.4
|
Android 11 (2020) |
android11-5.4
android-4.19-stable
|
android11-5.4
android-4.19-stable
|
1 Outras restrições poderão ser aplicadas se o BSP associado tiver sido atualizado para a versão da plataforma. Em termos mais gerais, o número da versão do Android do kernel precisa ser maior ou igual à versão de destino do FCM. Consulte Objeto de interface do fornecedor: correspondência de ramos do kernel para mais detalhes. |
Hierarquia de kernel comum
Ramificação do android-mainline
O nível superior da hierarquia do kernel comum é mostrado na Figura 1.
Figura 1. Como criar kernels comuns usando o kernel android-mainline
Um novo kernel comum do Android android14-6.1
foi ramificado de
android-mainline
em 2022. Em 2023, quando o próximo LTS foi declarado,
android15-6.6
foi ramificado de android-mainline
.
Como mostrado na Figura 1, cada versão pode ser a base para dois kernels de GKI.
Por exemplo, os dois kernels da v5.15 são android13-5.15
e android14-5.15
,
ambos são kernels de recursos para as respectivas versões da plataforma. Isso
também foi o caso da versão 5.10. android12-5.10
foi criado quando o LTS foi
declarado e android13-5.10
foi ramificado de android12-5.10
no marco de conclusão do recurso
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 ACK KMI
O ciclo de vida de uma ramificação de KMI do ACK é mostrado abaixo na Figura 2.
Figura 2. 6.6 Ciclo de vida da ramificação da ACK KMI
Para esclarecer o processo de desenvolvimento e o ciclo de vida das ramificações, a Figura 2 se concentra nas ramificações ACK KMI da versão 6.6.
Cada ramificação da KMI do ACK passa por 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, uma ramificação de KMI do ACK entra na fase de desenvolvimento (identificada 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 o 6.6 foi
declarado como o novo kernel LTS upstream.
Fase de estabilização
Quando a ramificação KMI do ACK é declarada como recurso concluído, ela entra na fase de estabilização (rotulada como estável na Figura 2). Recursos de parceiros e correções de bugs ainda são aceitos, mas o acompanhamento de KMI está ativado para detectar qualquer mudança que afete a interface. Nessa fase, as mudanças que quebram o 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 de GKI para conferir detalhes sobre o monitoramento de KMI.
Fase congelada da KMI
Antes que uma nova versão da plataforma seja enviada para o AOSP, a ramificação ACK KMI está congelada e permanece congelada durante todo o ciclo de vida da ramificação. Isso significa que nenhuma mudança que quebre o KMI é aceita, a menos que um problema de segurança grave seja identificado que não possa ser mitigado sem afetar o KMI estável. Para evitar falhas no 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 do KMI do ACK é congelada, correções de bugs e recursos do parceiro podem ser aceitos, desde que o kernel comum do KMI não esteja corrompido. 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 imediatamente 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 um kernel comum de interface do KMI 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, a adição de uma nova função é aceitável:
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 do GKI, a compatibilidade 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 que o dispositivo foi lançado. O teste contínuo com versões anteriores
garante a manutenção da compatibilidade. Na Figura 2, o kernel android15-6.6
pode ser usado para dispositivos Android 15 e 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
para dispositivos Android 15 para lançamento ou atualização.
Número de geração do KMI
Se houver uma mesclagem 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 de KMI pode ser encontrada usando o comando uname
:
$ uname -r
6.6.30-android15-6-g86d10b30f51f
O número após a versão da plataforma é a geração do KMI (6
, neste caso).
Se a geração do KMI mudar, o kernel não será compatível com os módulos do fornecedor que estão em conformidade com a geração anterior do KMI. 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 serão muito raras.
Compatibilidade entre kernels
Os requisitos de compatibilidade entre kernels na mesma família LTS estão mudando, começando pelos novos kernels do GKI.
Kernels de GKI
Os kernels da GKI mantêm a compatibilidade com versões anteriores de todas as plataformas
do Android que oferecem suporte à versão do kernel. Além disso, as versões da plataforma
Android são compatíveis com versões anteriores do kernel GKI. Assim,
é possível 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 meio de
testes contínuos de VTS e CTS dos kernels de GKI com todas as versões com suporte.
O 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 do KMI não é mantida entre diferentes kernels do GKI. Portanto,
por exemplo, um kernel android14-6.1
não pode ser substituído por um android15-6.6
sem recriar todos os módulos.
Os kernels do GKI têm suporte apenas para as versões iniciais e subsequentes.
Elas não são compatíveis com versões mais antigas. Portanto, um
kernel android15-6.6
não oferece suporte a dispositivos com o
Android 14 (2023).
Matriz de compatibilidade
Esta tabela mostra as versões do kernel com suporte e testadas com cada versão da plataforma Android.
Versão da plataforma Android | Kernels com suporte para upgrade | Kernels com suporte para inicialização |
---|---|---|
Android 15 (2024) |
android15-6.6
|
android15-6.6
|
Android 14 (2023) |
android14-6.1
|
android14-6.1
|
Android 13 (2022) |
android13-5.15
|
android13-5.15
|
Android 12 (2021) |
android12-5.10
|
android-4.19-stable
|
Android 11 (2020) |
android11-5.4
|
android11-5.4
|
Suporte a tempos de vida e patches de segurança
Os ACKs recebem mesclagens 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 que são relevantes para a 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 têm mais suporte do Google, e os dispositivos que os executam são considerados vulneráveis.
A partir do kernel 6.6, o período de suporte para os kernels estáveis é de 4 anos.
Esta tabela mostra as durações dos ACKs compatíveis:
Ramificação ACK | Data de lançamento |
Suporte vida útil (anos) |
EOL |
---|---|---|---|
android-4.19-stable | 2018-10-22 | 6 | 2025-01-01 |
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 |
Testes comuns do kernel
Os kernels comuns são testados com vários sistemas de CI, além de testes downstream feitos pelos fornecedores.
Teste funcional do kernel do Linux
Os testes do Linux Kernel Functional Test (LKFT) inicializam vários conjuntos de testes, incluindo kselftest, LTP, VTS e CTS em um conjunto de dispositivos físicos arm32 e arm64. Confira os resultados de testes recentes aqui.
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. Várias centenas de configurações de build são testadas e inicializadas em várias placas. Os resultados mais recentes para kernels do Android podem ser encontrados aqui.
Testes antes e depois do envio no Android
Os testes de pré-envio são usados para evitar que falhas sejam introduzidas nos kernels comuns do Android. O resumo do resultado do teste pode ser encontrado na guia "Verificações" da mudança de código no kernel comum do Android gerrit.
O teste pós-envio do Android é realizado
em novos builds publicados em ramificações comuns do kernel do Android quando novos patches são confirmados em uma ramificação comum do kernel 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
aqui. Ao clicar em um build específico, você encontra o status do teste na guia Test Results
.
Os testes definidos por test-mapping com o grupo de testes kernel-presubmit
na árvore de origem da plataforma Android serão executados como pré-envio para as ramificações do kernel do Android. Por exemplo, seguir a configuração em test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING vai ativar o vts_kernel_proc_file_api_test como teste de presbunção no check-in do código comum do kernel do Android.
{
"kernel-presubmit": [
{
"name": "vts_kernel_proc_file_api_test"
}
]
}
Teste de 0 dia
O teste de dia 0 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. Participe do grupo público cros-kernel-buildreports
Matriz de teste
Kernel comum do Android | Versões da plataforma Android | Pacotes de teste | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Principal | 15 | 14 | 13 | 12 | 11 | 10 | LKFT | CI do kernel | Pré-envio | Pós envio | dia 0 | |
android-mainline
|
✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android15-6.6
|
✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android14-6.1
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android11-5.4
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
android-4.19-stable
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Contribuir com kernels comuns do Android
Geralmente, o desenvolvimento de recursos precisa ser feito no Linux principal e não em kernels comuns do Android. O desenvolvimento upstream é fortemente incentivado. Depois que o desenvolvimento é aceito, ele pode ser facilmente transferido de volta para a ramificação ACK específica, conforme necessário. A Equipe do kernel do Android fica feliz 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.