Kernels comuns do AOSP (também conhecidos como os 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 incluídos nas versões principal Kernels com suporte de longo prazo (LTS). Esses patches podem incluir:
- Backports e seleções de funcionalidades upstream necessárias para o Android atributos
- 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 de recursos do Android. Linux
a linha principal é mesclada em android-mainline
sempre que Linus Torvalds posta um
candidata a lançamento ou lançamento. Antes de 2019, os kernels comuns do Android eram
construído clonando o kernel do LTS recentemente declarado e adicionando o
Patches específicos do Android. Esse processo mudou em 2019 para ramificar o novo Android
kernel comum de android-mainline
. Esse novo modelo evita a sobrecarga
esforço para encaminhar portas e testar patches do Android com o mesmo resultado
de forma incremental. O android-mainline
passa por testes contínuos significativos,
garante um kernel de alta qualidade desde o dia em que é publicado.
Quando um novo LTS é declarado de forma upstream, o kernel comum correspondente é ramificado
a partir de android-mainline
. Isso permite que os parceiros iniciem um projeto antes do
declaração da versão do LTS, mesclando do android-mainline
. Após o
uma nova ramificação comum do kernel for criada, os parceiros poderão alterar a mesclagem
origem para a nova ramificação.
Outras ramificações de kernel comuns recebem mesclagens regulares dos respectivos
Kernel do LTS:
Normalmente, essas mesclagens são feitas imediatamente após a publicação da versão do LTS. Para
Por exemplo, quando o Linux 6.1.75 foi publicado, ele foi mesclado com a versão 6.1
kernel (android14-6.1
). É altamente recomendável que os parceiros
atualizar os kernels para ficarem em dia com as correções de bugs específicas do LTS e do Android.
Ramificação de kernel ACK KMI
Os kernels de GKI têm uma interface de módulo do kernel estável. O KMI é único
identificada pela versão do kernel e pela versão da plataforma Android, de modo que a
as ramificações são nomeadas
ANDROID_RELEASE
-KERNEL_VERSION
.
Por exemplo, a GKI 6.1
do kernel do Android 14 é chamado de android14-6.1
. Para
Android 15 (AOSP experimental), o kernel de GKI android15-6.6
era
surgiu.
Apresentar e lançar kernels
Antes do Android 15 (AOSP experimental), qualquer um dos três kernels mais recentes
pode ser usado para a inicialização de dispositivos. Começando com
Android 15 (AOSP experimental), as duas versões mais recentes do kernel podem
ser usado na inicialização do dispositivo. Os kernels de lançamento para
O Android 15 (AOSP experimental) é android15-6.6
e android14-6.1
.
Porque os upgrades do kernel não são necessários ao atualizar a plataforma
lançamento, os kernels que não têm os recursos mais recentes para um lançamento de plataforma podem
ainda pode ser usado para iniciar dispositivos. Portanto, os kernels que foram projetados para
O Android 14, como android14-6.1
, pode ser usado em
mesmo depois de fazer upgrade da versão da plataforma para
Android 15 (AOSP experimental).
Versão da plataforma Android | Iniciar kernels | Kernels de atributos |
---|---|---|
Android 15 (AOSP experimental) (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.101
|
android14-6.1
android14-5.15
|
Android 13 (2022) |
android13-5.15
android13-5.10
android12-5.101
android12-5.41
android11-5.41
|
android13-5.15
android13-5.10
|
Android 12 (2021) |
android12-5.10
android12-5.4
android11-5.41
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 foi atualizado para o lançamento da plataforma. Em termos mais gerais, Número da versão do Android do kernel deve ser maior ou igual ao versão de destino do FCM. Consulte Objeto da interface do fornecedor: corresponder às ramificações do kernel para mais detalhes. |
Hierarquia comum do kernel
Ramificação de android-mainline
O nível superior da hierarquia comum do kernel é mostrado na figura 1.
Figura 1. Como criar kernels comuns usando o kernel android-mainline
Observe que 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 v5.15 são android13-5.15
e android14-5.15
,
Ambos são kernels de recursos para as respectivas versões de plataforma. Isso
também foi o caso do 5.10, A android12-5.10
foi criada quando o LTS foi
declarado e android13-5.10
ramificado de android12-5.10
no kernel
marco completo do recurso no segundo semestre de 2021 para permitir o desenvolvimento de recursos para
Android 13 Começando com o Android
15 (AOSP experimental) (2024), haverá apenas
um novo kernel de 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 ACK KMI é mostrado abaixo na figura 2.
Figura 2. 6.6 Ciclo de vida da ramificação KMI ACK
Para esclarecer o processo de desenvolvimento e o ciclo de vida das ramificações, a Figura 2 foca no Ramificações ACK KMI para 6.6.
Cada ramificação ACK KMI passa por três fases indicadas na Figura 2 por cores diferentes em cada ramificação. Como mostrado, o LTS é integrado regularmente, independentemente da fase.
Fase de desenvolvimento
Quando é criada, uma ramificação ACK KMI entra na fase de desenvolvimento (rotulada como
dev na Figura 2) e está aberto a contribuições de recursos para o próximo lançamento
uma nova plataforma. Na Figura 2, android15-6.6
foi criado quando a versão 6.6
declarado como o novo kernel do LTS upstream.
Fase de estabilização
Quando a ramificação ACK KMI é declarada como recurso completo, ela entra no fase de estabilização (identificada como estável na Figura 2). Recursos de parceiros e correções de bugs ainda são aceitas, mas o acompanhamento KMI está ativado para detectar quaisquer alterações que afetam a interface. Nessa fase, são aceitas alterações interruptivas do KMI e a definição KMI é atualizada em um ritmo predefinido (normalmente a cada dois semanas). Consulte a Visão geral do GKI para detalhes sobre o monitoramento do KMI.
Fase congelada do KMI
Antes de uma nova versão da plataforma ser enviada ao 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ças interruptivas do KMI são aceitas, a menos que um problema grave de segurança seja identificado que não podem ser atenuadas sem afetar o KMI estável. Para evitar o KMI de segurança, alguns patches mesclados com o LTS podem ser modificados ou descartados não é necessário 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 corrompido. O KMI pode ser estendido com novos símbolos exportados, desde que as interfaces compreendendo o KMI atual não são afetadas. Quando novas interfaces são adicionadas ao KMI, elas imediatamente se tornar estável e não ser corrompida por alterações futuras.
Por exemplo, uma mudança que adiciona um campo a uma estrutura usada por uma interface KMI kernel comum não é permitido porque ele 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 todo o ciclo de vida do kernel de GKI, a compatibilidade com versões anteriores do espaço do usuário é
mantidos para que o kernel possa ser usado com segurança pela plataforma Android
com o qual o dispositivo foi iniciado. Testes contínuos com versões anteriores
garante que a compatibilidade seja mantida. Na Figura 2, a android15-6.6
O kernel pode ser usado para dispositivos Android 15 (AOSP experimental) e mais recentes
dispositivos. 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 (AOSP experimental) para lançamento ou upgrade.
Número de geração do KMI
Se houver uma mesclagem de LTS durante a fase de estabilização, um problema de segurança ou
outro evento que exija a aceitação de um patch de alteração do KMI, o
O número de geração de KMI registrado em build.config.common
é incrementado. A
a geração do KMI atual 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 de 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 reconstruídos atualizada de forma síncrona com o kernel. Após o congelamento do KMI, a geração do KMI muda são muito raras.
Compatibilidade entre kernels
Os requisitos de compatibilidade entre kernels na mesma família de LTS são mudando começando com os novos kernels de GKI.
Kernels de GKI
Os kernels de GKI mantêm a compatibilidade com versões anteriores em toda a Plataforma Android
com suporte para a versão do kernel. Além disso, a plataforma Android
são compatíveis com versões anteriores dos kernels de GKI. Então,
você pode usar com segurança o kernel android14-6.1
desenvolvido para
Android 14 (2023) em dispositivos com
Android 15 (AOSP experimental) (2024). A compatibilidade é verificada por
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 de KMI não é mantida entre diferentes kernels de GKI. Então,
Por exemplo, um kernel android14-6.1
não pode ser substituído por um android15-6.6
.
sem precisar recriar todos os módulos.
Os kernels de GKI têm suporte apenas para as versões inicial e subsequente.
Elas não são compatíveis com versões mais antigas. Então,
O kernel android15-6.6
não tem suporte para dispositivos em execução
Android 14 (2023).
Matriz de compatibilidade
Esta tabela mostra as versões do kernel com suporte e testadas em cada versão do Android uma nova plataforma.
Versão da plataforma Android | Kernels com suporte para upgrade | Kernels com suporte para lançamento |
---|---|---|
Android 15 (AOSP experimental) (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
|
Ciclo de vida e patches de segurança
ACKs recebem mesclas de 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 na documentação Android Boletins de segurança que são relevantes para a ACK.
ACKs podem ter suporte por mais tempo que o kernel estável upstream correspondente em kernel.org. Nesse caso, o Google oferece suporte estendido até a data de fim da vida útil (EOL) mostrada neste nesta seção. Quando os kernels passam por EOL, eles não são mais pelo Google, e os dispositivos que os executam são considerados vulneráveis.
A partir do kernel 6.6, o ciclo de vida do suporte para os kernels estáveis é 4 anos.
Esta tabela mostra os ciclos de vida das ACKs com suporte:
Ramificação ACK | Data de lançamento |
Vida útil do suporte (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 |
Teste comum do kernel
Os kernels comuns são testados com vários sistemas de CI além de downstream os testes realizados pelos fornecedores.
Teste funcional do kernel do Linux
Teste funcional do kernel do Linux (LKFT, na sigla em inglês) de testes iniciam vários conjuntos de testes, incluindo kselftest, LTP, VTS e CTS em uma de dispositivos físicos arm32 e arm64. Os resultados de testes recentes podem ser encontrados aqui.
Teste do KernelCI
Os testes de build e inicialização do KernelCI são é iniciado 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. Recentes resultados para kernels do Android podem ser encontrados aqui.
Testes de pré e pós-envio do Android
Os testes de pré-envio são usados para evitar que falhas sejam introduzidas no Kernels comuns do Android. O resumo do resultado do teste pode ser encontrado em "Verificações" guia 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 forem confirmados em uma ramificação do kernel comum do Android em ci.android.com (link em inglês). Ao inserir
aosp_kernel
como um nome de ramificação parcial em ci.android.com, você vai conferir uma lista de ramificações do kernel com
resultados disponíveis. Por exemplo, é possível encontrar resultados para android-mainline
aqui. Ao clicar em um build específico, você vai encontrar 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 um 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. Diversos de inicialização, funcionalidade e desempenho. Participar do grupo público cros-kernel-buildreports (em inglês)
Matriz de teste
Kernel comum do Android | Lançamentos 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 os kernels comuns do Android
Geralmente, o desenvolvimento de recursos deve ser feito no Linux principal e não no Kernels comuns do Android. O desenvolvimento upstream é altamente recomendado e, após desenvolvimento é aceito lá, ele pode ser facilmente reportado para a rede ACK específica conforme necessário. A equipe do kernel do Android é felizes em apoiar os esforços de upstreaming para beneficiar o ecossistema Android.
Enviar patches para o Gerrit e se adequar a essas diretrizes de contribuição.