ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Как построить Android диски на Ubuntu 16.04

Как построить Android диски на Ubuntu 16.04

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

Если вы хотите удалить все настройки, или если вы хотите запустить последнюю версию чистой Android на вашем устройстве, вы можете создать новую прошивку для него самостоятельно. В моддинг сообщества Android, такие прошивки обычно называют ROM, сокращенно Read Only Memory.

В этой статье мы будем строить ROM Android Oreo, на основе Open Source Project Android или AOSP для краткости. Чтобы сохранить эту статью аппаратно-независимой и общей, мы будем целиться только на эмулятор AOSP, но вы можете применить те же методы для реальных устройств.

Предпосылки

Для того, чтобы быть выполнить все пункты, вам необходимо:

Шаг 1 – Начало сеанса экрана

Некоторые из команд которые вы выполняете в этом руководстве потенциально могут работать в течение нескольких часов. Если соединение SSH между компьютером и сервером прерывается в то время как команды работают, они будут прекращены внезапно. Чтобы избежать такой ситуации, используйте утилиту screen, которая позволяет запускать несколько сеансов консоли в одном терминале. С screen, вы можете отключить от запущенной сессии и прикрепиться к нему позже.

Начать новую сессию screen.

screen

 

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

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

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

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

Исходный код AOSP распространяется через несколько различных Git репозиториев. Для того, чтобы сделать его более удобным для пользователей, загрузите все эти репозитории, сообщество AOSP создало инструмент командной строки под названием repo.

Мы скачаем последнюю версию программы с использованием wget и сохраним его в каталоге ~/bin. Во- первых, надо создать каталог ~/bin:

mkdir -p ~/bin

 

Затем скачайте скрипт repo:

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

 

less ~/bin/repo

 

После того, как вы проверили содержимое скрипта, продолжите это руководство.

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

chmod +x ~/bin/repo

 

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

git config --global user.name "ваше_имя"

git config --global user.email "ваша_почта@ваш_домен.ru"

 

Исходный код Android, в основном состоит из Java, C ++ и XML – файлов. Для компиляции исходного кода, вам необходимо установить OpenJDK 8, GNU C и компилятор C ++, библиотеку XML parsing, 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, это специальное хранилище Git содержащий файл XML с именем default.xml, который определяет пути всех других Git репозиториев которые вместе образуют код AOSP.

Работа с полным кодом дерева AOSP может получиться громоздким. Таким образом, необходимо дополнительно указать имя конкретного пересмотра или отрасли, в которой вы заинтересованы. В этой статье мы строим ПЗУ Oreo, мы будем использовать android-8.0.0_r33, чья сборка имеет идентификатор OPD1.170816.025. Вы можете получить список всех доступных идентификаторов сборки и названий филиалов из AOSP официальной странице https://source.android.com/setup/build-numbers.

Кроме того, вы не будете нуждаться во всей истории кода дерева коммитов для этой статьи. Вы можете сэкономить время и пространство для хранения части истории с глубиной 1.

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

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

 

Когда будет предложено включить цветной дисплей, нажмите 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 15G

 

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

Вывод
Set cache size limit to 15.0 Gbytes

 

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

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

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

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

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

 

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

Шаг 6 – Запуск сборки

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

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

source build/envsetup.sh

 

Вывод
including 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 приводят к ROM, которые лучше всего подходят для целей тестирования, пользовательский тип сборки рекомендуется для использования в производстве.

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

lunch aosp_arm-eng

 

Вы увидите этот вывод, показывающий параметры среды:

Вывод
============================================
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

 

Команда возвращает число процессоров:

Вывод
8

 

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

make -j8

 

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


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

Вывод
...
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 – Проверка build

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

ls -l out/target/product/generic/*.img

 

Вывод
-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

 

Чтобы проверить ROM, вы можете попытаться загрузиться эмулятор с ней, выполнив команду emulator. Если вы находитесь в среде без графического интерфейса пользователя, убедитесь что вы передаете флаги -no-window и -noaudio к нему.

emulator -no-window -noaudio > /dev/null 2>&1 &

 

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

adb shell

 

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

Вывод
* daemon not running; starting now at tcp:5037
* daemon started successfully
generic:/ #

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


Исправление проблем

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

jack-admin kill-server

 

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

make -j2

 

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

make clobber

Вывод

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

Exit mobile version