Как собрать ядро android
Перейти к содержимому

Как собрать ядро android

  • автор:

Редактирование ядра Андроид: лучший способ

Всем привет! Нужно отредактировать ядро Андроид 3.10. Файл boot.img. есть. Magiskboot позволяет отредактировать ramdisk прямо в телефоне, но нигде не упоминается о том, что этим инструментом можно повлиять на kernel config.

говорится о возможности редактирования ядра Clang:

ядро можно собирать компилятором Clang благодаря подготовленным проектом LLVMLinux патчам.

Подскажите, пожалуйста, оптимальный (и самый простой способ ) отредактировать kernel config, и ссылку на внятную для новичка статью на эту тему.

Перемещено hobbit из general

AnonimKA
07.06.23 03:25:28 MSK

  • Ответить на это сообщение
  • Ссылка

нигде не упоминается о том, что этим инструментом можно повлиять на kernel config

Потому что это невозможно. Конфигурация ядра задается во время его компиляции.

Подскажите, пожалуйста, оптимальный (и самый простой способ ) отредактировать kernel config

Пересобрать его из исходников. Для начала тебе стоит запросить у производителя твоего телефона исходный код ядра, в соответствии с лицензией GPLv2.

a1ba ★
( 07.06.23 04:12:15 MSK )
Последнее исправление: a1ba 07.06.23 04:12:26 MSK (всего исправлений: 1)

  • Ответить на это сообщение
  • Показать ответы
  • Ссылка

Ответ на: комментарий от a1ba 07.06.23 04:12:15 MSK

Это исходный код ядра, boot.IMG которого (найден тоже в интернете) прошивается через twrp. Вопрос: как инструментом его лучше собирать?

AnonimKA
( 07.06.23 13:30:39 MSK ) автор топика

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от AnonimKA 07.06.23 13:30:39 MSK

Вот эта инструкция будет работать (OS Android 12), проживать хочу на Linux Debian?

AnonimKA
( 07.06.23 13:33:18 MSK ) автор топика

  • Ответить на это сообщение
  • Ссылка

Жесть какая. Не ходите дети в Африку гулять.

Как уже сказали, нужны исходники ядра. Но не просто ванильные (с kernel.org), а от производителя. Тут если очень повезет, то найдутся у производителя железки на его сайте. Либо BSP какое подойдет для плат на этом SoC (system on chip) — часто производители железок берут схему из оценочной борды почти без изменений. Там будет и какой-то конфиг под эту борду/семейство, но не факт, что все заработает с этим конфигом. Производитель телефона может поставить другую камеру, аудио и т.д. + Под конкретную embedded-железку (в отличие от PC) нужен файл описания устройств DTS. + Патчи ядра от производителя телефона. Даже со всем этим 90% что сразу не взлетит, а окирпичить девайс легко. Опять же с u-boot не все гладко может пойти.

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

Какой нафиг CLang?! make, gcc кросс-средства для ARM, куча утилит. Долго объяснять.

Потренировались бы для начала собрать ядро для ПК своего на x86, потренировались бы на каких OrangePi, чтоб вкурить что к чему.

И, судя по версии ядра 3.1 в телефоне что-то типа Android 2.3 или из тех же времен (2012-й?). Вы чего добиться хотите обновлением ядра? Андроид от этого свежее не станет, а новый собрать из AOSP это еще тоже задача отдельная, опять же со всякими патчами от производителя телефона, которых 100% в 2023-м не найти.

bugs-bunny ★
( 07.06.23 21:00:16 MSK )
Последнее исправление: bugs-bunny 07.06.23 21:19:25 MSK (всего исправлений: 2)

  • Ответить на это сообщение
  • Показать ответы
  • Ссылка

Компиляция ядра Android

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

Тема этой статьи — компиляция ядра, собственно того что отвечает за работу всей аппаратуры телефона и коммуникации. Текст будет редактироваться, дополняться — пишите, поправляйте, пробуйте!

Подготовка

Для компиляции ядер я использую или Linux (UBUNTU) или Windows Bash UBUNTU под Windows 10.

Как настроить все программы я напишу позже (т.к. требует и моей подготовки), сейчас перейду к главному

Компиляция

Компиляция ядер происходит в 2 этапа + сборка DTB + сборка ядра для прошивки:

  1. Компиляция конфигурации будущего ядра
  2. Компиляция самого ядра + возможно библиотеки уровня ядра (для MTK я этого не видел, только для MSM и другого процессора)
  3. Дополнительно собирается DTB файл конфигурации устройств, если настройка конфигурации ядра этого требует
  4. Дополнительно необходимо собрать boot.img

Первое что делается, задаются глобальные переменные параметров процессора (ARM или ARM64) и пути к компилятору (набор программам которые преобразуют текст исходного кода в двоичный файл), все это делается командами:

export ARCH=arm
export CROSS_COMPILE=prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
export TARGET=out

export означает то, что переменная будет доступна для всех запущенных программ и будет храниться в глобальном списке переменных (окружения bash).
ARCH— тип архитектуры процессора под который будет компилироваться ядро
CROSS_COMPILE — указывает путь, где компилятор будет искать программы компиляции и сборки ядра.
TARGET — папка, куда компилятор будет складывать все свои файлы.

Далее компилируем конфигурационный файл, итогом компиляции будет файл $TARGET/.config

make O=$TARGET ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE X5PRO_6735m_defconfig

make — стандартная программа для сборки программ по сценариям
O=
$TARGET — папка, куда буду складываться все скомпилированные файлы и конфигурации, ее надо указать потому что многие модули ядра используют ее для своих целей, берется из глобальной переменной установленной в примере выше
ARCH=$ARCH — тип архитектуры процессора, обычно arm или arm64, в примере берется из глобальной переменной установленной выше.
CROSS_COMPILE= — путь к компилятору, мы задали глобальную переменную в примере выше
5PRO_6735m_defconfig — название конфигурационного файла для компиляции ядра вашего телефона, находится по пути arch/$ARCH/configs/ и зависит от типа выбранной конфигурации процессора, мы задали ее в глобальной переменной $ARCH

Далее начинаем компиляцию самого ядра

make O=$TARGET ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE -j4

Т.е. такая же команда как и выше но без указания конфигурационного файла.
-j4 — это параметр говорит, сколько процессоров (процессов компиляции) использовать при работе. У меня в компьютере 4 физических процессора, и я использую цифру 4, если у вас в компьютере 8 процессов, то используйте цифру 8! Но чем больше цифра, тем больше используется памяти. Если у вас слабый компьютер, то используйте меньшее число.

По окончании компиляции, у меня он длится около 10 минут, в зависимости от версии ядра и процессора получится несколько файлов — частей будущего файла boot.img или recovery.img и размещаются в папке $TARGET/arch/$ARCH/boot и называются по разному в зависимости от архитектуры и процессора:

  • Image.gz — упакованное в архив ядро, при запуске телефона ядро распаковывается в оперативную память и запускается, файл DTB располагается отдельно
  • Image — не упакованное ядро, файл DTB располагается отдельно
  • Image.gz-dtb — упакованное в архив ядро с встроенным файлом DTB для ARM64
  • zImage-dtb — упакованное в архив ядро с встроенным файлом DTB для ARM

Для компиляции файла DTB (DTB — двоичный файл с описанием настроек всего оборудования телефона, DTS — текстовой формат файла DTB) для Qualcomm я дополнительно запускаю команду

dtbToolCM -2 -o $TARGET/arch/$ARCH/boot/dtb -s 2048 -p $TARGET/scripts/dtc/ $TARGET/arch/$ARCH/boot/dts/

Создается готовый для вставки в ядро файл dtb из скомпилированных раздельно файлов DTB находящихся в $TARGET/arch/$ARCH/boot/dts/

Для поиска и копирования всех возможно скомпилированных модулей для Qualcomm я использую команду которая ищет файлы по шаблону и копирует в одну папку.

find «$TARGET/» -name *.ko -exec cp <> «modules/» \;

Примеры

Компиляция ядра под процессор MTK для телефона DOOGEE X5PRO

git clone https://github.com/SnowCat6/DOOGEE-kernel-3.18.git
cd DOOGEE-kernel-3.18
export ARCH=arm
export CROSS_COMPILE=prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
export TARGET=out
make O=$TARGET ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE X5PRO_6735m_defconfig
make O=$TARGET ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE -j4

Иходник ядра для DOOGEE X5PRO найдете здесь.
Лучше забирать через команду git clone https://github.com/SnowCat6/DOOGEE-kernel-3.18.git тогда вы сможете всегда обновлять до самой свежей версии командой git pull

Компиляция ядра под процессор Qualcomm для телефона Archos 50 Diamond

git clone https://github.com/SnowCat6/android_kernel_cyanogen_msm8916.git
cd android_kernel_cyanogen_msm8916
export ARCH=arm64
export CROSS_COMPILE=prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
export TARGET=out
make O=$TARGET ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE lineageos_D50_defconfig
make O=$TARGET ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE -j4
dtbToolCM -2 -o $TARGET/arch/$ARCH/boot/dtb -s 2048 -p $TARGET/scripts/dtc/ $TARGET/arch/$ARCH/boot/dts

Автор искренне выражает благодарность всем кто словом и материально поддерживает мои проекты.
К сожалению реально помогающих очень мало и каждый хочет схалявничать и получить все задаром.

(c) Все авторские материалы должны быть скопированы на другие ресурсы с указанием ссылки на этот сайт.
Не разрешается размещать прямые ссылки на файлы на других сайтах — указывайте ссылки на страницы этого сайта.
Прошу вас содействовать в наведении порядка!

Основной спонсор проекта моя микрокомпания — «Виртуальный Проект». Если нужен сайт — я сделаю!

Как собрать KernelSU? ​

Прежде всего, необходимо ознакомиться с официальной документацией Android по сборке ядра:

Эта страница предназначена для устройств GKI, если вы используете старое ядро, пожалуйста, обратитесь к Как интегрировать KernelSU для не GKI ядер?.

Сборка ядра ​

Синхронизация исходного кода ядра ​

repo init -u https://android.googlesource.com/kernel/manifest mv kernel_manifest.xml> .repo/manifests repo init -m manifest.xml repo sync

Файл — это файл манифеста, который может однозначно определять сборку, с его помощью можно выполнить пересборку. Файл манифеста следует загрузить с сайта Сборки релизов Google GKI

Построение ​

Пожалуйста, сначала ознакомьтесь с официальной документацией.

Например, нам необходимо собрать образ ядра aarch64:

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

Не забудьте добавить флаг LTO=thin , иначе сборка может завершиться неудачей, если память вашего компьютера меньше 24 Гб.

Начиная с Android 13, сборка ядра осуществляется с помощью bazel :

tools/bazel build --config=fast //common:kernel_aarch64_dist

Сборка ядра с помощью KernelSU ​

Если вы успешно собрали ядро, то собрать KernelSU очень просто, выберите любой запуск в корневом каталоге исходного кода ядра:

  • Последний тэг(стабильный)
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -
  • Основная ветвь(разработка)
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s main
  • Выбранный тэг(Например, версия v0.5.2)
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s v0.5.2

А затем пересоберите ядро и получите образ ядра с KernelSU!

Сборка ядра для Android-устройств на примере Solid Kernel для LG e975

Установим необходимые пакеты. Набирем в терминале:

sudo su 

Нажимаем Enter и пишем далее:

apt-get install bison build-essential curl flex lib32ncurses5-dev lib32readline-gplv2-dev lib32z1-dev libesd0-dev libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 libxml2-utils lzop openjdk-7-jdk openjdk-7-jre pngcrush schedtool squashfs-tools xsltproc zip zlib1g-dev git-core make phablet-tools gperf 

Система готова.

Качаем исходники

Идем на GitHub и скачиваем исходники (исходники для каждого девайса разные, поэтому ссылок давать не буду) архивом (в правой части экрана должна находиться кнопочка «Download ZIP»). Распаковываем архив в любое удобное место (у меня это папка /home/system-exe/Solid).

Качаем тулчейн. Переходим по ссылке, отмечаем галочкой нужный тулчейн (для меня это cortex-a15, зависит от ядер процессора) и нажимаем «скачать». Распаковываем скачанный архив в папку /home/%USERNAME%/Toolchain/Linaro-4.9.3 (вместо %USERNAME% подставляем имя учетки).

Выдираем файл конфигурации из девайса

Идем по пути /proc (на телефоне) и копируем файл config.gz на комп, распаковываем и получаем файл config, которые переименовываем по шаблону %устройство%_defconfig (у меня это e975_defconfig). Кладем получившийся файл по пути /home/%USERNAME%/Solid/arch/arm/configs

С подготовкой окончили.

Сборка ядра

Заходим в терминал и набираем команду:

cd Solid 

(таким образом мы перешли в папку с нашими исходниками)

make %устройство%_defconfig 

(у меня надо так: make e975_defconfig)

После завершения пишем:

make menuconfig 

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

После завершения начинаем сборку:

make -j8 

Параметр -j8 нужен только если у вас многоядерный процессор. Цифра 8 определяет количество ядер(потоков, в случае с Intel i3, i5, i7 процессорами). К примеру у меня — Intel i7, он четырехядерный, но поддерживает два потока на каждое ядро, поэтому 2 * 4 = 8.

В конце должна появиться надпись «zImage is ready».

Идем по пути /home/%USERNAME%/Solid/arch/arm/boot и видим там наше ядро — zImage.

Тестирование

Теперь нам осталось заставить работать этот самый zImage на нашем устройстве.

А вот теперь трижды подумайте надо ли вам это? Уверены ли вы в своих силах и в том, что правильно собрали ядро?

Подумали? Уверены? Точно уверены? Тогда продолжаем.

Извлекаем boot.img из нашего девайса. Набираем в терминале на телефоне:

su dd if=dev/block/platform/. /by-name/boot of=sdcard/boot.img 

Вместо… подставляем путь до папки by-name (у меня надо подставить msm_sdcc.1).

Переносим boot.img, который лежит на карте памяти, на комп. Распаковываем его (в интернете есть множество описаний распаковки и запаковки boot.img), меняем оригинальный zImage на наш и собираем boot.img.

Закидываем наш собранный образ на карту памяти под именем new_boot.img
В терминале набираем:

su dd if=sdcard/new_boot.img of=dev/block/platform/. /by-name/boot 

Вместо… подставляем путь до папки by-name (у меня надо подставить msm_sdcc.1).

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

Для отката в случае неудачи используем наш оригинальный boot.img, который надо было оставить на карте памяти. Для отката в терминале набираем:

su dd if=sdcard/boot.img of=dev/block/platform/. /by-name/boot 

Вместо… подставляем путь до папки by-name (у меня надо подставить msm_sdcc.1).

Эпилог

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *