Esquema de control de versiones de GKI

En esta página, se describe el esquema de control de versiones de las imágenes genéricas del kernel (GKI). Una imagen genérica de kernel (GKI) tiene un identificador único llamado versión del kernel. La versión del kernel consta de la versión de la interfaz del módulo del kernel (KMI) y el nivel secundario. La versión del kernel es específica de la imagen que se lanza, mientras que la versión de la KMI representa la interfaz a partir de la cual se compila una versión. Una versión de KMI puede admitir varias versiones del kernel. Una versión del kernel está vinculada a una sola versión de KMI. En el improbable caso de que se deba cambiar la interfaz del módulo del kernel, se itera la generación de la KMI para reflejar el cambio en la versión de la KMI.

Resumen de las condiciones

En la siguiente tabla, se resumen los términos importantes que se usan en esta página y para las actualizaciones del GKI.

Nombre Símbolo Ejemplo Descripción
Versión de kernel w.x.y-zzz-k-suffix 5.4.42-android12-0-foo Es el identificador único de una versión de GKI. Este es el valor que devuelve uname.
Versión del KMI w.x-zzz-k 5.4-android12-0 Describe la interfaz del módulo del kernel (KMI) entre la GKI y los módulos del kernel cargables de forma dinámica (DLKM).
Subnivel y 42 Describe el orden de lanzamiento de las versiones del kernel dentro de la misma versión de KMI.

En la siguiente tabla, se enumeran otros términos relacionados como referencia.

Nombre Símbolo Ejemplo Descripción
w.x.y w.x.y 5.4.42

Para obtener más información, consulta Linux Kernel Makefiles (busca "KERNELRELEASE").

w.x.y se usa directamente en todo este documento. También se conoce comúnmente como el número de versión de tres partes. El término que se usa en VINTF, versión del kernel, puede causar confusión con otros términos, en especial con w.

Esta variable se conoce como kernel_version_tuple en libkver.

Ninguna actualización, ya sea OTA o de la versión principal, debe reducir este valor de tupla.

Rama del kernel zzz-w.x android12-5.4 Este término se usa en Tipos de ramas de kernel comunes.
Versión w 5 Este término no se usa en este documento. Esta variable se conoce como version en libkver.
Nivel de parche x 4 Este término no se usa en este documento. Esta variable se conoce como patch_level en libkver.
Versión de Android zzz android12

Es el número de versión de Android (postre) con el que se asocia el kernel.

Cuando se compara el campo AndroidRelease, se extrae la parte numérica de la cadena para la comparación.

Ninguna actualización, incluidas las OTA o las de mainline, debe reducir el número de versión de Android.

Generación de KMI k 0

Es un número adicional que se agrega para tener en cuenta eventos poco probables. Si una corrección de errores de seguridad requiere cambios en la KMI dentro de la misma versión de Android, se incrementa la generación de la KMI.

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

Diseño del control de versiones

Versión de kernel

Definición

En el caso de 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, consulta Cómo determinar la versión del kernel de un dispositivo.

A continuación, se muestra 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 del GKI. Si dos archivos binarios del GKI tienen la misma versión del kernel, deben ser idénticos byte a byte.

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

Versión del KMI

Definición

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

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

Ten en cuenta que el subnivel, y, no forma parte de la versión de KMI. En el ejemplo de Versión de kernel, la versión de KMI es la siguiente:

5.4-android12-0

Descripción

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

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

Ninguna actualización OTA debe disminuir la versión del KMI.

Subnivel

El subnivel, y, describe el orden de lanzamiento de las versiones del kernel dentro de la misma versión de KMI.

Para dos versiones del kernel que tienen la misma versión de KMI, pero tienen los niveles secundarios Y1 y Y2, respectivamente, se aplica lo siguiente:

  • Si Y1 es menor o igual que Y2, un dispositivo que ejecuta 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 del KMI no cambia, ningún actualización OTA debe disminuir el nivel secundario.

Cómo determinar la versión del kernel de un dispositivo

Puedes encontrar la versión completa del kernel ejecutando uname -r o uname(2) con el siguiente fragmento de código:

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

Un ejemplo de resultado es el siguiente:

5.4.42-android12-0-00544-ged21d463f856

Para los fines de este documento, se ignora todo lo que se encuentre después de la generación del KMI cuando se extrae información del kernel. De manera más formal, el resultado de uname -r se analiza con la siguiente regex (suponiendo que zzz siempre comienza con "android"):

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

La información ignorada puede incluir datos como el número de compilación de ci.android.com, la cantidad de parches sobre el kernel de referencia y los hashes SHA de la confirmación de Git.

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 las APIs que expone libkver, consulta packages/modules/Gki/libkver/include/kver.

Verificaciones de VINTF

En Android 11 o versiones anteriores, los fabricantes de dispositivos especifican manualmente la parte de la versión de KMI correspondiente a la versión de Android en el manifiesto del dispositivo. Para obtener más información, consulta Reglas de coincidencia del kernel de VINTF.

A partir de Android S, la parte de Android de la versión de KMI se puede extraer del kernel e insertarse en el manifiesto del dispositivo en el tiempo de compilación.

Dado que los requisitos de configuración del kernel generalmente no cambian, no es necesario codificar k dentro de la matriz de compatibilidad. Sin embargo, en el caso improbable de que sea necesario cambiar el requisito de configuración del kernel, asegúrate de lo siguiente:

  • Se quita el requisito correspondiente de la matriz de compatibilidad.
  • Se agregan pruebas de VTS adicionales para verificar los nuevos requisitos condicionales en la generación de KMI.

Versión de la imagen de arranque en los metadatos de OTA

Incluso si la imagen de arranque se actualiza a través de una actualización OTA, debe incluirse en el formato de carga útil de OTA, payload.bin. La carga útil de OTA codifica un campo version para cada partición. Cuando update_engine controla una carga útil de OTA, compara este campo para asegurarse de que no se haya degradado la partición.

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

Dado que el disco RAM siempre se compila desde cero, usar la marca de tiempo del disco RAM es suficiente para describir toda la imagen de arranque. No es necesario codificar la versión del kernel en la versión de la imagen de arranque, a menos que en el futuro combines una imagen de arranque antigua con un nuevo archivo binario del kernel.

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.