Как быстро собрать ядро Android и подключить модули
Краткий ответ: подготовьте Linux‑окружение, скачайте подходящий исходник ядра, скопируйте или создайте defconfig для вашего SoC, соберите ядро через Clang/GCC, затем скомпилируйте .ko модули и установите их в /system/lib/modules или в boot.img. Ниже — пошаговая инструкция с практическими командами.
Подготовка окружения и требования
Минимум: Ubuntu 22.04 (или другая LTS), 8+ ядер CPU, 16 ГБ RAM, ~100 ГБ свободного диска. Установите зависимости:
sudo apt update
sudo apt install git-core gnupg flex bison build-essential zip curl zlib1g-dev \
gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev \
libxml2-utils xsltproc unzip fontconfig python3 openjdk-11-jdk
Зарегистрируйте GPG‑ключи AOSP, если используете AOSP‑репозитории:
gpg --keyserver keyserver.ubuntu.com --recv-keys 8CB30BEA831E1B06
gpg -a --export 8CB30BEA831E1B06 | sudo apt-key add -
Отдельный раздел под /android упростит работу: исходники ~20–50 ГБ, объектные файлы ~30+ ГБ.
Скачивание исходников и выбор ветки
Определите ветку под ваше устройство (GKI для универсального, vendor/производитель/lineage для кастомов). Пример GKI:
mkdir -p ~/android/kernel && cd ~/android/kernel
git clone https://android.googlesource.com/kernel/common -b android-mainline
cd common
Для конкретного устройства найдите defconfig в arch/arm64/configs/ (например, exynos*_defconfig) и используйте его как отправную точку.
Конфигурация ядра
Создайте выходной каталог и загрузите конфигурацию:
make O=out ARCH=arm64 mydevice_defconfig
make O=out ARCH=arm64 menuconfig
Обязательные опции для модулей и Android:
- CONFIG_MODULES=y
- CONFIG_ANDROID_BINDER_IPC=y (если нужно)
- Включайте опции осознанно — читайте описания.
Не меняйте опции вслепую — неверный config часто приводит к bootloop.
Сохраните конфигурацию. Для автоматической модификации можно использовать scripts/config.
Сборка ядра
Рекомендуется Clang для современных Android‑ядр:
export PATH=/path/to/clang/bin:$PATH
make O=out ARCH=arm64 -j$(nproc)
Результат: out/arch/arm64/boot/Image.gz-dtb (или Image) и модули в out/lib/modules. Логи собираются в out/build.log — ищите ошибки:
grep -i error out/build.log || true
Если OOM — уменьшите параллельность: -j4.
Компиляция и упаковка модулей
Чтобы собрать конкретные модули:
make O=out ARCH=arm64 M=drivers/net/wireless modules -j$(nproc)
Скопируйте .ko на устройство (нужен root или TWRP):
- Для старых устройств: /system/lib/modules/
- Для современных — включите модули в boot.img или используйте Magisk модуль (если нужно загружать до init).
Загрузка модуля на устройстве:
su
insmod /system/lib/modules/your_module.ko
# или modprobe если доступен
Для упаковки в boot.img используйте Android Image Kitchen или формируйте ramdisk с init.rc, который подгружает модули.
Установка ядра на устройство и проверка
Разблокируйте загрузчик, затем прошейте boot.img:
fastboot flash boot new-boot.img
fastboot reboot
Проверка:
adb shell uname -r
adb shell dmesg | grep -i error
Первая загрузка с новым ядром может занять больше времени — дождитесь полного запуска.
Частые ошибки
- "No rule to make target" — неверный путь или defconfig; проверьте ARCH и O.
- Bootloop — откатитесь к стоковому образу или используйте AnyKernel шаблон для безопасной установки.
- Модули не загружаются — несоответствие версий (uname -r) или отсутствует EXPORT_SYMBOL для зависимостей.
- OOM при сборке — уменьшите параллелизм или добавьте swap.
FAQ
- Как узнать правильный defconfig для устройства? — Ищите в arch/arm64/configs или в репозитории производителя/LineageOS для вашего SoC.
- Нужен ли root? — Да, для копирования модулей в /system или для установки через init требуется root/TWRP.
- Как вернуть сток? — Прошейте стоковый boot/partition через fastboot/Odin/MiFlash согласно производителю.
Если хотите, могу сгенерировать список команд для вашего конкретного устройства (SoC и ROM) — пришлите модель и используемую ветку ядра.