Android 源碼編譯並導入 Android Studio

近日有幸加入魅族 Flyme 團隊參與系統研發的工做,涉及到 Android Framework 層面的開發工做。在此以前都是基於應用層面的開發,因而開始編寫 Android Framework 系列博客記錄我從應用開發到系統開發的成長。java

本文基於 Ubuntu 16.04 進行編譯,若無 Ubuntu 系統建議使用 Docker 掛載進行編譯,Android 亦提供了 Mac 下的編譯方式,具體可參考設置 macOS 編譯環境。這篇文章將介紹如何下載、編譯 AOSP 源碼並將其導入 Android Studio。linux

一、安裝 OpenJDK8

AOSP 要求在 Ubuntu 上使用 OpenJDK:android

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
sudo update-alternatives --config java
sudo update-alternatives --config javac
複製代碼

完成後經過 java -version 查看 JDK 版本。git

二、安裝編譯環境所需軟件

sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip libssl-dev
複製代碼

三、Git/Repo 安裝

Git 安裝web

apt-get install git
複製代碼

Repo 安裝shell

確保主目錄中有一個 bin/ 目錄,而且它包含在該路徑中:api

mkdir ~/bin
PATH=~/bin:$PATH
複製代碼

下載 Repo 工具,並確保它可執行:bash

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
複製代碼

四、源碼下載

進入版本分支列表:source.android.com/setup/start…eclipse

選擇須要下載的機型源碼。以 android-9.0.0_r45 爲例:curl

repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r45 --depth=1
複製代碼

--depth=1 爲淺拷貝, -b 選擇指定分支,可節省空間、時間,若是恰巧你資力雄厚網速夠快機器硬盤夠大固然能夠直接全量下載:

repo init -u https://android.googlesource.com/platform/manifest
複製代碼

init 成功後經過 repo sync -c 加載代碼,-c 表示加載當前分支,若不加此參數會加載其餘分支的代碼信息,耗時較長。固然若是恰巧你資力雄厚機器夠牛逼,那麼把 -c 去掉便可全量獲取。

五、源碼編譯

在源代碼根目錄下使用命令 source build/envsetup.sh 運行該腳本將 envsetup.sh 裏的函數聲明爲當前會話終端可用的命令,完畢後經過 lunch 命令選擇須要編譯的項目,可在 FVCS 中查看。選擇完畢後便可開始源碼編譯。

在編譯過程當中,遇到過 Jack OOM 的錯誤,故在編譯以前,先將 Jack 的內存設大:

export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
out/host/linux-x86/bin/jack-admin kill-server
out/host/linux-x86/bin/jack-admin start-server
複製代碼

所有編譯:先經過命令 make update-api -j8 更新 apk-api.txt 文件,而後使用 make -j8 編譯。後面的 -j8 表示啓用多少線程,通常爲 CPU 核心數的一到二倍,好比電腦核心數爲 8 核,則可在 -j8 到 -j16 間按需選擇。

模塊編譯:例如編譯 SystemUI 能夠在源碼根目錄下使用 mmm frameworks/base/packages/Keyguard/ && mmm frameworks/base/packages/SystemUI/

六、代碼導入 Android Studio

編譯完成後,在源碼根目錄執行命令 mmm development/tools/idegen/ 或者 make idegen 編譯 idegen.jar 包,而後執行 ./development/tools/idegen/idegen.sh ,在根目錄下生成了 android.ipr 及 android.iml,在 Android Studio 中打開 android.ipr 便可將源碼導入。

注:導入全部源碼模塊會很慢,可在 android.iml 中用 excludeFolder 將一些不關心的模塊過濾掉,僅保留 package 模塊和 framework 模塊。

<excludeFolder url="file://$MODULE_DIR$/.repo" />
      <excludeFolder url="file://$MODULE_DIR$/art" />
      <excludeFolder url="file://$MODULE_DIR$/bionic" />
      <excludeFolder url="file://$MODULE_DIR$/bootable" />
      <excludeFolder url="file://$MODULE_DIR$/build" />
      <excludeFolder url="file://$MODULE_DIR$/commontools" />
      <excludeFolder url="file://$MODULE_DIR$/compatibility" />
      <excludeFolder url="file://$MODULE_DIR$/cts" />
      <excludeFolder url="file://$MODULE_DIR$/dalvik" />
      <excludeFolder url="file://$MODULE_DIR$/developers" />
      <excludeFolder url="file://$MODULE_DIR$/development" />
      <excludeFolder url="file://$MODULE_DIR$/device" />
      <excludeFolder url="file://$MODULE_DIR$/disregard" />
      <excludeFolder url="file://$MODULE_DIR$/external" />
      <excludeFolder url="file://$MODULE_DIR$/external/bluetooth" />
      <excludeFolder url="file://$MODULE_DIR$/external/chromium" />
      <excludeFolder url="file://$MODULE_DIR$/external/emma" />
      <excludeFolder url="file://$MODULE_DIR$/external/icu4c" />
      <excludeFolder url="file://$MODULE_DIR$/external/jdiff" />
      <excludeFolder url="file://$MODULE_DIR$/external/webkit" />
      <excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
      <excludeFolder url="file://$MODULE_DIR$/hardware" />
      <excludeFolder url="file://$MODULE_DIR$/kernel" />
      <excludeFolder url="file://$MODULE_DIR$/libcore" />
      <excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
      <excludeFolder url="file://$MODULE_DIR$/out" />
      <excludeFolder url="file://$MODULE_DIR$/out/eclipse" />
      <excludeFolder url="file://$MODULE_DIR$/out/host" />
      <excludeFolder url="file://$MODULE_DIR$/out/target/common/docs" />
      <excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates" />
      <excludeFolder url="file://$MODULE_DIR$/out/target/product" />
      <excludeFolder url="file://$MODULE_DIR$/pdk" />
      <excludeFolder url="file://$MODULE_DIR$/platform_testing" />
      <excludeFolder url="file://$MODULE_DIR$/prebuilt" />
      <excludeFolder url="file://$MODULE_DIR$/prebuilts" />
      <excludeFolder url="file://$MODULE_DIR$/sdk" />
      <excludeFolder url="file://$MODULE_DIR$/shortcut-fe" />
      <excludeFolder url="file://$MODULE_DIR$/system" />
      <excludeFolder url="file://$MODULE_DIR$/test" />
      <excludeFolder url="file://$MODULE_DIR$/toolchain" />
      <excludeFolder url="file://$MODULE_DIR$/tools" />
      <excludeFolder url="file://$MODULE_DIR$/vendor" />
      <excludeFolder url="file://$MODULE_DIR$/wingcust" />
複製代碼

至此, AOSP 源碼就編譯好並導入到 Android Studio 了。後面的文章將會圍繞 SystemUI 進行介紹,並刷入真機/虛擬機中進行調試,但願能記錄下本身在另外一個方向的成長,歡迎與我交流:me@york1996.com。

相關文章
相關標籤/搜索