Как собрать Android-ROM на Ubuntu 16.04

Вступление

Android является самой популярной операционной системой в мире на сегодняшний день. Сотни разных производителей оригинального оборудования, или OEM-производители, решили установить его на свои устройства, потому что оно бесплатное, с открытым исходным кодом и имеет большую экосистему приложений и сервисов, построенных на нем. К сожалению, многие производители оборудования не выпускают обновления для Android по беспроводной сети (OTA). А другие OEM-производители предоставляют обновления только в течение ограниченного периода времени после запуска устройства. Кроме того, OEM-производители стремятся широко настраивать Android, чтобы их устройства выглядели уникально. Их настройки включают альтернативные средства запуска, тематические системные пользовательские интерфейсы и предустановленные приложения.

Если вы хотите удалить все эти настройки или запустить последнюю версию чистого Android на своем устройстве, вы можете самостоятельно создать новую прошивку для него. В сообществе моддингов Android такие прошивки обычно называют ПЗУ, сокращенно «Только чтение».

В этом руководстве вы создадите ПЗУ Android Oreo на основе Android Open Source Project или AOSP для краткости. Чтобы сохранить этот учебник независимым от устройств и универсальным, мы будем ориентироваться только на эмулятор AOSP, но вы можете применять те же методы для реальных устройств.

Предпосылки

Чтобы иметь возможность следовать, вам нужно:

  • Один сервер Ubuntu 16.04 x64 с не менее 16 ГБ ОЗУ, 4 ЦП и 120 ГБ дискового пространства, настроенный по адресу https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu- 16-04 [руководство по первоначальной настройке сервера Ubuntu 16.04], включая пользователя без полномочий root и брандмауэр. Процесс компиляции требует много оперативной памяти, а большее количество процессоров ускорит время компиляции. Кроме того, файлы, которые вы будете загружать и собирать, довольно большие. У DigitalOcean есть High CPU Droplets, которые могут отлично подойти для этого проекта.

  • Git устанавливается следующим образом: Как установить Git в Ubuntu 16.04.

Шаг 1 - Запустите сеанс экрана

Некоторые команды, которые вы будете выполнять в этом руководстве, могут выполняться часами. Если соединение SSH между вашим ПК и сервером прервется во время выполнения команд, они будут внезапно прерваны. Чтобы избежать такой ситуации, используйте утилиту + screen +, которая позволяет запускать несколько консольных сессий в одном терминале. С помощью экрана вы можете отсоединиться от запущенного сеанса и присоединиться к нему позже. Если вы новичок в Screen, узнайте больше в https://www.digitalocean.com/community/tutorials/how-to-install-and-use-screen-on-an-ubuntu-cloud-server[This учебник на используя Screen в Ubuntu.

Начните новый сеанс + screen +.

screen

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

С этого момента, если ваше SSH-соединение не будет установлено, ваши продолжительные команды будут продолжать работать в фоновом режиме. После восстановления SSH-соединения вы сможете возобновить сеанс, запустив + screen -r +.

Далее давайте установим компоненты, которые нам нужны для компиляции Android.

Шаг 2 - Установка зависимостей

Исходный код AOSP распространяется по нескольким различным Git-репозиториям. Чтобы пользователям было проще скачивать все эти репозитории, сообщество AOSP создало инструмент командной строки под названием https://storage.googleapis.com/git-repo-downloads/repo [+ repo +].

Мы загрузим последнюю версию инструмента с помощью + wget + и сохраним ее в каталоге + ~ / bin +. Сначала создайте каталог + ~ / bin +:

mkdir -p ~/bin

Затем загрузите скрипт + repo +:

wget 'https://storage.googleapis.com/git-repo-downloads/repo' -P ~/bin

Используйте + chmod +, чтобы предоставить текущему пользователю разрешение на запуск + repo +.

chmod +x ~/bin/repo

Инструмент + repo + использует Git для внутреннего использования и требует, чтобы вы создали конфигурацию Git, указав ваше имя пользователя и адрес электронной почты. Выполните эти команды, чтобы сделать это:

git config --global user.name ""
git config --global user.email ""

Исходный код Android в основном состоит из файлов Java, C и XML. Для компиляции исходного кода вам необходимо установить компиляторы OpenJDK 8, GNU C и C , библиотеки синтаксического анализа XML, ImageMagick и несколько других связанных пакетов. К счастью, вы можете установить их все с помощью + apt +. Прежде чем сделать это, убедитесь, что вы обновили списки пакетов вашего сервера.

sudo apt-get update

После обновления списков установите зависимости:

sudo apt-get install openjdk-8-jdk android-tools-adb bc bison build-essential curl flex g++-multilib gcc-multilib gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc yasm zip zlib1g-dev

После загрузки зависимостей мы можем использовать скрипт + repo + для получения исходного кода Android.

Шаг 3 - Загрузка исходного кода

Мы будем использовать скрипт + repo + для выполнения нескольких задач по подготовке нашего рабочего пространства. Создайте новый каталог для хранения исходного кода Android, который вы собираетесь загрузить:

mkdir -p ~/aosp/oreo

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

cd ~/aosp/oreo

Каталог должен быть инициализирован с помощью AOSP manifest репозиторий, специального репозитория Git, содержащего XML-файл с именем + default.xml +, в котором указаны пути для всех остальных Git-репозитории, которые вместе образуют кодовую базу AOSP.

Работа со всем деревом кодов AOSP может стать громоздкой. Следовательно, вы должны дополнительно указать название конкретной ревизии или ветви, которая вас интересует. В этом уроке мы собираем Oreo ROM и будем использовать ветку + android-8.0.0_r33 + с идентификатором сборки + OPD1.170816.025 +. Вы можете получить список всех доступных идентификаторов сборки и названий веток на официальной странице AOSP Codenames, Tags and Build Numbers.

Более того, вам не понадобится вся история коммитов дерева кодов для этого урока. Вы можете сэкономить как время, так и пространство хранения, обрезав историю до глубины + 1 +.

Соответственно, используйте команду + repo init +, чтобы инициализировать каталог и указать эти параметры:

repo init -u https://android.googlesource.com/platform/manifest -b  --depth=

Когда будет предложено включить цветной дисплей, нажмите * Y *, а затем * Enter *.

Наконец, загрузите актуальные файлы AOSP из различных репозиториев, выполнив команду + repo sync +:

repo sync

Приведенная выше команда загружает более 30 ГБ данных, так что наберитесь терпения, пока она завершится. Как только это произойдет, мы настроим кеш для ускорения компиляции.

Шаг 4 - Подготовка кеша компилятора

Чтобы ускорить ваши сборки, вы можете использовать кеш компилятора. Как следует из названия, кэш компилятора помогает избежать перекомпиляции частей ПЗУ, которые уже скомпилированы.

Чтобы разрешить использование кэша компилятора, установите переменную среды с именем + USE_CCACHE +.

export USE_CCACHE=1

Если у вас недостаточно свободного дискового пространства, вы не захотите, чтобы кэш-память становилась слишком большой, поэтому вы можете ограничить ее размер. если вы создаете свой ROM для одного устройства, вы можете ограничить его до 15 ГБ. Для этого используйте команду + ccache +.

prebuilts/misc/linux-x86/ccache/ccache -M

Вы увидите вывод, который подтверждает, что вы сделали это изменение:

OutputSet cache size limit to  Gbytes

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

Шаг 5 - Настройка Jack

Сервер Джек, который отвечает за создание большей части ПЗУ на основе Java, требует много памяти. Чтобы избежать ошибок выделения памяти, вы можете использовать переменную окружения с именем + ANDROID_JACK_VM_ARGS +, чтобы указать, сколько памяти Джеку разрешено использовать. Обычно достаточно выделить около 50% оперативной памяти вашего сервера. Эта переменная окружения также определяет другие параметры компиляции.

Выполните следующую команду, чтобы выделить 8 ГБ ОЗУ серверу Jack и сохранить параметры компиляции по умолчанию, необходимые для Jack:

export ANDROID_JACK_VM_ARGS="-Xmx -Dfile.encoding=UTF-8 -XX:+TieredCompilation"

Теперь вы готовы собрать свой Android ROM.

Шаг 6 - Начало сборки

Дерево кода AOSP содержит скрипт с именем + envsetup.sh +, который имеет несколько вспомогательных функций, связанных со сборкой. В то время как многие вспомогательные функции, такие как + mm +, + mma + и + mmm +, служат в качестве ярлыков для команды + make +, другие, такие как + lunch +, устанавливают важные переменные среды, которые, среди другие вопросы определяют архитектуру процессора ПЗУ и тип сборки.

Исходный скрипт для получения доступа к вспомогательным функциям.

source build/envsetup.sh
Outputincluding device/asus/fugu/vendorsetup.sh
including device/generic/car/car-arm64/vendorsetup.sh
including device/generic/car/car-armv7-a-neon/vendorsetup.sh
including device/generic/car/car-x86_64/vendorsetup.sh
including device/generic/car/car-x86/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips64/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/google/dragon/vendorsetup.sh
including device/google/marlin/vendorsetup.sh
including device/google/muskie/vendorsetup.sh
including device/google/taimen/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/linaro/hikey/vendorsetup.sh
including sdk/bash_completion/adb.bash

Затем запустите + lunch + и передайте ему кодовое имя вашего устройства с суффиксом типа сборки, который может быть либо + eng +, + userdebug +, либо + user +. В то время как типы сборки + eng + и + userdebug + приводят к ПЗУ, которые лучше всего подходят для целей тестирования, тип сборки + user + рекомендуется для производственного использования.

Чтобы создать тестовое ПЗУ, которое может работать на эмуляторе AOSP ARM, передайте + aosp_arm-eng + команде + lunch +:

lunch aosp_arm-eng

Вы увидите этот вывод с настройками среды:

Output============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=8.0.0
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_PLATFORM_VERSION=OPD1
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.4.0-104-generic-x86_64-with-Ubuntu-16.04-xenial
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=OPD1.170816.025
OUT_DIR=out
AUX_OS_VARIANT_LIST=
============================================

Наконец, запустите + make +, чтобы начать сборку. + make + поддерживает параллельные задания, поэтому вы можете значительно ускорить сборку, используя опцию + -j +, чтобы установить количество параллельных заданий, равное количеству процессоров, доступных на сервере.

Используйте команду + nproc +, чтобы увидеть, сколько у вас процессоров:

nproc

Команда возвращает номер CPUS:

Output8

Затем вы можете использовать это число с + make + для указания параллельного выполнения:

make -j

Даже с 8 процессорами вам придется ждать более часа, пока сборка не будет завершена, при условии, что на вашем сервере нет активных процессов, интенсивно использующих процессор. Продолжительность сборки прямо пропорциональна объему оперативной памяти и количеству имеющихся у вас процессоров. Если вам нужны более быстрые сборки, рассмотрите возможность использования специализированных High CPU Droplets, которые поддерживают до 32 процессоров и 48 ГБ памяти.

Как только ПЗУ будет готово, вы должны увидеть сообщение о том, что сборка завершена успешно. Вы также сможете увидеть точную продолжительность сборки.

Output...
Creating filesystem with parameters:
   Size: 2147483648
   Block size: 4096
   Blocks per group: 32768
   Inodes per group: 8192
   Inode size: 256
   Journal blocks: 8192
   Label: system
   Blocks: 524288
   Block groups: 16
   Reserved block group size: 127
Created filesystem with 2266/131072 inodes and 178244/524288 blocks
[100% 63193/63193] Install system fs i... out/target/product/generic/system.img
out/target/product/generic/system.img+ maxsize=2192446080 blocksize=2112 total=2147483648 reserve=22146432

#### make completed successfully (01:05:44 (hh:mm:ss)) ####

Давайте проверим, что все построено правильно.

Шаг 7 - Проверка сборки

Вывод процесса сборки состоит из нескольких образов файловой системы, которые вместе образуют ПЗУ. Вы найдете их в каталоге + out / target / product / generic / +.

ls -l out/target/product/generic/*.img
Output-rw-r--r-- 1 sammy sammy   69206016 Jan  5 18:51 out/target/product/generic/cache.img
-rw-rw-r-- 1 sammy sammy    1699731 Jan  5 19:09 out/target/product/generic/ramdisk.img
-rw-r--r-- 1 sammy sammy 2147483648 Jan  5 19:10 out/target/product/generic/system.img
-rw-r--r-- 1 sammy sammy  576716800 Jan  5 19:09 out/target/product/generic/userdata.img

Чтобы протестировать ПЗУ, вы можете попробовать запустить с ним эмулятор, выполнив команду + emulator +. Если вы находитесь в среде без GUI, убедитесь, что вы передали ему флаги + -no-windows и` + -no audio + `.

emulator  > /dev/null 2>&1 &

Чтобы проверить, удалось ли эмулятору загрузиться успешно, подождите минуту и ​​используйте инструмент моста отладки Android + adb +, чтобы открыть оболочку на эмуляторе.

adb shell

Если с ПЗУ проблем нет, вы увидите подсказку из оболочки, запущенной на эмуляторе.

Output* daemon not running; starting now at tcp:5037
* daemon started successfully
generic:/ #

Выйдите из этой оболочки, набрав + exit + и нажав + ENTER + или нажав + CTRL + D +.

Поиск проблемы

Если ваша сборка не удалась, наиболее вероятной причиной является нехватка памяти. Чтобы это исправить, сначала убейте сервер Jack, выполнив следующую команду:

jack-admin kill-server

Затем снова запустите сборку, но с меньшим количеством параллельных заданий. Например, вот как вы можете уменьшить количество параллельных заданий до 2:

make -j

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

make clobber

Кроме того, вы можете добавить больше места на диске в свою каплю, используя Block хранилище DigitalOcean.

Заключение

В этом руководстве вы успешно создали ПЗУ на основе AOSP для Android Oreo. Методы, которые вы изучили сегодня, применимы также ко всем форкам AOSP, таким как Lineage OS и Resurrection Remix OS. Если у вас есть опыт разработки приложений для Android, вас может заинтересовать изменение небольших частей кодовой базы AOSP для придания вашему ПЗУ индивидуальности.

Чтобы узнать больше о создании исходного кода AOSP, просмотрите Android Building forum в группах Google.

Related