Esta página describe el esquema de control de versiones para las imágenes genéricas del kernel (GKI). Una imagen genérica del kernel (GKI) tiene un identificador único denominado 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 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 crea una versión. Una versión de KMI puede admitir múltiples versiones de 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, la generación de KMI se itera para reflejar el cambio en la versión de KMI.
Resumen de términos
La siguiente tabla resume los términos importantes que se usan en esta página y para las actualizaciones de GKI.
Nombre | Símbolo | Ejemplo | Descripción |
---|---|---|---|
Lanzamiento del núcleo | sufijo wxy-zzz-k | 5.4.42-android12-0-foo | Identificador único para una versión de GKI. Este es el valor devuelto por uname . |
versión 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 los lanzamientos 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 obtener más información, consulte Makefiles del kernel de Linux (busque "KERNELRELEASE"). wxy se usa directamente a lo largo de 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 kernel , puede causar confusión con otros términos, especialmente con w . Esta variable se conoce como kernel_version_tuple en libkver . Esta tupla no debe verse disminuida por ninguna actualización, incluidas OTA o la línea principal. |
rama del núcleo | zzz-wx | android12-5.4 | Este término se utiliza en los tipos de rama del núcleo común . |
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 conoce como patch_level en libkver . |
lanzamiento de Android | zzz | androide12 | Este es el número de versión de Android (postre) con el que está asociado el kernel. Al comparar el campo El número de versión de Android no debe disminuir por ninguna actualización, incluidas las de 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 la corrección de un error de seguridad requiere cambios en el KMI dentro de la misma versión de Android, se aumenta una generación de KMI. El número de generación de KMI comienza con 0. |
Diseño de versiones
Lanzamiento del núcleo
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 versión del kernel desde 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 la identificación única de una versión de GKI. Si dos archivos binarios de GKI tienen la misma versión de kernel, deben ser idénticos en cuanto a bytes.
Una versión del 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 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 forma parte de la versión de KMI. Para el ejemplo en la versión de Kernel , la versión de 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 reducida por ninguna actualización de OTA.
subnivel
El subnivel, y
, describe el orden de lanzamiento de los lanzamientos del kernel dentro de la misma versión de KMI.
Para dos versiones de kernel que tienen la misma versión de KMI pero tienen subniveles Y1 e Y2 respectivamente:
- 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 de KMI no cambia, el subnivel no debe disminuir con ninguna actualización de OTA.
Determinar la versión del kernel desde un dispositivo
La versión completa del kernel se puede encontrar 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 salida es:
5.4.42-android12-0-00544-ged21d463f856
A los efectos de este documento, todo lo que se produzca después de la generación de KMI se ignorará al extraer información del kernel. Más formalmente, la salida de uname -r
se analiza con la siguiente expresión regular (suponiendo que zzz siempre comience con "android"):
^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$
La información ignorada puede incluir información como el número de compilación de ci.android.com , la cantidad de parches en la parte superior del kernel de referencia y los hashes SHA de la confirmación de git.
librería
La biblioteca, libkver, proporciona una interfaz de C++ para analizar la versión del kernel o una cadena de versión de KMI. Para obtener una lista de las API que expone libkver, consulte packages/modules/Gki/libkver/include/kver
.
cheques VINTF
Para Android 11 o anterior, la parte de lanzamiento de Android de la versión KMI se especifica manualmente en el manifiesto del dispositivo por parte de los fabricantes de dispositivos. Para obtener más información, consulte Reglas de coincidencia del núcleo VINTF .
Desde Android S, la parte de lanzamiento de Android de la versión KMI se puede extraer del kernel e inyectar en el manifiesto del dispositivo en el momento de la compilación.
Debido a 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úrese de lo siguiente:
- Se elimina el requisito correspondiente de la matriz de compatibilidad.
- Se agregan pruebas VTS adicionales para verificar los nuevos requisitos condicionales a la generación de KMI.
Versión de imagen de arranque en metadatos 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 OTA, payload.bin
. La carga útil de OTA codifica un campo de version
para cada partición. Cuando update_engine
maneja una carga útil de OTA, compara este campo para asegurarse de que la partición no se degrada.
Para evitar confusiones, el campo de version
para la partición de inicio en los metadatos de OTA se denomina boot image version
.
Debido a que el ramdisk siempre se construye desde cero, usar la marca de tiempo del ramdisk 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 esté uniendo una imagen de arranque antigua a un nuevo 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.