Сборка ядер

Подробности этой страницы процесса создания пользовательского ядра для устройств Android. Эти инструкции проведут вас через процесс выбора правильных источников, сборки ядра и встраивания результатов в образ системы, созданный из Android Open Source Project (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 Филиалы репо
Pixel 5a (барбет) устройство / гугл / барбет-ядро андроид-мсм-барбет-4,19-android12
Пиксель 5 (красноперый)
Pixel 4a (5G) (ежевика)
устройство / Google / Redbull-ядро android-msm-redbull-4.19-android12
Pixel 4a (рыба-солнце) устройство / Google / Sunfish-kernel Android-MSM-Sunfish-4.14-android12
Пиксель 4 (пламя)
Pixel 4 XL (коралловый)
устройство / Google / коралловое ядро андроид-мсм-коралловый-4.14-android12
Pixel 3a (сарго)
Pixel 3a XL (бонито)
устройство / Google / бонито-ядро андроид-мсм-бонито-4.9-android12
Pixel 3 (синий)
Pixel 3 XL (штриховка)
устройство / Google / crosshatch-kernel android-msm-crosshatch-4.9-android12
Пиксель 2 (судак)
Pixel 2 XL (таймень)
устройство / Google / wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
Пиксель (парусник)
Pixel XL (марлин)
устройство / Google / марлин-ядро андроид-мсм-марлин-3.18-пирог-qpr2
Походы960 устройство / linaro / hikey-kernel походы-линаро-андроид-4.14
походы-линаро-андроид-4.19
общий-android12-5.4
Бигль x15 устройство / ti / beagle_x15-kernel omap-бигль-x15-android-4.14
omap-бигль-x15-android-4.19
Общее ядро ​​Android N / A общий-android-4.4
общий-android-4.9
общий-android-4.14
общий-android-4.19
общий-android-4.19-стабильный
общий-android11-5.4
общий-android12-5.4
общий-android12-5.10
общий-android-mainline

Сборка ядра

Затем соберите ядро ​​следующим образом:

build/build.sh

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

Сборка модулей GKI

Android 11 введен ГКИ , отделяющее ядро в 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

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

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

Запуск ядра

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

Встраивание в сборку образа 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

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

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

На процесс сборки и результат могут влиять переменные среды. Большинство из них являются необязательными, и каждая ветвь ядра должна иметь правильную конфигурацию по умолчанию. Здесь перечислены наиболее часто используемые. Для получения списка полной (и уточненный), см 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

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

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

Установить переменную POST_DEFCONFIG_CMDS в заявлении, которое оценивается сразу после обычного make defconfig шаг сделан. Как build.config файлы поставляются в среде сборки, функции , определенные в build.config можно назвать как часть команды после 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

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

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

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

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

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

Если у вас есть виртуальный диск бинарных и скопировали его в 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 .