На этой странице подробно описан процесс сборки собственных ядер для устройств Android. Эти инструкции помогут вам выбрать правильные исходные коды, собрать ядро и встроить результаты в образ системы, созданный в рамках проекта Android Open Source Project (AOSP).
Загрузите исходники и инструменты сборки
Для последних версий ядер используйте 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 ), которые можно использовать с предыдущей командой `repo init`, см. в разделе Ветви ядра и их системы сборки .
Подробную информацию о загрузке и компиляции ядер для устройств Pixel см. в разделе Сборка ядер Pixel .
Сборка ядра
Сборка с помощью Bazel (Kleaf)
В Android 13 появилась возможность сборки ядер с помощью Bazel .
Чтобы создать дистрибутив ядра GKI для архитектуры aarch64, проверьте ветку Android Common Kernel не ниже Android 13, а затем выполните следующую команду:
tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]
После этого исполняемый файл ядра, модули и соответствующие образы будут располагаться в каталоге $DIST_DIR
. Если --destdir
не указан, расположение артефактов можно узнать в выводе команды. Подробнее см. в документации по AOSP .
Сборка с помощью build.sh (устаревший)
Для веток на базе Android 12 или ниже, ИЛИ веток без Kleaf:
build/build.sh
Двоичный файл ядра, модули и соответствующий образ находятся в каталоге out/ BRANCH /dist
.
Создайте модули поставщика для виртуального устройства
В Android 13 появилась возможность сборки ядер с помощью Bazel (Kleaf), заменив build.sh
.
Чтобы создать дистрибутив для модулей virtual_device
, выполните:
tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist [-- --destdir=$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
Запустить ядро
Существует несколько способов запуска самостоятельно собранного ядра. Ниже перечислены известные способы, подходящие для различных сценариев разработки.
Встроить в сборку образа 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 create
указав артефакты целевого ядра в качестве параметров. В следующем примере команда использует артефакты ядра для целевой платформы arm64 из манифеста ядра common-android14-6.1
.
cvd create \
-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 и выше вы можете использовать фрагменты defconfig для настройки конфигураций ядра. См. документацию Kleaf по фрагментам defconfig .
Пользовательская конфигурация ядра для локальных сборок с конфигурациями сборки (устаревшая версия)
В Android 13 и ниже смотрите следующее.
Если вам необходимо регулярно переключать параметр конфигурации ядра, например, при работе над функцией, или если вам необходимо задать параметр для целей разработки, вы можете добиться такой гибкости, сохранив локальную модификацию или копию конфигурации сборки.
Установите переменную POST_DEFCONFIG_CMDS в оператор, который будет выполнен сразу после выполнения стандартного шага make defconfig
. Поскольку файлы build.config
поступают в среду сборки, функции, определённые в build.config
можно вызывать как часть команд post-defconfig.
Типичным примером является отключение оптимизации времени компоновки (LTO) для ядер Crosshatch во время разработки. Хотя 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 [-- --destdir=$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, вы можете вместо этого загрузить артефакт сборки 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
.