Загрузка и сборка AOSP

  • Tutorial

Решил поделиться своей инструкцией как собрать AOSP (Android Open Source Project). Эта инструкция будет полезна тем кто хочет посмотреть что-же внутри Android и возможно заняться системной разработкой. В любом случаи эти знания полезны для понимания самого Android, как раз для этого и решил собрать AOSP.


Проект собираю на elementary 5.1 OS Ubuntu 18.04 LTS (bionic), пытался на MacOS собрать, но так и не удалось. Для исходников и сборки нужно 200 Гб на жестком диске (лучше SSD, на обычном производительность сильно проседает). Так же много времени, я потратил чтобы скачать и собрать около 20 часов, частично виновата "слабая" конфигурация моего компьютера. У меня установлено всего 8 Гб оперативной памяти, но увеличил размер swap-а до 16 Гб.


Загружаем AOSP


Установить требуемые пакеты для загрузки и сборки :


sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

Создаем папку и качаем repo утилиту для загрузки исходного кода


mkdir aosp # имя папки можно выбрать любое
cd aosp

curl https://storage.googleapis.com/git-repo-downloads/repo > repo
chmod a+x repo

Исходники AOSP состоят из отдельных проектов с собственными git-репозиториями, repo позволяет упросить всю загрузку всех проектов и разложить по нужным папкам.


Инициализируем repo


./repo init -b android-10.0.0_r45 --depth 1 -u https://android.googlesource.com/platform/manifest

Параметры:


  • -u — урл git-репозитория с манифестом
  • -b — ветка (самая последняя на текущий момент)
  • —depth — скачивать только одну ветку (если не использовать, то для каждого репозитория скачается весь индекс, что увеличит время загрузки и место на диске)

Выбрал самую последнюю версию Android 10. Не использую develop или master, так как там устаревший манифест и проект скорее не соберется.


Теперь можно запустить загрузку исходников AOSP


./repo sync -c  -j $(nproc) --no-tags --no-clone-bundle

Параметры:


  • -c — скачивать только текущую ветку манифеста (как указал выше — android-10.0.0_r45)
  • -j — количество потоков, обычно указывается столько доступно процессоров
  • —no-tags — не скачивать тэги с репозитариев
  • —no-clone-bundle — не пытаться качать clone.bundle (упакованная репа, которая уменьшить время на загрузку, но не у всех сервер формирует этот bundle),

—no-clone-bundle можно попробовать убрать, что в теории ускорит скачивание, но у меня заваливается с 404 ошибкой

Скачивание может занять минуты и часы, теперь с repo закончили, если нужно почитать больше то ищите в официальной документации: https://source.android.com/setup/develop/repo


Сборка


Настраиваем среду разработчика:


source build/envsetup.sh

конфигурируем сборку


lunch aosp_x86_64-eng

x86_64 — указывается под какой девайс собирать, в данном случае Generic x86_64 подходит для эмуляторов, если будете запускать на Nexus девайсах, то ищите детали в документации https://source.android.com/setup/build/building#choose-a-target


eng — тип сборки (сокращение от engineering), с максимальными логами и дополнительными утилитами для отладки. Другие тип сборки думаю не особо интересны


Для сборки java файлов увеличиваем Heap size, если этого не сделать, то сборка всего завалится с StackOverflow ошибкой:


export _JAVA_OPTIONS="-Xmx4g"

Так же можно добавить в .bashrc чтобы постоянно не повторять команду

Все, теперь готовы к сборке:


USE_CCACHE=1 CCACHE_DIR=ccache make -j $(nproc)

Можно не использовать CCACHE, что уменьшит количество занимаемого места на диске, но увеличит время повторной сборки. На моем "слабом" компьютере сборка заняла где-то 16 часов.


После окончания сборки, запускаем эмулятор:


emulator -show-kernel

-show-kernel — выводить уведомления в консоль


Если нажать Enter, то попадем в консоль эмулятора


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

Эмулятор


Готовим IDE для отладки


Для начала необходимо сгенериовать проект для IDE, проект генерируется для IDEA. Собираем модули для генератора:


mmm development/tools/idegen

Чтобы весь AOSP затолкать в проект, то просто запускаем генератор


development/tools/idegen/idegen.sh

Но сгенерированный IDEA проект будет очень "тяжелым". Одно открытие и индексация занимает достаточно много времени. Лучше генерировать IDEA проект для каждого отдельного проекта, например для Android фреймворка


development/tools/idegen/intellij-gen.sh frameworks/base

Весь список доступных проектов можно посмотреть в


cat .repo/project.list

Открываем сгенерированный base.iml (находится в папке frameworks/base) в IDEA. Дальше нужно настроить Java, только нужно подключать java без библиотек, так как у AOSP-а свои реализации.


Настройка Java в проекте


Запускаем отладку


Для начала необходимо запустить monitor


 ~/Android/Sdk/tools/lib/monitor-x86_64/monitor

возможно потребуется дополнительно поставить jre
sudo apt install openjdk-8-jre-headless

Выбираем процесс, который будем отлаживать. В monitor-е выбираем процесс и справа от порта процесса появится /8700, это как раз порт отладчика, к нему можно подключаться через IDEA.
Все системные штуки находятся в system_process. Его мы и будем отлаживать.


monitor один самых полезных инструментов при отладке и исследования работы AOSP

monitor из Android


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


Добавляем Remote конфигурацию в IDEA


Запускаем Debug (Run → Debug)


Чтобы удостоверится, что все подключилось поставьте брейкпоинт в frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java файле на метод:


// line 1040
int startActivityAsUser(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
            boolean validateIncomingUser) {
//...
}

и запустить любое приложение на эмуляторе (например, Settings).


Теперь все готово для экспериментов.

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 2

    0

    Недавно собирал project celadon* на 4гб оперативки и hdd, да пришлось добить swap до 16 гб, чтоб собралось, но не за 20 часов. По-моему часов 8 шло максимум. (сам проект на hdd, рабочая система на ssd)
    *project celadon — довольно интересный, но еще сыроватый проект от intel для оптимизации android под запуск в контейнере или виртуалке на их процессорах.

      0

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

    Only users with full accounts can post comments. Log in, please.