Построение ядер

На этой странице подробно описан процесс создания пользовательских ядер для устройств Android. Эти инструкции проведут вас через процесс выбора правильных исходных кодов, сборки ядра и внедрения результатов в образ системы, созданный на основе проекта Android с открытым исходным кодом (AOSP).

Вы можете получить более свежие исходные коды ядра, используя Repo ; создайте их без дополнительной настройки, запустив build/build.sh из корня исходного кода.

Загрузка исходников и инструментов сборки

Для последних ядер используйте repo для загрузки исходников, наборов инструментов и скриптов сборки. Некоторым ядрам (например, ядрам Pixel 3) требуются исходные коды из нескольких репозиториев git, в то время как другим (например, обычным ядрам) требуется только один исходный код. Использование подхода repo обеспечивает правильную настройку исходного каталога.

Скачать исходники для соответствующей ветки:

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync

В следующей таблице перечислены имена BRANCH для ядер, доступных с помощью этого метода.

Устройство Бинарный путь в дереве AOSP Филиалы репо
Пиксельный фолд (Феликс) устройство/google/felix-kernel android-gs-felix-5.10-android13-qpr3-c
Пиксельный планшет (tangorpro) устройство/google/tangorpro-kernel android-gs-tangorpro-5.10-android13-qpr3
Пиксель 7 (пантера)
Pixel 7 Pro (гепард)
устройство/google/pantah-kernel android-gs-pantah-5.10-android13-qpr3
Пиксель 6а (голубая сойка) устройство/google/bluejay-kernel android-gs-bluejay-5.10-android13-qpr3
Пиксель 6 (иволга)
Pixel 6 Pro (ворон)
устройство/google/равиоль-ядро android-gs-равиоль-5.10-android13-qpr3
Пиксель 5а (барбет)
Пиксель 5 (красноперый)
Pixel 4a (5G) (ежевика)
устройство/google/redbull-kernel android-msm-redbull-4.19-android13-qpr3
Пиксель 4а (солнечная рыба) устройство/google/sunfish-kernel android-msm-sunfish-4.14-android13-qpr3
Пиксель 4 (пламя)
Pixel 4 XL (коралловый)
устройство/google/coral-kernel android-msm-coral-4.14-android13
Пиксель 3а (сарго)
Pixel 3a XL (бонито)
устройство/google/bonito-ядро android-msm-bonito-4.9-android12L
Пиксель 3 (синяя линия)
Pixel 3 XL (штриховка)
устройство / google / crosshatch-kernel android-msm-штриховка-4.9-android12
Пиксель 2 (судак)
Pixel 2 XL (таймень)
устройство/google/wahoo-ядро android-msm-wahoo-4.4-android10-qpr3
Пиксель (парусник)
Pixel XL (марлин)
устройство/google/marlin-kernel Android-msm-marlin-3.18-pie-qpr2
Хайкей960 устройство/linaro/hikey-kernel хайки-линаро-андроид-4.14
хайки-линаро-андроид-4.19
общий-андроид12-5.4
общий-андроид13-5.10
Бигль x15 устройство/ti/beagle_x15-ядро омап-бигль-x15-андроид-4.14
омап-бигль-x15-андроид-4.19
Общее ядро ​​Android Н/Д общий-андроид-4.4
общий-андроид-4.9
общий-андроид-4.14
общий андроид-4.19
общий-андроид-4.19-стабильный
общий-андроид11-5.4
общий-андроид12-5.4
общий-андроид12-5.10
общий-андроид13-5.10
общий-андроид13-5.15
общий-андроид14-5.15
общий-андроид14-6.1
общий-Android-основной

Сборка ядра

Строительство с Базелем (Клифом)

В Android 13 появилась сборка ядер с помощью Bazel .

Чтобы собрать ядро ​​GKI для архитектуры aarch64, проверьте ветку Android Common Kernel не ранее, чем Android 13, а затем выполните следующую команду:

tools/bazel build //common:kernel_aarch64_dist

Чтобы создать дистрибутив, запустите:

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

После этого двоичный файл ядра, модули и соответствующие образы размещаются в каталоге $DIST_DIR . Если --dist_dir не указан, см. выходные данные команды для определения местоположения артефактов. Для получения подробной информации обратитесь к документации по AOSP .

Сборка с помощью build.sh (устаревшая версия)

Для веток на Android 12 или ниже, ИЛИ веток без Kleaf:

build/build.sh

Двоичный файл ядра, модули и соответствующий образ находятся в каталоге out/ BRANCH /dist .

Создание модулей поставщика для виртуального устройства

Android 13 представил сборку ядер с помощью Bazel (Kleaf), заменив build.sh .

Чтобы собрать модули virtual_device , запустите:

tools/bazel build //common-modules/virtual-device:virtual_device_x86_64_dist

Чтобы создать дистрибутив, запустите:

tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=$DIST_DIR

Дополнительные сведения о сборке ядер Android с помощью Bazel см. Kleaf — сборка ядер Android с помощью Bazel .

Подробнее о поддержке Kleaf для отдельных архитектур см. в разделе Поддержка Kleaf для устройств и ядер .

Сборка модулей поставщика для виртуального устройства с помощью build.sh (устаревшая версия)

В Android 12 Cuttlefish и Goldfish сходятся, поэтому они используют одно и то же ядро: virtual_device . Чтобы собрать модули этого ядра, используйте эту конфигурацию сборки:

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh

В Android 11 представлен GKI , который разделяет ядро ​​на образ ядра, поддерживаемый Google, и поддерживаемые поставщиком модули, которые создаются отдельно.

В этом примере показана конфигурация образа ядра:

BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

В этом примере показана конфигурация модуля (Cuttlefish и Emulator):

BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh

Поддержка Kleaf для устройств и ядер

В следующей таблице указана поддержка Kleaf для отдельных ядер устройств. Для устройств, не перечисленных в списке, обратитесь к производителю устройства.

Устройство Филиалы репо Клиф поддержка поддержка build/build.sh
Общее ядро ​​Android
db845c
Виртуальное устройство (x86_64, arm64)
Виртуальное устройство (i686, рука)
Рокпи4
общий-андроид-4.4
общий-андроид-4.9
общий-андроид-4.14
общий андроид-4.19
общий-андроид-4.19-стабильный
общий-андроид11-5.4
общий-андроид12-5.4
общий-андроид12-5.10
Общее ядро ​​Android общий-андроид13-5.10
общий-андроид13-5.15
✅ (официальный) 1
Общее ядро ​​Android общий-андроид14-5.15
общий-андроид14-6.1
общий-андроид15-6.1
общий-Android-основной
db845c общий-андроид13-5.10
db845c общий-андроид13-5.15 ✅ (официальный) 1
db845c общий-андроид14-5.15
общий-андроид14-6.1
общий-андроид15-6.1
общий-Android-основной
Виртуальное устройство (x86_64, arm64) общий-андроид13-5.10
общий-андроид13-5.15
✅ (официальный) 1 ⚠️ (не поддерживается) 2
Виртуальное устройство (x86_64, arm64) общий-андроид14-5.15
общий-андроид14-6.1
общий-андроид15-6.1
общий-Android-основной
Виртуальное устройство (i686, рука) общий-андроид13-5.10
общий-андроид13-5.15
Виртуальное устройство (i686, рука) общий-андроид14-5.15
общий-андроид14-6.1
общий-андроид15-6.1
общий-Android-основной
Рокпи4 общий-андроид13-5.10
общий-андроид13-5.15
Рокпи4 общий-андроид14-5.15
общий-андроид14-6.1
общий-андроид15-6.1
общий-Android-основной
Хайкей960 хайки-линаро-андроид-4.14
хайки-линаро-андроид-4.19
общий-андроид12-5.4
общий-андроид13-5.10
модуль fips140 общий-андроид12-5.10
общий-андроид13-5.10
общий-андроид13-5.15
модуль fips140 общий-андроид14-5.15

1 "Официальный" означает, что это официальный способ сборки ядра, хотя для сборки ядра может использоваться и альтернативный способ.

2 "Неподдерживаемый" означает, что сборка ядра с помощью этого метода должна работать, но этот метод сборки не тестируется постоянно. В будущем он может перестать строиться. Вместо этого используйте «официальный» способ сборки.

Запуск ядра

Есть несколько способов запустить специально созданное ядро. Ниже приведены известные способы, подходящие для различных сценариев разработки.

Встраивание в сборку образа Android

Скопируйте Image.lz4-dtb в соответствующее расположение двоичных файлов ядра в дереве AOSP и перестройте загрузочный образ.

В качестве альтернативы определите переменную TARGET_PREBUILT_KERNEL при использовании make bootimage (или любой другой командной строки make , создающей загрузочный образ). Эта переменная поддерживается всеми устройствами, поскольку она настраивается через device/common/populate-new-device.sh . Например:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

Прошивка и загрузка ядер через fastboot

Большинство последних устройств имеют расширение загрузчика для упрощения процесса создания и загрузки загрузочного образа.

Чтобы загрузить ядро ​​без перепрошивки:

adb reboot bootloader
fastboot boot Image.lz4-dtb

При использовании этого метода ядро ​​фактически не прошивается и не сохраняется после перезагрузки.

Запуск ядер на Cuttlefish

Вы можете запускать ядра в выбранной вами архитектуре на устройствах Cuttlefish .

Чтобы загрузить устройство Cuttlefish с определенным набором артефактов ядра , запустите команду cvd start с целевыми артефактами ядра в качестве параметров. В следующем примере команда использует артефакты ядра для цели arm64 из манифеста ядра common-android14-6.1 .

cvd start \
    -kernel_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/Image \
    -initramfs_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/initramfs.img

Дополнительные сведения см. в разделе Разработка ядер на Cuttlefish .

Настройка сборки ядра

Чтобы настроить сборки ядра для сборок Kleaf, смотрите документацию Kleaf .

Настройка сборки ядра с помощью build.sh (устаревшая версия)

Для build/build.sh на процесс и результат сборки могут влиять переменные среды. Большинство из них являются необязательными, и каждая ветка ядра должна иметь правильную конфигурацию по умолчанию. Здесь перечислены наиболее часто используемые из них. Полный (и актуальный) список см. в build/build.sh .

Переменная среды Описание Пример
BUILD_CONFIG Создайте файл конфигурации, из которого вы инициализируете среду сборки. Расположение должно быть определено относительно корневого каталога репозитория. По умолчанию build.config .
Обязательно для обычных ядер.
BUILD_CONFIG=common/build.config.gki.aarch64
CC Переопределить используемый компилятор. Возвращается к компилятору по умолчанию, определенному в build.config . CC=clang
DIST_DIR Базовый выходной каталог для дистрибутива ядра. DIST_DIR=/path/to/my/dist
OUT_DIR Базовый выходной каталог для сборки ядра. OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG Пропустить make defconfig SKIP_DEFCONFIG=1
SKIP_MRPROPER Пропустить make mrproper SKIP_MRPROPER=1

Пользовательская конфигурация ядра для локальных сборок

В Android 14 (экспериментальная версия AOSP) и выше вы можете использовать фрагменты defconfig для настройки конфигураций ядра. см. документацию Kleaf по фрагментам defconfig .

Пользовательская конфигурация ядра для локальных сборок с конфигурациями сборки (устаревшие)

В Android 13 и более ранних версиях см. следующее.

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

Задайте для переменной POST_DEFCONFIG_CMDS оператор, который оценивается сразу после выполнения обычного шага make defconfig . Поскольку файлы build.config используются в среде сборки, функции, определенные в build.config , могут вызываться как часть команд post-defconfig.

Типичным примером является отключение оптимизации времени компоновки (LTO) для ядер штриховки во время разработки. Хотя LTO выгоден для выпущенных ядер, накладные расходы во время сборки могут быть значительными. Следующий фрагмент, добавленный в локальный build.config , постоянно отключает LTO при использовании build/build.sh .

POST_DEFCONFIG_CMDS="check_defconfig && update_debug_config"
function update_debug_config() {
    ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
         -d LTO \
         -d LTO_CLANG \
         -d CFI \
         -d CFI_PERMISSIVE \
         -d CFI_CLANG
    (cd ${OUT_DIR} && \
     make O=${OUT_DIR} $archsubarch CC=${CC} CROSS_COMPILE=${CROSS_COMPILE} olddefconfig)
}

Определение версий ядра

Вы можете определить правильную версию для сборки из двух источников: дерева AOSP и образа системы.

Версия ядра из дерева AOSP

Дерево AOSP содержит готовые версии ядра. Журнал git показывает правильную версию как часть сообщения фиксации:

cd $AOSP/device/VENDOR/NAME
git log --max-count=1

Если версия ядра не указана в журнале git, получите ее из образа системы, как описано ниже.

Версия ядра из образа системы

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

file kernel

Для файлов Image.lz4-dtb выполните:

grep -a 'Linux version' Image.lz4-dtb

Создание загрузочного образа

Можно создать загрузочный образ, используя среду сборки ядра.

Создание загрузочного образа для устройств с помощью init_boot

Для устройств с разделом init_boot загрузочный образ собирается вместе с ядром. Образ initramfs не встроен в загрузочный образ.

Например, с помощью Kleaf вы можете создать загрузочный образ GKI с помощью:

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

С помощью build/build.sh (устаревшей версии) вы можете создать загрузочный образ GKI с помощью:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

Загрузочный образ GKI находится в $DIST_DIR .

Создание загрузочного образа для устройств без init_boot (устаревшая версия)

Для устройств без раздела init_boot вам потребуется двоичный файл ramdisk, который вы можете получить, загрузив загрузочный образ GKI и распаковав его. Подойдет любой загрузочный образ GKI из соответствующей версии Android.

tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4

Целевая папка — это каталог верхнего уровня дерева ядра (текущий рабочий каталог).

Если вы разрабатываете с помощью AOSP main, вы можете вместо этого загрузить артефакт сборки ramdisk-recovery.img из сборки aosp_arm64 на ci.android.com и использовать его в качестве бинарного файла ramdisk.

Когда у вас есть двоичный файл ramdisk и вы скопировали его в gki-ramdisk.lz4 в корневом каталоге сборки ядра, вы можете создать загрузочный образ, выполнив:

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=Image GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

Если вы работаете с архитектурой на основе x86, замените Image на bzImage и aarch64 на x86_64 :

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=bzImage GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

Этот файл находится в каталоге артефактов $KERNEL_ROOT/out/$KERNEL_VERSION/dist .

Загрузочный образ находится в out/<kernel branch>/dist/boot.img .