Google is committed to advancing racial equity for Black communities. See how.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Сборка ядер

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

Более свежие исходные build/build.sh ядра можно получить с помощью Repo и build/build.sh без дополнительной настройки, запустив 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 4a (рыба-солнце) устройство / Google / Sunfish-kernel Android-MSM-Sunfish-4.14-Android10-D4
Пиксель 4 (пламя)
Pixel 4 XL (коралловый)
устройство / Google / коралловое ядро android-msm-coral-4.14-android10-qpr3
Pixel 3a (сарго)
Pixel 3a XL (бонито)
устройство / Google / бонито-ядро android-msm-bonito-4.9-android10-qpr3
Pixel 3 (синий)
Pixel 3 XL (штриховка)
устройство / Google / crosshatch-kernel android-msm-crosshatch-4.9-android10-qpr3
Пиксель 2 (судак)
Pixel 2 XL (таймень)
устройство / Google / wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
Пиксель (парусник)
Pixel XL (марлин)
устройство / Google / марлин-ядро андроид-мсм-марлин-3.18-пирог-qpr2
Походы960 устройство / linaro / hikey-kernel походы-linaro-android-4.14
походы-линаро-андроид-4.19
общий-android12-5.4
Бигль x15 устройство / ti / beagle_x15-kernel omap-бигль-x15-android-4.14
omap-бигль-x15-android-4.19
Общее ядро ​​Android Нет данных общий-android-4.4
общий-android-4.9
общий-android-4.14
общий-android-4.19
общий-android-4.19-стабильный
общий-android11-5.4
общий-android12-5.4
общий-android-mainline

Сборка ядра

Затем соберите ядро ​​с помощью:

build/build.sh

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

Запуск ядра

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

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

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

В качестве альтернативы, определите переменную 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
OUT_DIR Базовый выходной каталог для сборки ядра. OUT_DIR=/path/to/my/out
DIST_DIR Базовый выходной каталог для дистрибутива ядра. OUT_DIR=/path/to/my/dist
CC Переопределить компилятор, который будет использоваться. Возвращается к компилятору по умолчанию, определенному в build.config . CC=clang
SKIP_MRPROPER Пропустить make mrproper SKIP_MRPROPER=1
SKIP_DEFCONFIG Пропустить make defconfig SKIP_DEFCONFIG=1

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

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

Установите для переменной 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 содержит предварительно созданные версии ядра. В большинстве случаев журнал git показывает правильную версию как часть сообщения о фиксации:

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

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

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

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 out/ramdisk gki-ramdisk.lz4

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

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

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

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