На этой странице описана схема управления версиями для универсальных образов ядра (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 или основные. |
Ветка ядра | zzz-wx | андроид12-5.4 | Этот термин используется в общих типах ветвей ядра . |
Версия | ш | 5 | Этот термин не используется в данном документе. Эта переменная называется версией в libkver . |
Уровень патча | х | 4 | Этот термин не используется в данном документе. Эта переменная в libkver называется patch_level . |
Android-версия | ззз | андроид12 | Это номер выпуска Android (десерт), с которым связано ядро. При сравнении поля Номер версии 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 определяется следующим образом:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
Обратите внимание, что подуровень y
не является частью версии KMI. Для примера в выпуске Kernel версия 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 или более ранней версии версия Android версии KMI указывается вручную в манифесте устройства производителями устройств. Подробности см. в разделе Правила соответствия ядра VINTF .
В Android S часть версии KMI для Android можно извлечь из ядра и внедрить в манифест устройства во время сборки.
Поскольку требования к конфигурации ядра обычно не меняются, нет необходимости кодировать k
в матрице совместимости. Однако в том маловероятном случае, когда требования к конфигурации ядра все же потребуется изменить, убедитесь в следующем:
- Соответствующее требование из матрицы совместимости удалено.
- Добавлены дополнительные тесты VTS для проверки новых требований при условии создания KMI.
Версия загрузочного образа в метаданных OTA
Даже если загрузочный образ обновляется через OTA-обновление, он должен быть завернут в формат полезной нагрузки OTA payload.bin
. Полезная нагрузка OTA кодирует поле version
для каждого раздела. Когда update_engine
обрабатывает полезную нагрузку OTA, он сравнивает это поле, чтобы убедиться, что версия раздела не понижена.
Во избежание путаницы поле version
загрузочного раздела в метаданных OTA называется boot image version
.
Поскольку виртуальный диск всегда создается с нуля, временной метки виртуального диска достаточно для описания всего загрузочного образа. Нет необходимости кодировать выпуск ядра в версии загрузочного образа, если только вы в будущем не пришиваете старый загрузочный образ к новому двоичному файлу ядра.
Перед обновлением OTA клиент OTA проверяет версию загрузочного образа так же, как и любой другой раздел.