O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Controle de versão GKI

Esta página descreve o esquema de controle de versão para imagens genéricas do kernel (GKIs). Um kernel genérico Imagem (GKI) tem um identificador único chamado de versão do kernel. O lançamento 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 oferecer suporte a vários lançamentos de kernel. Uma versão do kernel está vinculada a apenas uma versão do KMI. No caso improvável em que a interface do módulo do kernel tenha que ser alterada, a geração KMI é iterada para refletir a alteração na versão KMI.

Resumo dos termos

A tabela a seguir resume os 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 único para um lançamento GKI. Este é o valor retornado pelo 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 y 42 Descreve a ordem de lançamento dos lançamentos do kernel na mesma versão KMI.

A tabela a seguir lista outros termos relacionados como referência.

Nome Símbolo Exemplo Descrição
wxy wxy 5.4.42

Para mais detalhes, consulte Linux Kernel Makefiles (procure por "KERNELRELEASE").

WXY é usado diretamente ao longo deste documento. Este também é comumente referido como o número da versão de três partes. O termo usado em VINTF, versão do kernel, pode causar confusão com outros termos, especialmente w.

Esta variável é referido como kernel_version_tuple em libkver .

Esta tupla não deve ser diminuída por nenhuma atualização, incluindo OTA ou linha principal.

Ramificação do kernel zzz-wx android12-5.4 Este termo é usado em comuns do kernel tipos de filiais .
Versão C 5 Este termo não é usado neste documento. Esta variável é referido como a versão em libkver .
Nível de patch x 4 Este termo não é usado neste documento. Esta variável é referido como patch_level em libkver .
Versão Android zzz android12

Este é o número da versão do Android (sobremesa) ao qual o kernel está associado.

Quando se compara a AndroidRelease campo, a parte numérica é extraído a partir da cadeia para comparação.

O número de versão do Android não deve ser diminuído por nenhuma atualização, incluindo OTA ou linha principal.

Geração 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, uma geração KMI será aumentada.

O número de geração KMI começa com 0.

Design de controle de versão

Lançamento do kernel

Definição

Para dispositivos que vêm 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 mais informações, consulte Determinar versão do kernel de um dispositivo .

A seguir está um exemplo de uma versão do kernel.

5.4.42-android12-0-00544-ged21d463f856

Descrição

O lançamento do kernel é o ID exclusivo de um lançamento GKI. Se dois binários GKI tiverem a mesma versão de kernel, eles devem ser idênticos em termos de bytes.

Uma versão do kernel consiste em uma versão KMI, um sub-ní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

Note-se que o sub-nível, y não é parte da versão KMI. Para o exemplo na versão do 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 têm a mesma versão KMI, elas implementam 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 KMI não deve ser diminuída por nenhuma atualização OTA.

Subnível

O sub-nível, y , descreve a ordem de liberação de versões do kernel dentro da mesma versão KMI.

Para duas versões do kernel que têm a mesma versão KMI, mas têm sub-nível Y1 e Y2, respectivamente:

  • Se Y1 for menor ou igual a Y2, um dispositivo executando Y1 pode receber uma atualização para Y2.
  • Se Y1 for maior que Y2, um dispositivo executando Y1 não pode ser atualizado para Y2.

Ou seja, se a versão KMI não mudar, o subnível não deve ser diminuído por nenhuma atualização OTA.

Determinar a liberação do kernel de um dispositivo

A versão do kernel completo pode ser encontrado 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 o propósito deste documento, qualquer coisa após a geração do KMI é ignorada ao extrair as informações do kernel. Mais formalmente, a saída de uname -r é analisado com o seguinte regex (assumindo 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 ci.android.com número de compilação, número de patches em cima do kernel da linha de base, e hashes SHA do git commit.

libkver

A biblioteca, libkver, fornece uma interface C ++ para analisar a versão do kernel ou uma string de versão KMI. Para obter uma lista de APIs que libkver expõe, ver packages/modules/Gki/libkver/include/kver .

Verificações VINTF

Para 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 mais detalhes, veja regras de jogo do kernel VINTF .

A partir do 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.

Porque os requisitos de configuração do kernel geralmente não mudam, não há necessidade de codificar k dentro da matriz de compatibilidade. No entanto, no caso improvável em que o requisito de configuração do kernel precise ser alterado, assegure-se do seguinte:

  • O requisito correspondente da matriz de compatibilidade é removido.
  • Testes VTS adicionais são adicionados para verificar os novos requisitos condicionais à geração de KMI.

Versão da imagem de inicialização em metadados OTA

Mesmo se a imagem de inicialização é atualizado através de OTA uma atualização, ele deve ser envolvido na carga formato OTA, payload.bin . A carga útil OTA codifica uma version campo para cada partição. Quando update_engine lida com uma carga útil OTA, ele compara esse campo para garantir a partição não é rebaixado.

Para confusão evitar, a version de campo para a partição de boot nos metadados OTA é chamado boot image version .

Porque o disco RAM é sempre construído a partir do zero, usando o timestamp ramdisk é suficiente para descrever a imagem de inicialização todo. Não há necessidade de codificar a liberação do kernel na versão da imagem de inicialização, a menos que você esteja juntando 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.