На этой странице описывается схема версионирования для универсальных образов ядра (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), к которой относится данное ядро. При сравнении поля Номер версии 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 проверяет версию образа загрузки так же, как и для любого другого раздела.