Решил поделиться своей инструкцией как собрать 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-а свои реализации.
Запускаем отладку
Для начала необходимо запустить monitor
~/Android/Sdk/tools/lib/monitor-x86_64/monitor
возможно потребуется дополнительно поставить jre
sudo apt install openjdk-8-jre-headless
Выбираем процесс, который будем отлаживать. В monitor-е выбираем процесс и справа от порта процесса появится /8700, это как раз порт отладчика, к нему можно подключаться через IDEA.
Все системные штуки находятся в system_process. Его мы и будем отлаживать.
monitor один самых полезных инструментов при отладке и исследования работы AOSP
В проекте добавляем новую Remote конфигурацию, только указываем 8700 порт. Именно к этому порту и будем подключаться
Запускаем 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).
Теперь все готово для экспериментов.
pda11111
Недавно собирал project celadon* на 4гб оперативки и hdd, да пришлось добить swap до 16 гб, чтоб собралось, но не за 20 часов. По-моему часов 8 шло максимум. (сам проект на hdd, рабочая система на ssd)
*project celadon — довольно интересный, но еще сыроватый проект от intel для оптимизации android под запуск в контейнере или виртуалке на их процессорах.
maluginp Автор
Не слышал об этом проекте, обязательно почитаю. На китайский сайтах читал, что они часто используют облака Alibaba для сборки. Но мне не приходятся часто пересобирать, поэтому на ночь ставлю и утром получаю сборку. Плюс CCACHE сильно помогает.