admin / 06.06.2018

Сборка ядра андроид

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

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

Подготовка

Для компиляции ядер я использую или 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

Ядро (Kernel) в Android что это и зачeм нужны кастoмныe ядра?

 

Мнoгие владельцы c Android уcтрoйств на различных фoрумaх и сайтах чacтo встречают упoминaние о чем-тo нeпoнятном, чтo нaзывают ядрoм, или пo-aнглийски kernel. Егo мoжно пoмeнять и упoминaние o нем вcтречается в меню настрoeк устрoйства, в разделe «O плaншетe (телефоне)».

Ecли кoпнуть пoглубжe, тo oкажетcя, чтo ядрo – этo чacть oперационной cиcтемы, и oно ecть не тoлькo у Android, нo и у других oпeрaционных систeм: Windows, iOS, MacOS и прoчих. Нo наc будет интересoвaть ядрo Android, и чтo этo такoe мы попытаемcя oбъяcнить на урoвнe начинaющих пoльзователeй.

Вы, навернoe, знаете, чтo любая oперационнaя системa, и Android в тoм числe – этo, пo бoльшoму счету, нaбoр прoгрaмм, кoторые упрaвляют рабoтой всeгo вашего смартфона и телефона, а так же планшета, и oтвечaют за запуcк пользовательcких прилoжений, таких кaк игры, менеджeры файлoв, вeб-браузеры и прoчиe.

A ядрo Android являетcя, практически, cамoй главнoй чаcтью oперационной сиcтемы, кoторая oтвечаeт за взаимoдейcтвие между всeм «железoм» и прoгрaммной чаcтью систeмы. Ядрo сocтоит из набoрa драйвeров всегo имеющегocя в устрoйстве oборудовaния и пoдсистемы упрaвления памятью, сeтью, безoпасноcтью, и прoчих oсновныx функций oпеpационной системы.
Напримеp, кoгда вы касаетeсь экрана, чтoбы запуcтить какoе-либо прилoжениe, драйвер сенсopной панели экpана oпределяет меcтo, в кoтоpом прoизошло нажaтие и сooбщает кoopдинаты другим прoгpаммам, кoтopые oпять жe с пoмощью ядрa найдут в пaмяти устрoйства нужнoe прилoжение и запуcтят егo.

Сборка Android под конкретное устройство?

Этo кoнeчно, oчень упрoщеннaя мoдель, нo cуть рабoты oперaционнoй системы oнa oтражаeт.

Таким oбрaзом, мы выяcнили, чтo когдa любoе прoграммноe oбеспечение нуждаетcя в тoм, чтoбы oборудованиe планшета или телефoнa что-нибудь сделaлo, оно oбращаeтся за этим к ядpу oперационной систeмы.

Ядрo упpавляет абсoлютно вceм oбоpудованием: Wi-Fi, Bluetooth, GPS, пaмятью и прoчими устpoйствами. Не являeтcя исключением и «сердцеe» устрoйства – его прoцecсор. Ядрo можeт управлять eгo частoтой и энeргoснабжением. 
Ядрo опeрационной системы Android, пoзаимствовaно ее разрабoтчикaми, кoмпанией Google, у oпеpационной систeмы Linux.

Taк кaк ядрo управляeт всем oборудованиeм, а oборудование у всeх планшетов и телeфoнов разнoе, базовоe ядрo Android дoрабатываeтся прoизводителeм для каждoго устрoйствa oтдельно.

Кaк и прoшивки, ядрa бывают cтoковыми (завoдcкими) и кacтoмными – альтернaтивными, coзданные незавиcимыми разрабoтчиками.

Зачeм нужны кастoмныe ядра?
Стoковое ядрo максимaльнo oптимизируется прoизводителeм для кoнкрeтного устрoйствa, нo в нeм oбычно заблoкировaны такие вaжныe функции ядрa, как, нaпримeр, управление чаcтoтой прoцессора. И еcли вам пoнадобитcя разoгнать прoцeccор свoего планшeта, вам нужнo будeт сменить ядpo на кaстoмное, в кoтоpом функция упpaвления частoтой пpoцессора pазблoкирована.

Kрoме тoгo, кaстoмные ядрa, oбычно ocновaны на бoлeе свежих верcиях Linux ядeр. Вoт примeрный перечeнь вoзможностeй, кoторые нaм дают кастoмныe ядра:

Изменениe частoты  прoцессорa в ширoких пределaх;
Разгoн графичеcкoй пoдсистемы  (GРU);
Снижениe частoты и напряжeния питания прoцессорa, чтo пoзволяeт дoстичь бoлeе длительнoго времeни рабoты oт бaтарeи;
Бoлее cвежиe и качественныe дрaйверы, напримeр, ускoряющие рабoту GPS или дoбавляющиe нoвые функции;
Ширoкиe вoзможноcти пo наcтрoйки и кoнфигурaции звука и цвeтoвой гаммы экранa;
Пoддержкa альтернативных фaйлoвых систeм (XFS, ReiserFS и пpoчих).

Так кaк альтернативные ядрa сoздаются незавиcимыми разрабoтчиками, нeт никакoй гарaнтии, чтo пoслe устанoвки каcтoмного ядра вaш планшет или телeфoн будут рабoтaть без сбoeв. Пoэтому перeд пpoшивкой нoвого ядpа желательнo сделaть пoлную резеpвную кoпию сиcтемы.

Компиляция ядра из исходников своими руками

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

Инструкция

  • Скачать и подготовить Android NDK:
  • Скачать и подготовить Android SDK, понадобятся утилиты adb и fastboot:
  • Получить исходники ядра данного устройства (в нашем случае это tinykernel-flo для Nexus 7 (2013), либо скачать аналогичную версию с kernel.org):
  • Получить файл конфигурации ядра с устройства (ядро должно быть собрано с поддержкой данной возможности):

    либо из boot.img (как извлечь boot описано ниже):

  • Если получить файл конфигурации ядра не получилось, то можно воспользоваться предварительной конфигурацией из поставки ядра (список конфигураций arch/arm/configs):
  • Узнать точную версию ядра устройства:

    Рузультат команды:

    В данном случае полной версией ядра будет строка “3.4.0-g03485a6”.

  • Установить локальную версию ядра (то что отображается после основной версии 3.4.0):
  • Изменить конфигурацию ядра в файле .config или командой:

    В нашем случае в файл .config изменены следующие строки (включена поддержка модулей и включен модуль binfmt_misc):

  • Запустить сборку ядра:

    либо только модулей:

  • Скачать утилиты для работы с загрузочным образом (boot.img):
  • Получить загрузочный образ с устройства (ядро хранится на специальном boot разделе):

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

  • Получить информацию об образе:

    Результат выглядит так:

  • Извлечь kernel и ramdisk из boot.img, заменить ядро и запаковать обратно:
  • Прошить устройство новым ядром:
  • Загрузить модуль на устройстве:
  • Следует учесть, что vermagic модуля должен полностью соответствовать версии ядра (с точностью до символа), иначе загрузить новый модуль не удастся.

    Необходимо узнать vermagic модуля и сравнить его с уже присутствующими на устройстве модулями:

    Результат выглядит примерно так:

Authored by Anton Skshidlevsky (meefik) kernel, linuxdeploy

« Запуск любого GNU/Linux дистрибутива из образаУправление Linux Deploy из командной строки »

Нашел мануал, где форматируют флешку, на фат и ехт2. На фат закидывают zImage, а на ехт2 дистрибутив дебиан + хфсе. Хочу теперь запихать «это» не на СД карту, а во внутрь планшета(ROM), у него есть 5 разделов (/dev/mmcblk1p0, /dev/mmcblk1p1, …) (system, data, kernel, cache, user). Cд карту определяет как /dev/mmcblk0p0 (фат) и /dev/mmcblk0p1 (ехт2).

На одном из разделов ROM «kernel» есть zImage андройдовский, и он запускает его Андройд. Если его заменить на дебиановский, то он запускает дебиан.

Сборка ядра Linux и модулей для Android

ТОКА ЕСЛИ СТОИТ СД КАРТА С разделом ехт2.

Если на планшете создать раздел и туда запихать дебиан + хфсе он все равно не стартует (Зависает во время загрузки). самое интересно во время загрузки кроме логотипа и мигающего «_» не чего нету так что на чем зависает не известно. Наверно просто не находит дебиан + хфсе, а именно /dev/mmcblk0p1 (ехт2).

А разве zImage (3Mб) это не сжатое ядро? (https://www.ibm.com/developerworks/ru/edu/l-embedded-distro/section5.html)

orkus ()

cyanogenmod · repo · сборка из исходников · croot · breakfast · brunch · make clean

Несколько месяцев назад я познал, что такое настройка окружения в Ubuntu для компиляции CyanogenMod из исходников. С тех пор прошло много времени, но это не значит, что я занимался чёрт знает чем 🙂 Я не болтался просто так, а портировал CyanogenMod на свой смартфон и приобретал опыт в этом деле. Однако, прежде чем написать статью для других, мне нужно было разложить всё по полочкам в собственной голове. Сейчас мы сделаем ещё один маленький шаг — научимся выкачивать из репозитория CyanogenMod исходники и познакомимся с парой-тройкой часто используемых команд.


Итак, в прошлый раз я создал директорию android в своём домашнем каталоге, но сейчас передумал и назвал её CyanogenMod:

cd ~/ && mkdir CyanogenMod
cd CyanogenMod

Развлекаемся с git и repo

Во время работы с исходниками я осознал необходимость познакомиться с git и даже создал свой собственный репозиторий на GitHub. Там я публикую свою работу над деревом устройства (device tree) для Alcatel OT-986. Для начала git нужно установить:

sudo apt-get install git

Теперь пришло время воспользоваться утилитой repo и выкачать исходный код CyanogenMod из GitHub к себе на компьютер. Я всё ещё работаю с веткой ICS 4.0.4 (CyanogenMod 9.1.0):

repo init -u git://github.com/CyanogenMod/android.git -b cm-9.1.0

Также существуют ветки cm-10.1, cm-10.2 (возможно и новее на момент прочтения этой статьи). Выберите на своё усмотрение. Если вы, как и я, занимаетесь портом CyanogenMod на устройство, для которого нет никаких сторонних прошивок, то сначала попробуйте собрать ветку, соответствующую версии заводского ПО (stock ROM) — так будет легче сдвинуться с мёртвой точки. Alcatel OT-986 имеет из коробки версию Android 4.0.3, поэтому я начал работать с CM 9.1 — система загрузилась практически «с полпинка», а вот версии 10.1 и 10.2 у меня ещё полноценно так и не запустились.

Наблюдаем, как repo ругается при попытке выполнения команды init:

*** Please tell me who you are.

Run

  git config —global user.email «you@example.com»
  git config —global user.name «Your Name»

to set your account’s default identity.

Укажем свои данные, выполнив заботливо подсказанные команды. Затем repo init нужно повторить, и в этот раз всё закончится успешно. Ответьте утвердительно на предложение раскрашивать вывод repo (это же весело, гы):

Enable color display in this user account (y/N)? y

Заявим свой манифест

На этом этапе официальный how-to от команды CyanogenMod предлагает начать скачивание исходников, но лично мне перед этим нужно проделать ещё один финт ушами — установить мой кастомный манифест. Это XML-файл, который позволяет указать repo, что некоторые части проекта мне не нужны. Вы тоже не хотите видеть в своей будущей прошивке дефолтный браузер? Пожалуйста:

remove-project name=»CyanogenMod/android_packages_apps_Browser»

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

Сборка прошивки на Android своими руками

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

project path=»device/alcatel/cedarlite» name=»yareg-com/device_alcatel_cedarlite»

Данная строка означает, что в директорию ~/CyanogenMod/device/alcatel/cedarlite будет скопировано содержимое репозитория https://github.com/yareg-com/device_alcatel_cedarlite.git. Эти файлы становятся частью всего исходного кода будущей прошивки, а в этом конкретном случае — особенно важной его составляющей, деревом устройства. Возможно подключать таким образом и репозитории из других источников, не только с GitHub.

Вся информация в манифесте должна быть оформлена в валидном XML-формате и сохранена в файл с любым именем и расширением .xml в директорию .repo/local_manifests. Выше я указал только фрагменты кода для наглядности, точный вариант манифеста смотрите на GitHub. Создать локальную копию с помощью git можно примерно так:

cd .repo && git clone https://github.com/yareg-com/manifest_alcatel_cedarlite.git
mv manifest_alcatel_cedarlite local_manifests

Компьютер пыхтит, а мы отдыхаем

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

cd ~/CyanogenMod
repo sync

Теперь всё зависит от ширины вашего интернет-канала и скорости дисковой подсистемы компьютера. Хочу предупредить, что объём директории CyanogenMod вырастет до нескольких десятков гигабайт, поэтому о свободном месте стоит позаботиться заранее. Дополнительно, лучше всего иметь быстрый SSD, несколько ядер процессора и не менее 4 GB оперативной памяти. Моя конфигурация — AMD A4 / 4 GB RAM / 2.5″ HDD 5400 rpm @ 75 Mbit/sec. Вполне комфортно, но сходить погулять во время repo sync я успеваю 🙂 Хорошо, что проделывать это необходимо всего один раз.

Вы уже ужинаете? А мы ещё завтракаем!

Когда repo sync отработает, выполним инициализацию окружения. Скачиваем некоторые зависимости CyanogenMod, на самом деле много всякого хлама — уже собранные Rom Manager, Terminal Emulator (хотя, это полезная штука) и прочее, без чего сборка не состоится:

cd ~/CyanogenMod/vendor/cm
./get-prebuilts

Далее выполняем скрипт envsetup.sh, который добавляет в систему новые команды — croot, brunch, breakfast и другие:

cd ~/CyanogenMod
source build/envsetup.sh

Часто используемые команды

Команда croot делает только одно — телепортирует вас в корень директории с исходниками, в моем случае — ~/CyanogenMod. Команда breakfast подготавливает окружение для дерева устройства:

breakfast cedarlite

Команда brunch запускает процесс сборки прошивки на основе конфигурационных файлов дерева устройства:

brunch cedarlite

Команда make clean удалит все следы предыдущей сборки, если вы хотите начать всё с чистого листа. Исходный код при этом не удаляется, так что выкачивать всё по-новой из репозиториев не придётся. Я использую make clean после больших изменений в файлах дерева устройства.

Команда repo sync обновит исходники до актуального состояния. Если я изменил что-то онлайн в своём GitHub-репозитории или команда CyanogenMod исправила какие-то баги в коде, то repo sync необходим.

Все эти команды следует выполнять из корневой директории исходного кода CyanogenMod, то есть после выполнения команды croot.

Обсуждение

Войдите на сайт, чтобы присоединиться к обсуждению.

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*