Ядро продукта , также известное как ядро устройства или ядро OEM , — это ядро, которое вы поставляете на свое устройство. До GKI ядро продукта было создано в результате ряда изменений ядра исходной версии. На рисунке 1 показано, как добавление ядра дает ядро продукта (ядро OEM/устройства):
Рисунок 1. Конструкция ядра продукта до GKI.
- Ядро Linux с долгосрочной поддержкой (LTS) с сайта kernel.org было модифицировано с помощью патчей, специфичных для Android, в результате чего появилось общее ядро Android (ACK) .
- ACK был изменен поставщиками, которые добавили поддержку своей системы на кристалле (SoC). Поставщики также могут добавить оптимизацию производительности или энергопотребления. Полученное ядро называется ядром поставщика .
- Наконец, OEM-производители дополнительно модифицировали ядро поставщика, добавив дополнительные драйверы устройств и настройки, которые они сочли необходимыми. Полученное ядро называется ядром продукта .
Все эти модификации могут привести к тому, что до 50% кода ядра будет кодом вне дерева, а не исходным кодом ядра Linux или ACK. До GKI почти каждое устройство имело собственное ядро, что приводило к его фрагментации.
Издержки фрагментации
Фрагментация ядра имеет несколько негативных последствий для сообщества Android.
Обновления безопасности являются трудоемкими
Исправления безопасности, указанные в Бюллетене по безопасности Android (ASB), должны быть перенесены в каждое ядро устройства. Однако из-за фрагментации ядра распространять исправления безопасности на устройствах Android на местах непомерно дорого.
Трудно объединить обновления с долгосрочной поддержкой.
Выпуски с долгосрочной поддержкой (LTS) включают исправления безопасности и другие критические исправления ошибок. Обновление выпусков LTS оказалось наиболее эффективным способом внесения исправлений безопасности. На устройствах Pixel было обнаружено, что 90% проблем безопасности ядра, о которых сообщалось в ASB, уже исправлены для устройств, которые постоянно обновляются.
Однако, несмотря на все пользовательские модификации в ядрах устройств, сложно просто объединить исправления LTS с ядрами устройств.
Запретить обновления версий платформы Android
Фрагментация затрудняет добавление новых функций Android, требующих изменений ядра, на устройства в полевых условиях. Код Android Framework должен предполагать, что поддерживается до пяти версий ядра и что для новой версии платформы не было внесено никаких изменений ядра (Android 10 поддерживает ядра 3.18, 4.4, 4.9, 4.14 и 4.19, что в некоторых случаях не было сделано). дополнен новыми функциями, начиная с Android 8 в 2017 году).
Трудно внести изменения ядра обратно в исходную версию Linux.
Несмотря на все изменения, внесенные в ядро, большинство флагманских устройств поставляются с версией ядра, которой уже не менее 18 месяцев. Например, ядро 4.14 было выпущено на kernel.org
в ноябре 2017 года, а первые телефоны Android, использующие ядра 4.14, были выпущены весной 2019 года.
Эта длительная задержка между выпуском ядра и продуктов основной разработки затрудняет для сообщества Android внедрение необходимых функций и драйверов в ядра основной разработки.
Исправьте фрагментацию: общий образ ядра.
Проект Generic Kernel Image (GKI) решает проблему фрагментации ядра путем унификации основного ядра и перемещения поддержки SoC и плат из основного ядра в загружаемые модули поставщиков. GKI также представляет стабильный интерфейс модулей ядра (KMI) для модулей поставщиков, поэтому модули и ядро можно обновлять независимо. Некоторые характеристики ядра GKI:
- Ядро GKI собрано из исходников ACK.
- Ядро GKI представляет собой одноядерный двоичный файл плюс связанные загружаемые модули для каждой архитектуры и для каждой версии LTS (в настоящее время только Arm64 для
android11-5.4
иandroid12-5.4
). - Ядро GKI протестировано со всеми выпусками платформы Android, которые поддерживаются для соответствующего ACK. На протяжении всего срока службы версии ядра GKI функции не устаревают.
- Ядро GKI предоставляет стабильный KMI драйверам в пределах данного LTS.
- Ядро GKI не содержит кода, специфичного для SoC или платы.
Изображение архитектуры GKI можно найти в обзоре ядра .
GKI — это комплексное изменение, которое внедрялось в несколько этапов, начиная с ядра версии 5.4 в выпуске платформы Android 11.
Существует два этапа ГКИ:
- GKI 1.0 был представлен в Android 11 для устройств с ядрами 5.4. GKI 1.0 применяется ко всем устройствам, поставляемым с ядрами 5.4, даже к тем, которые запущены с Android 12 или Android 13.
- GKI 2.0 был представлен в Android 12 для устройств с ядрами 5.10 и является новым стандартом для всех устройств, поставляемых с ядрами 5.10 или более поздних версий.
ГКИ 1.0
В GKI 1.0 устройства, запускаемые с версией ядра 5.4, должны пройти тестирование GKI (версии платформы Android 11 и более поздние). Цели GKI 1.0 включают следующее:
- Избегайте регрессий в Vendor Test Suite (VTS) или Compatibility Test Suite (CTS) при замене ядра продукта на ядро GKI.
- Уменьшите нагрузку партнеров по обновлению своего ядра с помощью общих ядер AOSP.
- Включите основные изменения Android в ядра для обновления и запуска устройств с новыми выпусками Android.
- Не нарушайте пространство пользователя Android.
- Отделите аппаратные компоненты от основного ядра в виде загружаемых модулей.
Документацию GKI 1.0 смотрите в разделе GKI 1.0 .
ГКИ 2.0
В GKI 2.0 устройства, запускаемые с ядром версии 5.10 или выше, должны поставляться с ядром GKI (начиная с Android 12). Подписанные загрузочные образы доступны и регулярно обновляются с помощью LTS и исправлений критических ошибок. Поскольку для KMI поддерживается двоичная стабильность, вы можете установить эти загрузочные образы, не внося изменений в образы поставщиков. Цели GKI 2.0 включают следующее:
- Не допускайте значительного снижения производительности или энергопотребления при замене ядра продукта на ядро GKI.
- Предоставьте партнерам возможность предоставлять исправления безопасности ядра и исправления ошибок без участия поставщика.
- Сократите стоимость обновления основной версии ядра для устройств (например, с версии 5.10 до ядра 2021 LTS).
- Поддерживайте один двоичный файл ядра GKI для каждой архитектуры, обновляя версии ядра с четким процессом обновления.
GKI 2.0 представляет собой самую последнюю версию ядер Android. Документация по ядру за пределами подразделов GKI 1.0 и предыдущих ядер (<=4.19) отражает архитектуру GKI 2.0.