Общие ядра Android

Общие ядра AOSP (также известные как общие ядра Android или ACK ) являются последующими ядрами kernel.org и включают в себя патчи, представляющие интерес для сообщества Android, которые не были объединены в основные ядра или ядра с долгосрочной поддержкой (LTS). Эти патчи могут включать в себя:

  • Резервные порты и отбор исходных функций, необходимых для функций Android.
  • Функции, готовые для устройств Android, но все еще находящиеся в стадии разработки (например, оптимизация размещения задач Energy Aware Scheduler).
  • Функции поставщиков/OEM, полезные для других партнеров экосистемы (например, sdcardfs).

android-mainline — это основная ветка разработки функций Android. Основная ветка Linux объединяется с android-mainline всякий раз, когда Линус Торвальдс публикует релиз или кандидат на выпуск. До 2019 года общие ядра Android создавались путем клонирования недавно объявленного ядра LTS и добавления исправлений, специфичных для Android. Этот процесс изменился в 2019 году, чтобы создать ответвление нового общего ядра Android от android-mainline . Эта новая модель позволяет избежать значительных усилий по пересылке портов и тестированию исправлений Android, поскольку достигается тот же результат постепенно. android-mainline подвергается тщательному непрерывному тестированию, эта модель гарантирует высокое качество ядра со дня его публикации.

Когда объявляется новый LTS, соответствующее общее ядро ​​является ответвлением от android-mainline . Это позволяет партнерам начать проект до объявления версии LTS путем слияния с android-mainline . После создания новой общей ветки ядра партнеры могут легко изменить источник слияния на новую ветку.

Другие общие ветви ядра получают регулярные слияния из связанного с ними ядра LTS . Эти слияния обычно выполняются сразу после публикации LTS-версии. Например, когда был опубликован Linux 4.19.64, он был объединен с общими ядрами 4.19 (например, android-4.19-q ). Партнерам настоятельно рекомендуется регулярно объединять общие ядра с ядрами своих продуктов, чтобы быть в курсе исправлений ошибок LTS и Android.

Ветка ядра ACK KMI

Ядра GKI имеют стабильный интерфейс модулей ядра. KMI однозначно идентифицируется версией ядра и выпуском платформы Android, поэтому ветви называются <androidRelease>-<kernel version> . Например, ядро ​​GKI 5.4 для Android 11 называется android11-5.4. Для Android 12 есть два дополнительных ядра GKI: android12-5.4 и android12-5.10 .

Унаследованные ветки десертного ядра

Устаревшие десертные ядра были созданы, чтобы гарантировать, что разработка новых функций не помешает слиянию с общим ядром Android. Ветки были созданы до выпуска соответствующего десерта и регулярно получают слияния из LTS, но не содержат новых функций. Например, android-4.9-q получает слияния из ветки LTS 4.9.y.

Если версия ядра не была стартовым ядром, десертное ядро ​​не было создано, но ядро, связанное с самой последней версией платформы, пригодно для обновления до будущих выпусков платформы Android. Например, android-4.9-q был последней из десертных веток android-4.9* , поэтому он поддерживается и тестируется на исходной версии платформы Android 10. Он также поддерживается и тестируется на версиях платформы, которые поддерживают обновления устройств под управлением 4.9. ядра: Android 11 и Android 12.

Поскольку схема именования десертов для выпусков платформы Android была исключена в Android 10, последние выпуски десертов, которые назывались android-4.14-r и android-4.19-r , вместо этого назывались android-4.14-stable и android-4.19-stable .

Десертные ядра заменяются ядрами GKI, начиная с Android 11, поэтому полный список поддерживаемых десертных ядер приведен в этой таблице.

Релиз платформы Android Ядро Поддерживается до
Андроид 10 android-4.9-q
android-4.14-q
android-4.19-q
Январь 2023 г.
Андроид 11 android-4.14-stable
android-4.19-stable
Январь 2024 г.
декабрь 2024 г.

Ветки ядра устаревшей версии

Ядра выпуска поддерживаются для обеспечения резервного копирования исправлений, упоминаемых в ежемесячном бюллетене по безопасности Android . Они создавались для каждого запускаемого ядра при выходе новой версии платформы Android. Они устаревают, когда соответствующая версия ядра или платформы устарела, как описано в разделе Сроки поддержки и исправления безопасности .

Каждый месяц, когда публикуется Бюллетень по безопасности Android, эти ядра обновляются с использованием резервных копий исправлений, указанных в бюллетене и относящихся к ядрам исходной версии и общим ядрам Android. Они не получают исправления LTS, поэтому дополнительный номер версии никогда не меняется. Они не содержат резервных копий для исправлений конкретных поставщиков.

В версиях платформы Android 11 и более поздних версиях партнеры должны объединить ядра десерта или GKI, чтобы применить исправления, указанные в Бюллетене по безопасности Android. Для платформ Android 11 и более поздних версий ядро ​​выпуска создаваться не будет.

Таким образом, в этой таблице показан полный список из 14 выпусков ядер, и ни одно из них не будет добавлено.

Релиз платформы Android Ядро Поддерживается до
Андроид 10 android-4.9-q-release
android-4.14-q-release
android-4.19-q-release
Январь 2023 г.

Функционирование и запуск ядер

Каждая версия платформы Android поддерживает запуск новых устройств на базе любой из трех версий ядра Linux. Как показано в таблице ниже, ядрами запуска для Android 11 являются android-4.14-stable , android-4.19-stable и android11-5.4 .

Поскольку обновления ядра обычно не требуются при обновлении версии платформы, ядра, в которых отсутствуют новейшие функции версии платформы, все равно можно использовать для запуска устройств. Поэтому ядра, разработанные для Android 10, например android-4.19-q , можно использовать на устройствах даже после обновления версии платформы до Android 11. Начиная с Android 12, функциональных ядер будет меньше, чем ядер запуска, чтобы ограничить количество стабильные KMI, которые необходимо поддерживать.

Релиз платформы Android Запуск ядер Функциональные ядра
Андроид 14 (2023 г.) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10 1
android14-6.1
android14-5.15
Андроид 13 (2022 г.) android13-5.15
android13-5.10
android12-5.10 1
android12-5.4 1
android11-5.4 1
android13-5.15
android13-5.10
Андроид 12 (2021 г.) android12-5.10
android12-5.4
android11-5.4 1
android-4.19-stable
android12-5.10
android12-5.4
Андроид 11 (2020 г.) android11-5.4
android-4.19-stable
android-4.14-stable
android11-5.4
android-4.19-stable
android-4.14-stable
Андроид 10 (2019 г.) android-4.19-q
android-4.14-q
android-4.9-q

android-4.19-q
android-4.14-q
android-4.9-q

1 Могут применяться дополнительные ограничения, если соответствующий BSP был обновлен для версии платформы. В более общих чертах номер версии ядра Android должен быть больше или равен целевой версии FCM . Подробности см. в разделе «Объект интерфейса поставщика — сопоставление ветвей ядра» .

Общая иерархия ядра

Ветка от android-mainline

Верхний уровень общей иерархии ядра показан на рисунке 1.

Создание общих ядер из ядра android-mainline

Рисунок 1. Создание общих ядер из ядра android-mainline.

Обратите внимание, что новое общее ядро ​​Android android12-5.10 было ответвлением от android-mainline в 2020 году. В 2021 году, когда был объявлен следующий LTS, android13-5.15 был ответвлен от android-mainline .

Как показано на рисунке 1, каждая версия ядра является основой для двух ядер GKI. Например, два ядра версии 5.4 — это android11-5.4 и android12-5.4 , оба из которых являются функциональными ядрами для соответствующих выпусков платформ. То же самое будет и с версией 5.10; android12-5.10 был создан при объявлении LTS, а android13-5.10 будет ответвлен от android12-5.10 на этапе завершения функций ядра весной 2021 года, чтобы обеспечить возможность разработки функций для Android 13.

Жизненный цикл ветки ACK KMI

Жизненный цикл ветки ACK KMI показан ниже на рисунке 2.

5.10 Жизненный цикл ветки ACK KMI

Рисунок 2. 5.10 Жизненный цикл ветки ACK KMI

Чтобы прояснить процесс разработки и жизненный цикл ветки, на рисунке 2 показаны ветки ACK KMI для 5.10.

Каждая ветвь ACK KMI проходит через три фазы, обозначенные на рисунке 2 разными цветами в каждой ветви. Как показано, LTS регулярно объединяется независимо от фазы.

Этап разработки

После создания ветвь ACK KMI вступает в фазу разработки ( dev на рис. 2) и открыта для добавления функций для следующего выпуска платформы Android. На рис. 2 android12-5.10 был создан, когда версия 5.10 была объявлена ​​новым исходным ядром LTS. Вторая ветвь ACK KMI для версии ядра может быть создана раньше, чтобы обеспечить возможность разработки последующего выпуска. На рисунке 2 android13-5.10 создается, когда android12-5.10 выходит из фазы разработки.

Фаза стабилизации

Когда ветвь ACK KMI объявляется завершенной, она вступает в фазу стабилизации , обозначенную как stab на рис. 2. Партнерские функции и исправления ошибок по-прежнему принимаются, но отслеживание KMI включено для обнаружения любых изменений, влияющих на интерфейс. На этом этапе принимаются изменения, являющиеся критическими для KMI, но определение KMI необходимо обновлять по мере необходимости. Подробную информацию о мониторинге KMI см. в обзоре GKI .

Замороженная фаза КМИ

Прежде чем новая версия платформы будет отправлена ​​в AOSP, ветвь ACK KMI замораживается и остается замороженной на весь срок существования ветки. Это означает, что никакие изменения, нарушающие KMI, не принимаются, если не выявлена ​​серьезная проблема безопасности, которую невозможно устранить, не затрагивая стабильный KMI. Чтобы избежать сбоев KMI, некоторые исправления, объединенные из LTS, могут быть изменены или удалены, если исправление не требуется для устройств Android.

Когда ветка ACK KMI заморожена, исправления ошибок и партнерские функции могут быть приняты, если существующее общее ядро ​​KMI не повреждено. KMI может быть расширен новыми экспортированными символами, если это не затронет интерфейсы, составляющие текущий KMI. Когда в KMI добавляются новые интерфейсы, они сразу становятся стабильными и не могут быть нарушены будущими изменениями.

Например, изменение, добавляющее поле в структуру, используемую общим ядром интерфейса KMI, не допускается, поскольку оно меняет определение интерфейса:

struct foo {
  int original_field1;
  int original_field2;
  int new_field;  // Not allowed
};

int do_foo(struct foo &myarg)
{
  do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);

Однако добавление новой функции — это нормально:

struct foo2 {
  struct foo orig_foo;
  int new_field;
};

int do_foo2(struct foo2 &myarg)
{
  do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);

На протяжении всего срока службы ядра GKI поддерживается обратная совместимость с пользовательским пространством, поэтому ядро ​​можно безопасно использовать для версии платформы Android, с которой было запущено устройство. Непрерывное тестирование предыдущих выпусков гарантирует сохранение совместимости. Итак, на рисунке 2 ядро android12-5.10 можно использовать для устройств Android 12 и Android 13. Поскольку версия платформы Android также совместима с предыдущими версиями, ядро android12-5.4 можно использовать для устройств Android 13 как для запуска, так и для обновления.

При переходе в замороженную фазу ветка помечается git-тегом строки версии KMI, содержащей номер поколения KMI. Например, когда android11-5.4 был заморожен, он был помечен строкой версии KMI 5.4-android11-0 , где завершающий 0 — это номер поколения KMI. Если возникает проблема безопасности или другое событие, требующее принятия исправления, изменяющего KMI, номер поколения KMI увеличивается, а ветвь перемаркируется. Например, если такое изменение будет принято в android11-5.4 , ветка будет помечена новой версией KMI, 5.4-android11-1 . Текущее поколение KMI можно найти с помощью команды uname :

$ uname -r
5.4.61-android11-0-00153-ga972f59040e4

Число после выпуска платформы — это поколение KMI (в данном случае 0).

Если поколение KMI меняется, ядро ​​несовместимо с модулями поставщика, которые соответствуют предыдущему поколению KMI, поэтому модули необходимо пересобирать и обновлять синхронно с ядром. Ожидается, что смена поколений KMI будет очень редкой.

Совместимость между ядрами

Требования совместимости между ядрами одного семейства LTS меняются, начиная с новых ядер GKI.

Ядра GKI

Ядра GKI поддерживают обратную совместимость со всеми выпусками платформы Android, поддерживающими данную версию ядра. Кроме того, выпуски платформы Android обратно совместимы с ядрами GKI из предыдущих выпусков. Таким образом, вы можете смело использовать ядро android12-5.4 , разработанное для Android 12, на устройствах под управлением Android 13. Совместимость проверяется посредством непрерывного тестирования VTS и CTS ядер GKI со всеми поддерживаемыми выпусками.

KMI стабилен, поэтому ядро ​​можно обновлять без необходимости пересборки модулей ядра в образе поставщика.

Совместимость KMI между различными ядрами GKI не поддерживается. Так, например, ядро android12-5.10 невозможно заменить на ядро android13-5.10 без пересборки всех модулей.

Ядра GKI поддерживаются только для их начальных и последующих выпусков. Они не поддерживаются в более старых версиях. Таким образом, ядро android13-5.10 не поддерживается на устройствах Android 12.

Устаревшие ядра

Устаревшие десертные ядра ( *-q и *-stable ) не имеют обратной совместимости между выпусками платформы Android, но ядра из двух предыдущих выпусков платформы Android поддерживаются для обновления. Таким образом, устройство, запущенное с Android 10 и использующее ядро ​​на базе android-4.19-q может либо продолжать использовать ядро android-4.19-q при обновлении до Android 2020, либо обновить код конкретного поставщика для поддержки android-4.19-stable .

Матрица совместимости

В этой таблице показаны версии ядра, поддерживаемые и протестированные для каждой версии платформы Android.

Релиз платформы Android Поддерживаемые ядра для обновления Поддерживаемые ядра для запуска
Андроид 14 (2023 г.) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Андроид 13 (2022 г.) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Андроид 12 (2021 г.) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Андроид 11 (2020 г.) android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android11-5.4
android-4.19-stable
android-4.14-stable
Андроид 10 (2019 г.) android-4.14-stable
android-4.14-p (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android-3.18 (EOL)
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)

Поддержка сроков службы и исправлений безопасности

Общие ядра Android поддерживаются до тех пор, пока соответствующее ядро ​​LTS или версия платформы Android не перестанут поддерживаться. Хотя ядро ​​поддерживается, оно продолжает получать слияния LTS от исходного кода и исправления ошибок для кода, специфичного для Android. Эти исправления включают в себя все исправления безопасности ядра, указанные в ежемесячных бюллетенях по безопасности Android и относящиеся к общим ядрам Android.

Партнеры могут быть уверены, что, регулярно объединяя общие ядра Android, они получают все возможные исправления безопасности ядра.

Общее тестирование ядра

Общие ядра тестируются с несколькими системами CI в дополнение к дальнейшему тестированию, проводимому поставщиками.

Функциональный тест ядра Linux

Тесты функционального тестирования ядра Linux (LKFT) инициируют различные наборы тестов, включая kselftest, LTP, VTS и CTS, на наборе физических устройств Arm32 и Arm64. Результаты последних испытаний можно найти здесь .

Тестирование ядраCI

Тесты сборки и загрузки KernelCI запускаются всякий раз, когда новый патч фиксируется в общей ветке ядра. Несколько сотен конфигураций сборки протестированы и загружены на различных платах. Последние результаты по ядрам Android можно найти здесь .

Тестирование Android перед отправкой и после отправки

Предварительные тесты используются для предотвращения возникновения сбоев в общих ядрах Android. Сводную информацию о результатах теста можно найти на вкладке «Проверки» изменения кода в общем коде ядра Android.

Тестирование Android после отправки выполняется для новых опубликованных сборок в общих ветвях ядра Android, когда новые исправления фиксируются в общей ветке ядра Android на ci.android.com . Введя aosp_kernel в качестве частичного имени ветки в ci.android.com , вы увидите список ветвей ядра с доступными результатами. Например, результаты для android-mainline можно найти здесь . Нажав на конкретную сборку, вы увидите статус теста на вкладке Test Results .

Тесты, определенные путем сопоставления тестов с группой тестов kernel-presubmit в дереве исходного кода платформы Android, будут выполняться как presubmit для ветвей ядра Android. Например, следующая конфигурация в test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING включит vts_kernel_proc_file_api_test в качестве предварительного теста при регистрации общего кода ядра Android.

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

0-дневное тестирование

Тестирование нулевого дня выполняет тестирование каждого исправления для всех общих ветвей ядра Android при фиксации новых исправлений. Запускаются различные загрузочные, функциональные тесты и тесты производительности. Присоединяйтесь к общедоступной группе cros-kernel-buildreports.

Тестовая матрица

Общее ядро ​​Android Релизы платформы Android Тестовые наборы
Основной 14 13 12 11 10 ЛКФТ ЯдроCI Предварительная отправка Опубликовать Отправить 0-день
android-mainline
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.19-stable
android-4.14-stable

Внесите свой вклад в общие ядра Android

Как правило, разработку функций следует выполнять в основной версии Linux, а не в обычных ядрах Android. Настоятельно рекомендуется разработка исходной версии, и после того, как разработка будет принята там, ее можно легко перенести в конкретную ветку ACK по мере необходимости. Команда Android Kernel рада поддержать усилия по развитию на благо экосистемы Android.

Отправьте исправления в компанию Gerrit и соблюдайте эти правила внесения изменений .