Как собрать собственное ядро ​​Android —

Если вы когда-либо задавались вопросом «как собрать ядро ​​Android», это руководство для вас. Создание собственного ядра может быть полезным, поскольку оно даст вам большую степень контроля над вашим устройством Android, от процессора, оперативной памяти, графического процессора и даже до батареи.

Это очень практический процесс, который включает в себя множество команд компиляции и консоли, но если вы знакомы с Linux (или хорошо разбираетесь в следующих направлениях), это не должно быть проблемой.

Обратите внимание, что это руководство предназначено для устройств, не принадлежащих Mediatek. У Appual есть руководство по компиляции ядра, специально предназначенное для Android-устройств на базе Mediatek, здесь: Как собрать ядро ​​Android Mediatek из Source

Другие интересные статьи Appual включают в себя:

  • Как создать собственное ПЗУ из Android Open Source Project | Pt. 2
  • Как вручную оформить тему Android System UI

Если вы строите обычай ядро, вам просто нужно будет клонировать ядро ​​из Git с помощью команд, представленных ниже. Но если вы собираете стандартное ядро, вам нужно знать, где взять исходное ядро ​​из исходного кода (по разным причинам).

Исходные исходники ядра для различных брендов:

  • Google
  • LG
  • Samsung
  • HTC
  • OnePlus
  • Motorola
  • Sony

Для загрузки ядра либо используйте git clone, либо скачайте файл tarball и распакуйте его.

Вот команда git:

мерзкий клон -b

-ИЛИ ЖЕ-

tar -xvf

Так, в качестве примера, это будет команда, чтобы получить последнее ядро ​​Nexus 6P Nougat 3.10 от Google:
git clone -b android-msm-angler-3.10-nougat-mr2 https://android.googlesource.com/kernel/msm/ angler

Это должно клонировать репозиторий kernel / msm в папку angler и автоматически извлекать android-msm-angler-3.10-nougat-mr2.

Теперь, поскольку большинство Android-устройств основаны на ARM, нам потребуется использовать компилятор, который будет ориентирован на устройства ARM — это означает, что хост / нативный компилятор не будет работать, если вы не компилируете на другом устройстве ARM. У вас есть несколько вариантов здесь. Вы можете скомпилировать его самостоятельно, если знаете как, используя что-то вроде Crosstool-NG. Кроме того, вы можете скачать готовый компилятор, например, тот, который Google предоставляет для Arm 32-bit и Arm64.

Перед загрузкой готового компилятора вам необходимо знать точную архитектуру вашего устройства, поэтому используйте приложение, такое как CPU-Z, чтобы определить его.

Еще одним популярным набором инструментов будет UberTC, но для любых ядер выше 4.9 вам нужно будет их исправлять, и в первую очередь рекомендуется компилировать с помощью набора инструментов Google.

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

Теперь укажите Makefile на ваш компилятор, запустить его из папки toolchain.

  • экспорт CROSS_COMPILE = $ (pwd) / bin / —

Пример:

  • export CROSS_COMPILE = $ (pwd) / bin / aarch64-linux-android-

Теперь сообщите Makefile архитектуру вашего устройства.

  • экспорт ARCH = экспорт SUBARCH =

Пример:

  • экспорт ARCH = arm64 экспорт SUBARCH = arm64 

Найдите нужный вам defconfig, перейдя в папку arch // config в исходном коде ядра (например, arch / arm64 / configs).

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

Также могут быть найдены общие конфиги Qualcomm, обычно это что-то вроде (msm-perf_defconfig, msmcortex-perf_defconfig).

Сборка ядра

Код:

очистить
сделать mrproper
делать
make -j $ (nproc –all)

Когда эти команды успешны, у вас должен быть файл Image, Image-dtb, Image.gz или Image.gz-dtb в конце.

Если эти команды не сработали, вам может понадобиться указать выходной каталог при создании нового ядра на основе CAF, например:

mkdir -p out
сделать O = out чистым
сделать O = Out mrproper
сделать O = Out
make O = out -j $ (nproc –all)

Если он по-прежнему не хочет работать, что-то сломано — проверьте заголовки или обратитесь к разработчикам ядра.

Если ядро ​​было успешно скомпилировано, вам необходимо его прошить. Есть два различных способа сделать это — вы можете распаковать и перепаковать загрузочный образ, используя либо Android Image Kitchen, либо AnyKernel2.

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

Перепрошивка ядра в Android Image Kitchen

Скачать Android Image Kitchen

Извлеките загрузочный образ вашего Android-устройства из последней доступной версии (будь то стандартный или пользовательский ROM).

Теперь распакуйте изображение, используя этот код:
unpackimg.sh .img

Затем найдите файл zImage и замените его на скомпилированный образ ядра — переименуйте его в то, что было в образе загрузки.

Теперь запустите этот код, чтобы упаковать образ:
repackimg.sh

Теперь вы можете прошить новый загрузочный образ, используя fastboot, TWRP и т. Д.

Перепрошивка ядра в AnyKernel2

Загрузите последнюю версию AnyKernel2

Примените этот патч, чтобы очистить все демонстрационные файлы.
wget https://github.com/nathanchance/AnyKernel2/commit/addb6ea860aab14f0ef684f6956d17418f95f29a.diff
патч -p1 < addb6ea860aab14f0ef684f6956d17418f95f29a.diff
rm addb6ea860aab14f0ef684f6956d17418f95f29a.diff

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

  • строка: имя вашего ядра
  • название#: Список всех кодовых имен вашего устройства (из /system/build.prop: ro.product.device, ro.build.product)
  • блок: Путь вашего загрузочного образа в вашем fstab. Fstab может быть открыт из корня вашего устройства, и он будет выглядеть примерно так: https://android.googlesource.com/dev…r/fstab.angler

Первый столбец — это значение, которое вы хотите установить для блока.

Теперь повторно заархивируйте ядро ​​и прошейте его в AnyKernel2:
zip -r9 kernel.zip * -x README.md kernel.zip

Имейте в виду, что многие ядра CAF включают скрипт Python, который вызывает -Werror, что в основном приводит к тому, что ваша сборка выдает ошибки при малейших ошибках. Поэтому для более высоких версий GCC (которые включают больше предупреждений) вам, как правило, нужно внести изменения в Makefile:

diff --git a / Makefile b / Makefile
индекс 1aaa760f255f..bfccd5594630 100644
--- а / Makefile
+++ б / Makefile
@@ -326,7 +326,7 @@ include $ (srctree) /scripts/Kbuild.include
AS = $ (CROSS_COMPILE) как
LD = $ (CROSS_COMPILE) ld
-REAL_CC = $ (CROSS_COMPILE) gcc
+CC = $ (CROSS_COMPILE) gcc
CPP = $ (CC) -E
AR = $ (CROSS_COMPILE) ar
NM = $ (CROSS_COMPILE) нм
@@ -340,10 +340,6 @@ DEPMOD = / sbin / depmod
PERL = Perl
CHECK = разреженный

-# Используйте обертку для компилятора. Эта обертка сканирует на новые
-# предупреждения и вызывает остановку сборки при их обнаружении.
-CC = $ (srctree) /scripts/gcc-wrapper.py $ (REAL_CC)
-
CHECKFLAGS: = -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
-Wbitwise -Wno-return-void $ (CF)
CFLAGS_MODULE =

Использование более высокого набора инструментов GCC (5.x, 6.x, 7.x или даже 8.x) потребует от вас обнуления сценария оболочки GCC, как описано выше, и использования унифицированного заголовочного файла GCC (выберите следующее, если у вас есть include /linux/compiler-gcc#.h файл):

3.4 / 3.10: https://git.kernel.org/pub/scm/linux…9bb8868d562a8a
3,18: https://git.kernel.org/pub/scm/linux…9f67d656b1ec2f

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

Ваше ядро ​​собрано и готово к работе!

Ссылка на основную публикацию