Схема управления версиями GKI

На этой странице описывается схема версионирования для универсальных образов ядра (GKI). Универсальный образ ядра (GKI) имеет уникальный идентификатор, называемый версией ядра. Версия ядра состоит из версии интерфейса модуля ядра (KMI) и подуровня. Версия ядра специфична для выпускаемого образа, тогда как версия KMI представляет собой интерфейс, на основе которого создается релиз. Версия KMI может поддерживать несколько версий ядра. Релиз ядра привязан только к одной версии KMI. В маловероятном случае, если необходимо изменить интерфейс модуля ядра, генерация KMI повторяется, чтобы отразить изменение версии KMI.

Краткое изложение терминов

В приведенной ниже таблице кратко изложены важные термины, используемые на этой странице и для обновлений GKI.

Имя Символ Пример Описание
Выпуск ядра суффикс wxy-zzz-k 5.4.42-android12-0-foo Уникальный идентификатор релиза GKI. Это значение, возвращаемое функцией uname .
версия KMI wx-zzz-k 5.4-android12-0 Описывает интерфейс модулей ядра (KMI) между GKI и динамически загружаемыми модулями ядра (DLKM).
Подуровень й 42 Описывает порядок выпуска обновлений ядра в рамках одной и той же версии KMI.

В приведенной ниже таблице в качестве справочного материала перечислены другие связанные термины.

Имя Символ Пример Описание
wxy wxy 5.4.42

Подробности см. в файле Makefile ядра Linux (найдите "KERNELRELEASE").

В этом документе слово wxy используется напрямую. Его также часто называют трехкомпонентным номером версии . Термин, используемый в VINTF, «версия ядра» , может вызвать путаницу с другими терминами, особенно с w .

В библиотеке libkver эта переменная называется kernel_version_tuple .

Этот кортеж не должен уменьшаться в результате каких-либо обновлений, включая OTA или обновления основной ветки.

Ветвь ядра zzz-wx android12-5.4 Этот термин используется в общих типах ветвей ядра .
Версия в 5 Этот термин в данном документе не используется. В библиотеке libkver эта переменная называется version .
Уровень обновления х 4 Этот термин в данном документе не используется. В библиотеке libkver эта переменная называется patch_level .
Релиз Android ззз Android 12

Это номер версии Android (desert), к которой относится данное ядро.

При сравнении поля AndroidRelease из строки извлекается числовая часть для сравнения.

Номер версии Android не должен уменьшаться ни при каких обновлениях, включая OTA-обновления и обновления основной ветки.

поколение КМИ к 0

Это дополнительное число, добавляемое для обработки маловероятных событий. Если исправление ошибки безопасности требует внесения изменений в KMI в рамках того же выпуска Android, количество поколений KMI увеличивается.

Порядковый номер поколения KMI начинается с 0.

проектирование версионирования

Выпуск ядра

Определение

Для устройств, поставляемых с GKI, версия ядра определяется следующим образом:

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

Для получения дополнительной информации см. раздел «Определение версии ядра с устройства» .

Ниже приведён пример выпуска ядра.

5.4.42-android12-0-00544-ged21d463f856

Описание

Версия ядра — это уникальный идентификатор версии GKI. Если два исполняемых файла GKI имеют одинаковую версию ядра, они должны быть идентичны побайтно.

Выпуск ядра состоит из версии KMI, подуровней и суффикса. В целях настоящего документа суффикс после генерации KMI игнорируется.

версия KMI

Определение

Версия KMI определяется следующим образом:

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

Обратите внимание, что подуровень y не входит в версию KMI. В примере из выпуска ядра версия KMI следующая:

5.4-android12-0

Описание

Версия KMI описывает интерфейс модулей ядра (KMI) между GKI и динамически загружаемыми модулями ядра (DLKM).

Если два выпуска ядра имеют одинаковую версию KMI, они реализуют один и тот же интерфейс модуля ядра. DLKM, совместимые с одним, также совместимы и с другим.

При обновлении по воздуху (OTA) версия KMI не должна понижаться.

Подуровень

Подуровень y описывает порядок выпуска ядер в рамках одной и той же версии KMI.

Для двух версий ядра, имеющих одинаковую версию KMI, но с подуровнем Y1 и Y2 соответственно:

  • Если Y1 меньше или равно Y2, устройство, работающее под управлением Y1, может получить обновление до Y2.
  • Если Y1 больше Y2, устройство, работающее под управлением Y1, не может быть обновлено до версии Y2.

То есть, если версия KMI не меняется, то и уровень не должен снижаться при любом OTA-обновлении.

Определить версию ядра на устройстве

Полный релиз ядра можно получить, выполнив команду uname -r или uname(2) со следующим фрагментом кода:

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

Пример выходных данных:

5.4.42-android12-0-00544-ged21d463f856

В целях настоящего документа все, что находится после генерации KMI, игнорируется при извлечении информации о ядре. Более формально, вывод команды uname -r анализируется с помощью следующего регулярного выражения (предполагая, что zzz всегда начинается с "android"):

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

К игнорируемой информации могут относиться такие данные, как номер сборки на ci.android.com , количество патчей поверх базового ядра и SHA-хеши коммитов Git.

libkver

Библиотека libkver предоставляет интерфейс C++ для анализа версии ядра или строки версии KMI. Список API, предоставляемых libkver, см. в packages/modules/Gki/libkver/include/kver .

Чеки VINTF

Для Android 11 и более ранних версий часть KMI, относящаяся к версии Android release, указывается вручную в манифесте устройства производителями устройств. Подробнее см. правила соответствия ядра VINTF .

Начиная с Android S, часть KMI, относящаяся к версии Android Release, может быть извлечена из ядра и внедрена в манифест устройства во время сборки.

Поскольку требования к конфигурации ядра, как правило, не меняются, нет необходимости кодировать k в матрице совместимости. Однако в маловероятном случае, когда требования к конфигурации ядра все же потребуется изменить, необходимо обеспечить следующее:

  • Соответствующее требование из матрицы совместимости снимается.
  • Добавлены дополнительные тесты VTS для проверки новых требований при условии генерации KMI.

Версия образа загрузки в метаданных OTA

Даже если образ загрузки обновляется по OTA, он должен быть упакован в формат полезной нагрузки OTA, payload.bin . Полезная нагрузка OTA кодирует поле version для каждого раздела. Когда update_engine обрабатывает полезную нагрузку OTA, он сравнивает это поле, чтобы убедиться, что раздел не будет понижен в версии.

Во избежание путаницы поле version для загрузочного раздела в метаданных OTA называется boot image version .

Поскольку образ ramdisk всегда создается с нуля, для описания всего загрузочного образа достаточно использовать метку времени ramdisk . Нет необходимости кодировать версию ядра в загрузочном образе, если только вы не собираетесь в будущем объединять старый загрузочный образ с новым бинарным файлом ядра.

Перед обновлением по воздуху (OTA) клиент OTA проверяет версию образа загрузки так же, как и для любого другого раздела.