Хабраиндекс
439,82
9 октября 2012 в 13:24

Строим Android x86

Существует множество задач, для которых требуется пересборка ядра и операционной системы Android в целом. Например, создание и отладка собственных модулей, включение поддержки профилирования системы и просто тестирование своих приложений на новой версии Android.
Возможность запуска Android x86 внутри виртуальной машины VirtualBox позволяет энтузиастам и создателям прошивок покопаться в настройках системы, настроить и пересобрать ядро и при этом не «кирпичизировать» настоящее устройство. VirtualBox предоставляет возможность использования привычных для Linux-разработчика средств отладки ОС. Для рядовых разработчиков Android-приложений отлично подходит эмулятор, использующий технологию Intel Hardware Accelerated Execution Manager. (подробнее можно прочесть здесь)
В статье приведен ряд практических советов по сборке образа Android x86 для запуска под виртуальной машиной VirtualBox и сборке эмулятора. Исходный код Android взят из официального репозитория проекта AOSP (Android Open Source Project), в качестве ядра использована адаптированная версия ядра Linux 2.6 от Intel.

Установка окружения для сборки


Для сборки Android потребуется 64 битная версия Linux. Еще один важный момент: обратите внимание на версию GCC, которая установлена на системе. Google поддерживает версию GCC 4.4 и выше. Так же на системе должна быть установлена реализация Java от Oracle.
Установка дополнительных зависимостей для Ubuntu 12.04:
sudo -i
apt-get update
sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
  libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
  libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos \
  python-markdown libxml2-utils xsltproc zlib1g-dev:i386

Установите символьную ссылку для устранения конфликта имен:
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

Загрузка дерева исходных кодов


Установка Repo

Repo — утилита управления репозиториями, упрощающая работу с Git для Android. Более подробную информацию можно прочесть здесь (http://source.android.com/source/version-control.html)
Для установки, инициализации и настройки Repo выполните следующие шаги:
• Убедитесь, что у вас есть директория bin в вашем домашнем каталоге и она прописана в PATH:
mkdir ~/bin
PATH=~/bin:$PATH

• Загрузите Repo скрипт и выставите права на выполнение:
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
chmod a+x ~/bin/repo

Инициализация Repo клиента

После установки Repo, настройте доступ к репозиториям исходных кодов Android:
• Создайте пустую директорию для исходных файлов и перейдите в нее. Например, это может выглядеть так:
mkdir aosp
cd aosp

• Запустите скрипт repo init, чтобы обновить версию самого Repo.
repo init -u https://android.googlesource.com/platform/manifest

Эта команда подключит ветку master из дерева исходных кодов Android. Вы можете указать любую другую, используя ключ -b:
repo init -u https://android.googlesource.com/platform/manifest -b android-4.1.1_r6

Для просмотра всех доступных веток введите команду:
git --git-dir .repo/manifests/.git/ branch -a

Нас интересуют наиболее последние версии Android от Google:
  • Jelly Bean: remotes/origin/android-4.1.1_r6
  • Ice Cream Sandwich: remotes/origin/android-4.0.4_r2.1

Можно выбрать любую на ваш вкус, дальнейшие шаги не будут отличаться. Для демонстрации процесса сборки под VirtualBox возьмем версию Jelly Bean (JB).
В случае успешной инициализации вы увидите сообщение о том, что Repo инициализирован в вашей директории и в ней появится папка .repo

Загрузка файлов


Чтобы загрузить исходные файлы из репозитория в вашу рабочую директорию выполните команду:
repo sync -j 16

Начальная синхронизация может занять больше часа времени.

Сборка ядра


Android разработан прежде всего для устройств, управляемых жестами и он не поддерживает мышь по умолчанию. Поэтому, в качестве примера, пересоберем ядро из исходников с включенной поддержкой мыши.
Создадим директорию для хранения исходников ядра:
mkdir ~/android_kernel
cd ~/android_kernel

Воспользуемся заранее подготовленной версией ядра от Intel:
wget http://software.intel.com/sites/landingpage/android/Intel_x86_sysimg_2.3.7_Source_Files.zip
unzip Intel_x86_sysimg_2.3.7_Source_Files.zip
tar -xvf kernel_sdk_x86.tar.gz

Перейдем в директорию ядра:
cd kernel

Теперь у нас есть исходники ядра. Нужно модифицировать конфигурационный файл и пересобрать. Чтобы сократить время на полную настройку ядра, воспользуемся конфигурационным файлом, который подготовили для на разработчики. Важный момент — не забывайте указать архитектуру для которой происходит сборка ядра, в нашем случае это x86.
cp arch/x86/configs/vbox_defconfig .config
make ARCH=x86 menuconfig

Через несколько секунд загрузится графическое меню настройки ядра. Стрелками «вверх», «вниз» вы можете передвигаться по пунктам меню, «Enter» чтобы зайти в подменю. Все точно так же как с обычным ядром Linux.
image

Чтобы включить поддержку мыши:
• Зайдите в «Device Drivers»
• Выберите «Input device Support»
• Отметьте «Mice»
Вы можете зайти в подменю «Mice» и посмотреть дополнительные настройки драйверов.
Затем выйдите из меню конфигурации ядра. Это можно сделать с помощью нескольких нажатий на «Esc». Не забудьте сохранить настройки, когда меню конфигурации предложит это сделать.
Сделав необходимые настройки ядра, соберем его. Это не займет много времени, особенно если вы используете многоядерную машину — можете указать опцию команды make: -j N, где N — число ядер (например, для написания статьи использовалась make -j 32).
make ARCH=x86 –j 32 

При успешной компиляции вы увидите сообщение:
Kernel: arch/x86/boot/bzImage is ready 

Путь до нового ядра указан в последней строке.
Подмена ядра

Путь к ядру, которое будет использовано в сборке для VirtualBox можно определить следующим образом:
grep "LOCAL_KERNEL :=" ~/aosp/build/target/board/vbox_x86/device.mk

Должно вывестись примерно следующее:
LOCAL_KERNEL := prebuilt/android-x86/kernel/kernel-vbox

Скопируем bzImage по найденному пути:
cp ~/kernel/arch/x86/boot/bzImage ~/aosp/prebuilt/android-x86/kernel/kernel-vbox

Построение Android


Установим окружение для сборки:
cd ~/aosp
. ./build/envsetup.sh

Теперь все готово к тому, чтобы начать компиляцию исходников Android. Первым шагом необходимо указать цель для сборки:
lunch vbox_x86-eng

После выполнения команды вы увидите информацию о предстоящей сборке:
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=vbox_x86
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=x86
TARGET_ARCH_VARIANT=x86
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-2.6.32-131.0.15.el6.x86_64-x86_64-with-redhat-6.1-Santiago
HOST_BUILD_TYPE=release
BUILD_ID=JRO03R
OUT_DIR=out
============================================

Затем необходимо запустить сборку исходников командой make. Хорошим тоном считается сохранять лог сборки, это можно сделать с помощью утилиты tee.
make –j 16 | tee vbox_build.log

Процесс сборки может занять значительное время, конкретные цифры зависят от мощности центрального процессора и объема оперативной памяти машины. На системе, которая использовалась для подготовки статьи это заняло около часа. Рекомендуемое число потоков для сборки можно определить из расчета 2GB оперативной памяти на поток.
При успешной компиляции, последняя строка вывода будет содержать путь и размер образа:
Install system fs image: out/target/product/vbox_x86/system.img
out/target/product/vbox_x86/system.img+ total size is 268435456

Далее необходимо собрать загрузочный образ для VirtualBox:
make installer_vdi 

Если сборка прошла успешно, в консоли должна появиться запись:
Done with VirtualBox bootable installer image -[ out/target/product/vbox_x86/installer.vdi ]-

Настройка VirtualBox


Теперь приступим к настройке VirtualBox. Необходимо создать новую виртуальную машину, назовем ее “Android_ICS”, выберем Linux в качестве операционной системы, а версию выставим Other, как наиболее подходящую для Android.
image
Следующий шаг – выделение оперативной памяти. Рекомендуется 512 мегабайт и больше. В нашем случае это будет гигабайт.
image
Далее настраивается размер жесткого диска. Главное, чтобы после завершения настройки все жесткие диски VirtualBox были подключены к контроллеру IDE.
Установим загрузочный образ Android в качестве второго раздела нашей виртуальной машины.
image
При первом запуске виртуальной машины нам необходимо запустить установку Android. Во время старта нажмите F12, чтобы зайти в меню настроек BIOS. Выберете 2 “Primary Slave”, именно там и содержится установочный образ Android.
В случае успешной установки вы увидите «Done processing installer config». Иногда при первой установке могут возникнуть ошибки, просто запустите ее еще раз. Затем перезагрузите виртуальную машину в свой только что установленный Android!
image

Эмулятор Jelly Bean


Сборка эмулятора мало чем отличается от сборки версии для VirtualBox. Если у вас уже есть исходные коды, то приступайте к сборке с шага инициализации окружения. Для чистоты эксперимента, будет процесс постройки эмулятора будет изложен с самого начала. Поэтому создадим отдельную директорию для Jelly Bean Emulator и повторим уже знакомые шаги.
mkdir ~/jb
cd ~/jb

Инициализация репозитория
repo init -u https://android.googlesource.com/platform/manifest -b android-4.1.1_r6

Загрузка исходных кодов
repo sync -j 16

Инициализация окружения
. ./build/envsetup.sh

Выбор сборки эмулятора
lunch full_x86-eng

В случае успеха вы увидите:
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=full_x86
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=x86
TARGET_ARCH_VARIANT=x86-atom
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-2.6.32-131.0.15.el6.x86_64-x86_64-with-redhat-6.1-Santiago
HOST_BUILD_TYPE=release
BUILD_ID=JRO03L
OUT_DIR=out
============================================

Запускаем сборку:
make –j 16 | tee emulator_build.log

Пока идет процесс компиляции, скопируем конфигурационный файл и соберем ядро для эмулятора.
cd kernel
cp arch/x86/configs/goldfish_defconfig .config
make ARCH=x86 -j16

Теперь сборка эмулятора завершена.
Самый простой способ запустить его:
emulator 

Например, можно запустить с только что собранным ядром, с разрешением 480x800, объемом оперативной памяти 512 мегабайт и включенным аппаратным ускорением графики.
emulator -kernel ~/kernel/arch/x86/boot/bzImage -skin WVGA800 -memory 512 -gpu on 

Более подробно о возможностях и настройках эмулятора можно прочитать здесь
image

Заключение


В данной статье рассмотрен способ установки Android x86 версии Jelly Bean для VirtualBox, сборка кастомизированного ядра и эмулятора. Существует множество разных трюков и подходов к постройке и настройке различных версий Android, которые остались за пределами данной статьи. Здесь был изложен базовый материал для того, чтобы начать свой путь в мир OS Android.
+61
39867
328
ikryukov 6,5

Комментарии (19)

+13
solo12zw74, #
Компиляция ядра и операционной системы — базовый материал для того, чтобы начать свой путь в мир OS Android. — жжёте! Я начал этот путь с покупки смартфона на Android. :-)
А вообще — полезная, подробная статья. Спасибо.
НЛО прилетело и опубликовало эту надпись здесь
0
VYakushev, #
Можно более подробно о том, в каких случаях «не рядовому» разработчику под Android может потребоваться сборка собственного ядра? Вы приводите три варианта: профилирование, отладка на новой версии, тестирование собственных модулей. При этом говорится, что есть и другие варианты. Для тестирования приложения на новой версии Android не вижу необходимости сборки собственного ядра, т.к. новые версии для эмуляторов выходят более менее оперативно. Профилировщик тоже есть встроенный в SDK. А вот что такое «сборка собственных модулей» не совсем понял.
+4
t80, #
> Можно более подробно о том, в каких случаях «не рядовому» разработчику под Android может потребоваться сборка собственного ядра?

Это весело!
0
ikryukov, #
1. Профилирование. Подразумевается низкоуровневое профилирование с помощью профилировщиков: Oprofile, Perf. Все они требуют включения опции в ядре.
2. Сборка собственных модулей может потребоваться для поддержки аппаратной части. Например, собрать отладочную версию видеодрайвера.
0
vitaly_KF, #
Ну к примеру выпуск собственного планшета/читалки/другой железяки на Android?
0
ikryukov, #
Именно. Для отладки на новом железе все это и требуется.
0
RomanGotsiy, #
Еще как вариант случая, когда необходима пересборка Android, можно навести сборку системы с разными опциями оптимизации компилятора.
А еще пересборка требуется при портировании Android(чаще разных его модификаций, как например CyanogenMod), под свое устройство.
+1
SantaClaus16, #
Хорошая статья, но 2.6 ядро в связке с Android 4.x недопустимо. Ищите способы заводить хотя бы 3.0.8. В случае с 4.1.1 еще нужно озаботится о hwcomposer.
0
alexshock, #
>>> Так же на системе должна быть установлена реализация Java от Oracle.
>>> sudo apt-get install… openjdk-6-jdk…
не совсем понятно зачем второе?
0
ikryukov, #
Рекомендовано проектом AOSP.
0
Gorodohan, #
а обычные apk на виртуальную машину можно установить и запустить?
0
rkhatko, #
ADB может работать через TCP/IP. Если у виртуальной машины есть IP адрес, то с помощью adb connect <ip-адрес> её можно подключить. После этого виртуальная машина должна появится в списке, выдаваемом командой adb devices. Ну, а дальше как обычно: adb install file.apk.
0
vovkab, #
Зачем к виртуалке делать соединение через Tcp/ip? Она и так не плохо работает, через обычный adb.
0
vovkab, #
А все, исправляю сам себя. Речь о VirtualBox, а не эмуляторе.
Тогда, да, только через TCP/IP
+1
vovkab, #
> Android разработан прежде всего для устройств, управляемых жестами и он не поддерживает мышь по умолчанию.

Разве? Подключите мышь к любому 3+ устройству и вы увидите курсор. То что в интеловском ядре мышку не воткнули по умолчанию, не говорит о том что андроид ее не поддерживает.
0
ikryukov, #
Она там как раз воткнута. Согласен, что пример не самый удачный. Вместо поддержки мыши, можно включить опцию профилирования или другую на ваш выбор.
0
Mihrutkin, #
А почему версия ядра такая архаичная?
0
ikryukov, #
Версия 2.6.29 используется в эмуляторе, который идет с Android SDK. Если этой версии не достаточно, можно попробовать собрать более новую. Процесс точно такой же — единственное отличие это конфигурационный файл.

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