На этой странице описывается проект 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 предоставляет драйверам в рамках данной LTS-системы стабильный KMI.
- Ядро GKI не содержит кода, специфичного для конкретной SoC или платы.
Образ архитектуры GKI можно найти в обзоре ядра .
Общее изображение
Начиная с Android 12, устройства, поставляемые с ядром версии 5.10 или выше, должны поставляться с ядром GKI. Сборки Generic Kernel Image (GKI) регулярно обновляются, включая LTS-версии и критические исправления ошибок. Поскольку стабильность бинарного файла KMI поддерживается, вы можете устанавливать эти загрузочные образы без внесения изменений в образы от поставщиков. Проект GKI преследует следующие цели:
- Не допускайте существенного снижения производительности или энергопотребления при замене ядра продукта на ядро GKI.
- Дайте партнерам возможность предоставлять исправления безопасности ядра и устранения ошибок без участия поставщика.
- Снизить стоимость обновления основной версии ядра для устройств.
- Для поддержания единой исполняемой версии ядра GKI для каждой архитектуры необходимо обновлять версии ядра, используя понятный процесс обновления.