Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Control de versiones de GKI

Esta página describe el esquema de control de versiones para imágenes de kernel genéricas (GKI). Un núcleo genérico de imagen (GKI) tiene un identificador único llamado la liberación del núcleo. La versión del kernel consta de la versión de la interfaz del módulo del kernel (KMI) y el subnivel. La versión del kernel es específica de la imagen que se publica, mientras que la versión de KMI representa la interfaz a partir de la cual se construye una versión. Una versión de KMI puede admitir varias versiones de kernel. Una versión del kernel está vinculada a una sola versión de KMI. En el caso poco probable de que deba cambiarse la interfaz del módulo del kernel, la generación de KMI se repite para reflejar el cambio en la versión de KMI.

Resumen de términos

La siguiente tabla resume los términos importantes utilizados en esta página y para las actualizaciones de GKI.

Nombre Símbolo Ejemplo Descripción
Lanzamiento de kernel wxy-zzz-k-sufijo 5.4.42-android12-0-foo Identificador único para una versión de GKI. Este es el valor devuelto por uname .
Versión de KMI wx-zzz-k 5.4-android12-0 Describe la interfaz del módulo del kernel (KMI) entre GKI y los módulos del kernel cargables dinámicamente (DLKM).
Subnivel y 42 Describe el orden de lanzamiento de las versiones del kernel dentro de la misma versión de KMI.

La siguiente tabla enumera otros términos relacionados como referencia.

Nombre Símbolo Ejemplo Descripción
wxy wxy 5.4.42

Para más detalles, véase el Linux Kernel Makefile (búsqueda de "KERNELRELEASE").

wxy se utiliza directamente en este documento. Esto también se conoce comúnmente como el número de versión de tres partes. El término utilizado en VINTF, versión del núcleo, podría causar confusión con otros términos, especialmente w.

Esta variable se denomina kernel_version_tuple en libkver .

Esta tupla no debe reducirse con ninguna actualización, incluida la OTA o la línea principal.

Rama de kernel zzz-wx android12-5.4 Este término se utiliza en tipos rama común del núcleo .
Versión w 5 Este término no se utiliza en este documento. Esta variable se conoce como versión en libkver .
Nivel de parche X 4 Este término no se utiliza en este documento. Esta variable se denomina patch_level en libkver .
Lanzamiento de Android zzz android12

Este es el número de versión de Android (postre) con el que está asociado el kernel.

Al comparar la AndroidRelease campo, la parte numérica se extrae de la cadena para la comparación.

El número de versión de Android no debe reducirse con ninguna actualización, incluida la OTA o la línea principal.

Generación de KMI k 0

Este es un número adicional agregado para hacer frente a eventos poco probables. Si una corrección de error de seguridad requiere cambios en el KMI dentro de la misma versión de Android, se aumenta la generación de KMI.

El número de generación de KMI comienza con 0.

Diseño de versiones

Lanzamiento de kernel

Definición

Para los dispositivos que se envían con GKI, la versión del kernel se define de la siguiente manera:

KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w      .x         .y       -zzz           -k            -something

Para obtener más información, consulte Determinación de la aparición del núcleo de un dispositivo .

El siguiente es un ejemplo de una versión del kernel.

5.4.42-android12-0-00544-ged21d463f856

Descripción

La versión del kernel es el ID único de una versión de GKI. Si dos binarios de GKI tienen la misma versión de kernel, deben ser idénticos en bytes.

Una versión de kernel consta de una versión de KMI, un subnivel y un sufijo. A los efectos de este documento, se ignora el sufijo después de la generación de KMI.

Versión de KMI

Definición

La versión de KMI se define de la siguiente manera:

KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w      .x         -zzz           -k

Tenga en cuenta que el subnivel, y no es parte de la versión KMI. Para el ejemplo en la liberación del núcleo , la versión KMI es:

5.4-android12-0

Descripción

La versión de KMI describe la interfaz del módulo del kernel (KMI) entre GKI y los módulos del kernel cargables dinámicamente (DLKM).

Si dos versiones de kernel tienen la misma versión de KMI, implementan la misma interfaz de módulo de kernel. Los DLKM que son compatibles con uno también lo son con el otro.

La versión de KMI no debe verse disminuida por ninguna actualización de OTA.

Subnivel

El sub-nivel, y , describe el orden de liberación de versiones de kernel dentro de la misma versión KMI.

Para dos versiones de kernel que tienen la misma versión de KMI pero tienen el subnivel Y1 e Y2 respectivamente:

  • Si Y1 es menor o igual que Y2, un dispositivo que ejecute Y1 puede recibir una actualización a Y2.
  • Si Y1 es mayor que Y2, un dispositivo que ejecuta Y1 no se puede actualizar a Y2.

Es decir, si la versión de KMI no cambia, el subnivel no debe reducirse con ninguna actualización de OTA.

Determinar la liberación del kernel desde un dispositivo

La liberación kernel completo se puede encontrar mediante la ejecución de uname -r , o uname(2) con el fragmento de código siguiente:

std::string get_kernel_release() {
  struct utsname buf;
  return uname(&buf) == 0 ? buf.release : "";
}

Un ejemplo de salida es:

5.4.42-android12-0-00544-ged21d463f856

Para el propósito de este documento, cualquier cosa posterior a la generación de KMI se ignora al extraer información del kernel. Más formalmente, la salida de uname -r se analiza con la siguiente expresión regular (suponiendo zzz siempre comienza con "androide"):

^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$

La información ignorado puede incluir información como la ci.android.com número de versión, número de parches en la parte superior del núcleo de la línea de base, y los hash SHA del git commit.

libkver

La biblioteca, libkver, proporciona una interfaz C ++ para analizar la versión del kernel o una cadena de versión de KMI. Para obtener una lista de API que expone libkver, ven packages/modules/Gki/libkver/include/kver .

Controles VINTF

Para Android 11 o versiones anteriores, los fabricantes de dispositivos especifican manualmente la parte de lanzamiento de Android de la versión de KMI en el manifiesto del dispositivo. Para más detalles, consulte las reglas de concordancia kernel VINTF .

Desde Android S, la parte de lanzamiento de Android de la versión de KMI se puede extraer del kernel e inyectar en el manifiesto del dispositivo en el momento de la compilación.

Debido a los requisitos de configuración del núcleo generalmente no cambian, no hay necesidad de codificar k dentro de la matriz de compatibilidad. Sin embargo, en el improbable caso de que sea necesario cambiar el requisito de configuración del kernel, asegúrese de lo siguiente:

  • Se elimina el requisito correspondiente de la matriz de compatibilidad.
  • Se agregan pruebas de VTS adicionales para verificar los nuevos requisitos condicionados a la generación de KMI.

Versión de la imagen de arranque en metadatos OTA

Incluso si la imagen de arranque se actualiza a través de OTA una actualización, debe ser envuelto en el formato de carga útil OTA, payload.bin . La carga útil OTA codifica una version campo para cada partición. Cuando update_engine maneja una carga útil de la OTA, se compara este campo para garantizar la partición no se degrada.

Para evitar confusiones, la version campo para la partición de arranque en los metadatos de la OTA se llama boot image version .

Debido a que el disco de memoria siempre se construye a partir de cero, usando la marca de tiempo de disco RAM es suficiente para describir la imagen todo el maletero. No es necesario codificar la versión del kernel en la versión de la imagen de arranque, a menos que esté uniendo una imagen de arranque antigua a un nuevo binario del kernel en el futuro.

Antes de una actualización OTA, el cliente OTA verifica la versión de la imagen de arranque de la misma manera que cualquier otra partición.