Esta página descreve o esquema de controle de versão para imagens genéricas de kernel (GKIs). Uma imagem genérica do kernel (GKI) possui um identificador exclusivo chamado versão do kernel. A versão do kernel consiste na versão da interface do módulo do kernel (KMI) e no subnível. A versão do kernel é específica para a imagem que está sendo lançada, enquanto a versão KMI representa a interface a partir da qual uma versão é construída. Uma versão KMI pode suportar vários lançamentos de kernel. Uma versão do kernel está vinculada a apenas uma versão do KMI. No caso improvável de a interface do módulo do kernel precisar ser alterada, a geração do KMI é iterada para refletir a mudança na versão do KMI.
Resumo dos termos
A tabela a seguir resume termos importantes usados nesta página e para atualizações do GKI.
Nome | Símbolo | Exemplo | Descrição |
---|---|---|---|
Lançamento do kernel | wxy-zzz-k-sufixo | 5.4.42-android12-0-foo | Identificador exclusivo para uma versão do GKI. Este é o valor retornado por uname . |
Versão KMI | wx-zzz-k | 5.4-android12-0 | Descreve a interface do módulo do kernel (KMI) entre o GKI e os módulos do kernel carregáveis dinamicamente (DLKM). |
Subnível | sim | 42 | Descreve a ordem de lançamento dos lançamentos do kernel na mesma versão do KMI. |
A tabela a seguir lista outros termos relacionados como referência.
Nome | Símbolo | Exemplo | Descrição |
---|---|---|---|
wxy | wxy | 5.4.42 | Para obter detalhes, consulte Makefiles do Kernel Linux (procure por "KERNELREELEASE"). wxy é usado diretamente neste documento. Isso também é comumente chamado de número de versão de três partes . O termo usado no VINTF, versão do kernel , pode causar confusão com outros termos, especialmente w . Esta variável é referida como kernel_version_tuple em libkver . Esta tupla não deve ser diminuída por nenhuma atualização, incluindo OTA ou linha principal. |
Ramo do kernel | zzz-wx | android12-5.4 | Este termo é usado em tipos comuns de ramificação do kernel . |
Versão | c | 5 | Este termo não é usado neste documento. Esta variável é chamada de versão em libkver . |
Nível de correção | x | 4 | Este termo não é usado neste documento. Esta variável é referida como patch_level em libkver . |
Lançamento do Android | zzz | andróide12 | Este é o número da versão do Android (sobremesa) ao qual o kernel está associado. Ao comparar o campo O número de lançamento do Android não deve ser diminuído por nenhuma atualização, incluindo OTA ou linha principal. |
Geração de KMI | k | 0 | Este é um número adicional adicionado para lidar com eventos improváveis. Se uma correção de bug de segurança exigir alterações no KMI na mesma versão do Android, a geração de KMI será aumentada. O número de geração do KMI começa com 0. |
Design de versionamento
Lançamento do kernel
Definição
Para dispositivos fornecidos com GKI, a versão do kernel é definida da seguinte forma:
KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w .x .y -zzz -k -something
Para obter mais informações, consulte Determinando a versão do kernel de um dispositivo .
A seguir está um exemplo de lançamento de kernel.
5.4.42-android12-0-00544-ged21d463f856
Descrição
A versão do kernel é o ID exclusivo de uma versão do GKI. Se dois binários GKI tiverem a mesma versão de kernel, eles deverão ser idênticos em bytes.
Uma versão do kernel consiste em uma versão KMI, um subnível e um sufixo. Para os fins deste documento, o sufixo após a geração do KMI é ignorado.
Versão KMI
Definição
A versão KMI é definida da seguinte forma:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
Observe que o subnível y
não faz parte da versão KMI. Para o exemplo na versão Kernel , a versão KMI é:
5.4-android12-0
Descrição
A versão KMI descreve a interface do módulo do kernel (KMI) entre o GKI e os módulos do kernel carregáveis dinamicamente (DLKM).
Se duas versões do kernel tiverem a mesma versão do KMI, elas implementarão a mesma interface de módulo do kernel. Os DLKMs compatíveis com um também são compatíveis com o outro.
A versão do KMI não deve ser diminuída por nenhuma atualização OTA.
Subnível
O subnível, y
, descreve a ordem de lançamento dos lançamentos do kernel dentro da mesma versão do KMI.
Para duas versões do kernel que possuem a mesma versão do KMI, mas possuem os subníveis Y1 e Y2, respectivamente:
- Se Y1 for menor ou igual a Y2, um dispositivo executando Y1 poderá receber uma atualização para Y2.
- Se Y1 for maior que Y2, um dispositivo executando Y1 não poderá ser atualizado para Y2.
Ou seja, se a versão do KMI não mudar, o subnível não deverá ser diminuído por nenhuma atualização OTA.
Determinando a versão do kernel de um dispositivo
A versão completa do kernel pode ser encontrada executando uname -r
ou uname(2)
com o seguinte trecho de código:
std::string get_kernel_release() {
struct utsname buf;
return uname(&buf) == 0 ? buf.release : "";
}
Um exemplo de saída é:
5.4.42-android12-0-00544-ged21d463f856
Para os fins deste documento, qualquer coisa após a geração do KMI será ignorada ao extrair informações do kernel. Mais formalmente, a saída de uname -r
é analisada com o seguinte regex (assumindo que zzz sempre começa com "android"):
^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$
As informações ignoradas podem incluir informações como o número de compilação ci.android.com , número de patches no topo do kernel de linha de base e hashes SHA do commit do git.
biblioteca
A biblioteca, libkver, fornece uma interface C++ para analisar a versão do kernel ou uma string de versão do KMI. Para obter uma lista de APIs expostas pelo libkver, consulte packages/modules/Gki/libkver/include/kver
.
Verificações VINTF
Para o Android 11 ou inferior, a parte de lançamento do Android da versão KMI é especificada manualmente no manifesto do dispositivo pelos fabricantes do dispositivo. Para obter detalhes, consulte Regras de correspondência do kernel VINTF .
No Android S, a parte de lançamento do Android da versão KMI pode ser extraída do kernel e injetada no manifesto do dispositivo no momento da compilação.
Como os requisitos de configuração do kernel geralmente não mudam, não há necessidade de codificar k
na matriz de compatibilidade. No entanto, no caso improvável em que o requisito de configuração do kernel precise ser alterado, certifique-se do seguinte:
- O requisito correspondente da matriz de compatibilidade é removido.
- Testes VTS adicionais são adicionados para verificar os novos requisitos condicionados à geração do KMI.
Versão da imagem de inicialização nos metadados OTA
Mesmo que a imagem de inicialização seja atualizada por meio de uma atualização OTA, ela deverá ser agrupada no formato de carga útil OTA, payload.bin
. A carga OTA codifica um campo version
para cada partição. Quando update_engine
manipula uma carga útil OTA, ele compara esse campo para garantir que a partição não seja rebaixada.
Para evitar confusão, o campo version
da partição de inicialização nos metadados OTA é chamado de boot image version
.
Como o ramdisk é sempre construído do zero, usar o carimbo de data/hora do ramdisk é suficiente para descrever toda a imagem de inicialização. Não há necessidade de codificar a versão do kernel na versão da imagem de inicialização, a menos que você esteja unindo uma imagem de inicialização antiga a um novo binário do kernel no futuro.
Antes de uma atualização OTA, o cliente OTA verifica a versão da imagem de inicialização da mesma forma que qualquer outra partição.