На этой странице описывается проект Generic Kernel Image (GKI) и то, как он повышает стабильность Android и улучшает безопасность.
История
Каждому устройству на базе Android требуется собственное ядро. До появления GKI ядра разрабатывались на основе Android Common Kernel (ACK), а изменения, специфичные для конкретного устройства, вносились производителями систем на кристалле (SoC) и OEM-производителями.
Такая кастомизация могла привести к тому, что до 50% кода ядра будет кодом, не входящим в дерево разработки, а не относящимся к ядрам Linux или ACK. Таким образом, кастомизация ядер до GKI приводила к значительной фрагментации ядра.
Издержки фрагментации
Фрагментация ядра имеет ряд негативных последствий для сообщества Android.
Обновления безопасности требуют больших трудозатрат
Обновления безопасности, упомянутые в бюллетене по безопасности Android (ASB), должны быть портированы в каждое ядро устройства. Однако из-за фрагментации ядра распространение исправлений безопасности на устройства Android в реальных условиях эксплуатации обходится слишком дорого.
Трудно объединить долгосрочные поддерживаемые обновления
Выпуски с долгосрочной поддержкой (LTS) включают исправления безопасности и другие критические ошибки. Поддержание актуальности LTS-выпусков оказалось наиболее эффективным способом обеспечения безопасности. На устройствах Pixel было обнаружено, что 90% проблем безопасности ядра, о которых сообщалось в ASB, уже были исправлены для устройств, регулярно обновляемых.
Однако, учитывая все эти пользовательские модификации ядер устройств, сложно просто объединить исправления LTS в ядра устройств.
Запретить выпуск обновлений платформы Android
Фрагментация затрудняет внедрение новых функций Android, требующих изменения ядра, на устройствах на местах. Код Android Framework должен был учитывать различные версии ядра и не мог полагаться на новые функции Android, реализованные в ядре. Это замедляло внедрение инноваций и приводило к увеличению размера и сложности кода.
Трудно вносить изменения в ядро обратно в основную ветку Linux
Фрагментированный подход к внедрению патчей в рабочие ядра приводил к задержке до 18 месяцев с момента выпуска LTS-релиза в апстриме до его появления на устройстве. Такая длительная задержка между выпуском ядра в апстриме и выпуском продуктов затрудняет для сообщества Android внедрение необходимых функций и драйверов в апстрим-ядра. К тому времени, как пользователь отправлял предложения по улучшению, кодовая база уже менялась, что затрудняло оценку актуальности патча.
Исправление фрагментации: универсальный образ ядра
Проект Generic Kernel Image (GKI) решает проблему фрагментации ядра, унифицируя ядро и перенося поддержку SoC и плат из ядра в загружаемые модули поставщиков. GKI также предоставляет стабильный интерфейс модулей ядра (KMI) для модулей поставщиков, что позволяет обновлять модули и ядро независимо друг от друга. Некоторые характеристики ядра GKI:
- Ядро GKI построено из исходных кодов ACK.
- Ядро GKI представляет собой двоичный файл, состоящий из одного ядра, а также связанные с ним загружаемые модули для каждой архитектуры в каждом выпуске LTS.
- Ядро GKI тестируется со всеми версиями платформы Android, поддерживающими соответствующий ACK. Устаревание функций не предусмотрено на протяжении всего срока службы версии ядра GKI.
- Ядро GKI предоставляет стабильный KMI драйверам в рамках данного LTS.
- Ядро GKI не содержит специфичного для SoC или платы кода.
Изображение архитектуры GKI см. в разделе Обзор ядра .
Общее изображение
Начиная с Android 12, устройства с версией ядра 5.10 или выше должны поставляться с ядром GKI. Сборки Generic Kernel Image (GKI) регулярно обновляются и регулярно пополняются LTS-версиями и исправлениями критических ошибок. Поскольку для KMI поддерживается стабильность двоичного кода, вы можете устанавливать эти загрузочные образы, не внося изменений в образы поставщика. Проект GKI преследует следующие цели:
- Не допускайте значительного снижения производительности или энергопотребления при замене ядра продукта на ядро GKI.
- Предоставить партнерам возможность предоставлять исправления безопасности ядра и исправления ошибок без участия поставщика.
- Сокращение затрат на обновление основной версии ядра для устройств.
- Поддерживайте единый двоичный файл ядра GKI для каждой архитектуры, обновляя версии ядра с помощью четкого процесса обновления.