На этой странице описывается схема управления версиями для универсальных образов ядра (GKI). Универсальный образ ядра (GKI) имеет уникальный идентификатор, называемый выпуском ядра. Релиз ядра состоит из версии интерфейса модуля ядра (KMI) и подуровня. Версия ядра зависит от выпускаемого образа, тогда как версия KMI представляет собой интерфейс, из которого создается версия. Версия KMI может поддерживать несколько выпусков ядра. Релиз ядра привязан только к одной версии KMI. В маловероятном случае, когда необходимо изменить интерфейс модуля ядра, генерация KMI повторяется, чтобы отразить изменение в версии KMI.
Резюме терминов
В следующей таблице приведены важные термины, используемые на этой странице и в обновлениях GKI.
Имя | Символ | Пример | Описание |
---|---|---|---|
Выпуск ядра | wxy-zzz-k-суффикс | 5.4.42-android12-0-foo | Уникальный идентификатор выпуска GKI. Это значение, возвращаемое uname . |
версия КМИ | wx-zzz-k | 5.4-андроид12-0 | Описывает интерфейс модуля ядра (KMI) между GKI и динамически загружаемыми модулями ядра (DLKM). |
Подуровень | у | 42 | Описывает порядок выпуска выпусков ядра в одной версии KMI. |
В следующей таблице перечислены другие связанные термины в качестве ссылки.
Имя | Символ | Пример | Описание |
---|---|---|---|
wxy | wxy | 5.4.42 | Подробнее см. в Makefiles ядра Linux (ищите «KERNELRELEASE»). wxy используется непосредственно в этом документе. Его также часто называют номером версии, состоящим из трех частей . Термин, используемый в VINTF, версия ядра , может вызвать путаницу с другими терминами, особенно с w . Эта переменная называется kernel_version_tuple в libkver . Этот кортеж не должен уменьшаться никакими обновлениями, в том числе OTA или mainline. |
Ветка ядра | zzz-wx | андроид 12-5.4 | Этот термин используется в общих типах ветвей ядра . |
Версия | ж | 5 | Этот термин не используется в данном документе. Эта переменная называется версией в libkver . |
Уровень патча | Икс | 4 | Этот термин не используется в данном документе. Эта переменная называется patch_level в libkver . |
Версия для Android | ззз | андроид12 | Это номер выпуска Android (десерт), с которым связано ядро. При сравнении поля Номер выпуска Android не должен уменьшаться никакими обновлениями, в том числе OTA или mainline. |
Генерация КМИ | к | 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 определяется следующим образом:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
Обратите внимание, что подуровень y
не является частью версии KMI. Для примера в версии ядра версия KMI:
5.4-android12-0
Описание
Версия KMI описывает интерфейс модуля ядра (KMI) между GKI и динамически загружаемыми модулями ядра (DLKM).
Если два выпуска ядра имеют одинаковую версию KMI, они реализуют один и тот же интерфейс модуля ядра. DLKM, совместимые с одним, совместимы и с другим.
Версия KMI не должна уменьшаться никакими OTA-обновлениями.
Подуровень
Подуровень 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 предоставляет интерфейс C++ для разбора версии ядра или строки версии KMI. Список API, предоставляемых libkver, см. в packages/modules/Gki/libkver/include/kver
.
ВИНТФ проверяет
Для Android 11 или более ранней версии версия KMI для Android указывается вручную в манифесте устройства производителями устройств. Подробнее см. в правилах соответствия ядра VINTF .
Начиная с Android S, часть выпуска Android версии KMI можно извлечь из ядра и внедрить в манифест устройства во время сборки.
Поскольку требования к конфигурации ядра обычно не меняются, нет необходимости кодировать k
в матрице совместимости. Однако в маловероятном случае, когда требуется изменить требования к конфигурации ядра, убедитесь в следующем:
- Соответствующее требование из матрицы совместимости удалено.
- Добавлены дополнительные тесты VTS для проверки новых требований, обусловленных генерацией KMI.
Версия загрузочного образа в метаданных OTA
Даже если загрузочный образ обновляется через OTA-обновление, он должен быть упакован в формат полезной нагрузки OTA, payload.bin
. Полезная нагрузка OTA кодирует поле version
для каждого раздела. Когда update_engine
обрабатывает полезную нагрузку OTA, он сравнивает это поле, чтобы убедиться, что раздел не понижен.
Во избежание путаницы поле version
для загрузочного раздела в метаданных OTA называется boot image version
.
Поскольку виртуальный диск всегда создается с нуля, использование метки времени виртуального диска достаточно для описания всего загрузочного образа. Нет необходимости кодировать выпуск ядра в версии загрузочного образа, если только вы в будущем не будете сшивать старый загрузочный образ с новым двоичным файлом ядра.
Перед OTA-обновлением OTA-клиент проверяет версию загрузочного образа так же, как и любой другой раздел.