- PVSM.RU - https://www.pvsm.ru -
Эта заметка является косвенным продолжением моей первой публикации Сборка Android под Mac OS X [1] и имеет аналогичную цель — решение проблем сборки относительно старых версий Android 4.0.x.
Коротко вводная. В одном из проектов я занимаюсь доработками оригинального кода Android для создания прошивки под специфичную железку. Версия для сборки была выбрана уже относительно старая — AOSP 4.0.4, но на ней базируется стабильная ветка кода от производителя железки. Первоначально я работал на MacOS, но для этого проекта решил переключиться на Linux для удобства разработки. Итак волею судеб я перешел с MacOS на более менее свежий Ubuntu Linux 12.04.3, рекомендованную [2] на данный момент версию Linux для сборки Android.
Основной сложностью в новом окружении осталась старая проблема — старые версии AOSP не отслеживаются и новые правки в сборочную систему не вносятся. Поэтому если сборка master’а особой сложности не представляет, то сборка предыдущих версий Android под более свежие версии Ubuntu требует исправления ряда проблем.
В моем случае рабочее окружение выглядит так:
Все основные моменты и сложности сборки AOSP хорошо описаны в официальной документации [3]. Как и для MacOS, в случае с Ubuntu, для сборки AOSP 4.0.x версий предлагается использовать более старые версии базовой ОС. В частности в разделе «Known Issues» для решения проблемы "Build error with 4.0.x and earlier on Ubuntu 11.10 [4]" предлагается использовать старый релиз Ubuntu 10.04, что не очень хочется делать, если предполагается заниматься в ОС и другими задачами, кроме сборки AOSP.
Установка производилась на практически чистую Ubuntu, за исключением нескольких прикладных программ. Первичная настройка окружения производилась в соответствии с официальным описанием.
Ниже я привожу тексты ошибок из консоли и методы исправления. В зависимости от версии AOSP и вашего окружения они могут проявляться все или частично. Большинство решений можно найти в интернете, я привожу лишь краткое описание необходимых действий.
Или вовсе и не ошибка, а необходимость установить для сборки проприетарные пакеты Oracle Java, которые с некоторых пор не входят в поставку Ubuntu.
Для сборки Android нам необходим JDK 6ой версии, соответственно для этого прописываемыем репозиторий Oracle с нужными пакетами и устанавливаем требуемый:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer
Аналогично можно установить последний JDK 7ой версии, если это требуется для других целей:
sudo apt-get install oracle-java7-installer
При установке необходимых пакетов [2] не устанавливается пакет libgl1-mesa-glx:i386 в котором паходится нужная нам библиоткеа libGL x86. Не устанавливается со следующей причиной:
The following packages have unmet dependencies:
libgl1-mesa-glx:i386 : Depends: libglapi-mesa:i386 (= 8.0.4-0ubuntu0.6)
Recommends: libgl1-mesa-dri:i386 (>= 7.2)
E: Unable to correct problems, you have held broken packages.
Вместе с ним для установки указан пакет libgl1-mesa-dev в котором содержится libGL, но x64 версия, что нам не подходит для сборки AOSP.
Если попробовать сборку с libgl1-mesa-dev для x64 архитектуры, то при линковке получим ошибку:
/usr/bin/ld: cannot find -lGL
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/lib/libGLES_CM_translator.so] Error 1
make: *** Waiting for unfinished jobs....
/usr/bin/ld: cannot find -lGL
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/lib/libEGL_translator.so] Error 1
Вместо пакетов libgl1-mesa-glx:i386 и libgl1-mesa-dev установить пакет libgl1-mesa-dev:i386:
sudo apt-get install libgl1-mesa-dev:i386
Более подробное описание содержимого пакета можно найти в описании [5] Ubuntu, видно что он содержит и нужный libgl1-mesa-glx.
Также при установке пакета будет создан и симлинк в директории /usr/lib/i386-linux-gnu/, поэтому дополнительно его создавать не нужно, как указано в руководстве командой:
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
Используемая в системе версия компилятора gcc (4.6.x) имеет проблему с переопределением символа _FORTIFY_SOURCE, о чем так же написано в официальных "Known Issues [4]". Как решение предлагается откатиться на Ubuntu 10.04, что очевидно не самый лучший вариант. Текст предупреждения и ошибки будет такой:
<command-line>:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default]
или
<command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]
<built-in>:0:0: note: this is the location of the previous definition
cc1plus: all warnings being treated as errors
Эту проблему можно решить установив gcc-4.4 и необходимые библиотеки:
sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib gcc-4.4-multilib
Подробнее про настройку 2х версий gcc и использование gcc-4.4 как приоритетной версии можно прочитать в этом [6] блоге. Для наших же целей достаточно установить нужные пакеты и запускать сборку командой с указанием версии компилятора:
make CC="gcc-4.4" CXX="g++-4.4"
После приведенных выше операций Android соберется как мы и хотели, но постфактум можно столкнуться еще с парой неприятностей.
При запуске эмулятора с указанным параметром "-gpu on" для включения аппаратного ускорения отрисовки вы получите слежующее сообщение и черный экран в эмуляторе:
Failed to load libGL.so
error libGL.so: cannot open shared object file: No such file or directory
Failed to load libGL.so
error libGL.so: cannot open shared object file: No such file or directory
В обычном режиме эмулятор запускается нормально, но разобраться было интересно и к тому же выяснилось что после перезагрузки компьютера вентиляторы продолжают работать на максимуме и не глушатся. Мягко говоря очень не приятный эффект, при таком шуме работать крайне не удобно.
Путем проверки пакетов выяснилось что при установке одного из них был удален проприетарный графический драйвер от NVidia и как следствие система забыла как регулировать скорость вращения вентилятора, а также где искать нужную библиотеку. Вредоносным пакетом оказался libncurses5-dev:i386, обратите внимание что при его установке будет следующий запрос:
sudo apt-get install libncurses5-dev:i386
The following packages will be REMOVED:
dkms gcc gcc-4.6 nvidia-304
Соответственно решением проблемы будет просто переустановка проприетарного драйвера в консоли или через панель управления.
Возникает при запуске эмулятора без указания файла ядра системы. В предыдущей статье я забыл указать этот момент, в этой исправляюсь чтобы описание было до конца полным. Итак при запуске эмулятора AOSP 4.0.4 мы получим сообщение:
emulator: ERROR: bad workspace: cannot find prebuilt kernel in: /home/user/Development/workspace_aosp/android-4.0.4_r1.1/prebuilts/qemu-kernel/arm/kernel-qemu-armv7
Проблема возникла из-за того что в более свежих версиях AOSP prebuilts перенесли в другую директорию и это исправление попало в сборочные скрипты для старых версий, а вот местоположение не изменили.
Указать при запуске эмулятора расположение ядра, путь относительно корня сборки:
emulator -kernel prebuilt/android-arm/kernel/kernel-qemu-armv7
или для лучшей производительности:
emulator -kernel prebuilt/android-arm/kernel/kernel-qemu-armv7 -memory 1024 -gpu on
В целом сборка под Linux прошла быстрее и разбор полетов занял меньше времени, хотя ситуация с графическим драйвером и вентилятором поставила меня поначалу в тупик. Поэтому сборку под Linux можно оценить как менее проблемную, хотя и не совсем однозначно :).
Автор: comhot
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/52831
Ссылки в тексте:
[1] Сборка Android под Mac OS X: http://habrahabr.ru/post/207706/
[2] рекомендованную: http://source.android.com/source/initializing.html#installing-required-packages-ubuntu-1204
[3] документации: http://source.android.com/source/building.html
[4] Build error with 4.0.x and earlier on Ubuntu 11.10: http://source.android.com/source/known-issues.html#build-error-with-40x-and-earlier-on-ubuntu-1110
[5] описании: http://packages.ubuntu.com/ru/lucid/libgl1-mesa-dev
[6] этом: http://xlcwu.wordpress.com/2012/07/24/ubuntu-12-04-gcc-4-4
[7] Источник: http://habrahabr.ru/post/209206/
Нажмите здесь для печати.