Сборка CyanogenMod из исходного кода

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"
Таким образом мы не только избавляемся от нежелательных компонентов будущей прошивки, но и экономим место на жёстком диске и время на синхронизацию с репозиторием. С другой стороны, манифест можно использовать для добавления файлов в исходники, например, я подключу свой репозиторий с деревом устройства:
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.

Обсуждение

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