編譯環(huán)境:
編譯 Android 2.3.x 及以上版本的系統(tǒng)源碼需要 64 位的系統(tǒng)運行環(huán)境來支持,而編譯 2.3.x 以下的版本則需要 32 位的系統(tǒng)運行環(huán)境对供。磁盤空間至少150G虑润,虛擬機內(nèi)存至少分配8g
Android 版本與編譯系統(tǒng)版本的對應關系
Linux:
Mac OS:
下載 repo 工具:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod +x ~/bin/repo
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
git 工具安裝:
sudo apt-get install git
git config --global user.name "lqc123"
git config --global user.email "845338422@qq.com"
建立工作目錄:
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY
初始化倉庫:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
指定版本
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-5.1.1_r1
同步鏡像,j4 指定線程數(shù)量冕末,線程數(shù)量=CPU核心數(shù)*2
repo sync -j4
安裝jdk:
安裝jdk 1.8
sudo apt-get install openjdk-8-jdk
環(huán)境配置
JAVA_HOME=/usr/lib/jdk1.8.0_101
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH
安裝1.7
如果你要編譯的是Android 5.x到android 6.0之間的系統(tǒng)版本,需要采用openjdk7. 但是在Ubuntu 15.04及之后的版本的在線安裝庫中只支持openjdk8和openjdk9的安裝.
因此,如果你想要安裝openjdk 7需要首先設置ppa:
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
然后再執(zhí)行安裝命令:
sudo apt-get install openjdk-7-jdk
不同版本切換
sudo update-alternative --config java
sudo update-alternative --config javac
環(huán)境變量
打開/etc/profile文件壤追,配置OpenJDK:
sudo gedit /etc/profile
在末尾追加下面代碼:
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
修改完/etc/profile文件需要重啟才能生效污尉,但在不重啟的情況下凰棉,使用下面命令可以使當前bash環(huán)境生效:
source /etc/profile
修改源碼:
修改源碼/androidsource/art/build/Android.common_build.mk文件损拢,定位到75行,將下面的代碼
把true改成false
ifneq ($(WITHOUT_HOST_CLANG),true)
若不修改這里撒犀,編譯源碼的時候會出現(xiàn)錯誤福压,修改的目的是為了把CLANG這個編譯選項關掉,不會影響源碼編譯或舞。
安裝依賴:
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install lib32z-dev ccache
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
開始編譯:
在 .bashrc文件末尾添加:export USE_CCACHE = 1
echo export USE_CCACHE=1 >> ~/.bashrc
提高編譯效率荆姆,設置編譯器高速緩存:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
導入編譯Android源碼所需的環(huán)境變量和其它參數(shù):
//source是點符號另一種寫法,可以強制執(zhí)行shell映凳,無視權(quán)限胆筒,重新執(zhí)行剛修改的初始化文件 如 。 bash_profile 等
source build/envsetup.sh
lunch命令選擇目標
lunch 5
編譯
make -j4
啟動模擬器
emulator
模擬器運行加速:
檢測是否支持hardware virtualization(硬件虛擬化)诈豌,輸出大于說明支持
egrep -c '(vmx|svm)' /proc/cpuinfo
如果是虛擬機安裝勾選虛擬化Intel VT-x項
安裝
Cosmic (18.10) or later
$ sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
Lucid (10.04) or later
$ sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
Karmic (9.10) or earlier
$ sudo aptitude install kvm libvirt-bin ubuntu-vm-builder bridge-utils
打開模擬器:
導入編譯Android源碼所需的環(huán)境變量和其它參數(shù):
source build/envsetup.sh
lunch命令選擇目標仆救,由于我編譯的版本是aosp_x86-eng,所以選擇5
lunch 5
打開模擬器
emulator
導入源碼到AndroidStudio中:
編譯idegen矫渔,idegen 工具會自動生成針對 Android 開發(fā)工具(Android Studio和Eclipse)的配置文件彤蔽。
源碼路徑
developement/tools/idegen
初始化命令工具
source build/envsetup.sh
編譯 idegen 模塊,生成idegen.jar
mmm development/tools/idegen/
生成針對 Android 開發(fā)工具的配置文件
sudo ./development/tools/idegen/idegen.sh
在執(zhí)行完上述指令后蚌斩,會在源碼路徑下生成下面三個文件
android.ipr:工程相關的設置铆惑,比如編譯器配置范嘱、入口,相關的libraries等员魏。
android.iml:描述了modules丑蛤,比如modules的路徑,依賴關系等。
android.iws:包含了一些個人工作區(qū)的設置撕阎。
注:<excludeFolder> 表示不需要加載的目錄
模塊編譯:
除了通過make命令編譯整個系統(tǒng)外受裹,還可以通過下列命令進行分模塊編譯
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
mmm命令編譯launch2:
mmm packages/apps/Launcher2/
編譯成功,生成文件路徑如下
aapt編譯:
查看編譯環(huán)境
. build/envsetup.sh
進入appt目錄虏束,輸入mm命令棉饶,開始編譯
cd frameworks/base/tools/aapt
編譯成功,生成目錄
常見問題
問題一:
error: Exited sync due to fetch errors #33
解決方法:
repo sync -j8 -f --force-sync//8=cpu核心數(shù)*2
問題二:
Jack編譯過程中遇到的問題:
編譯過程中報 Out of memory error 并中斷編譯
按照官方的說法镇匀, Jack 并行編譯的時候占用的資源太大導致內(nèi)存溢出了
可以通過在 $HOME/.jack 文件中減小 SERVER_NB_COMPILE 的值來減小并行編譯數(shù)量照藻, SERVER_NB_COMPILE 的值默認為4
但實際情況是 Jack 沒有在根路徑下生成 .jack 文件,并且手動創(chuàng)建設置 SERVER_NB_COMPILE 后重啟 Jack 服務也沒有效果汗侵。
經(jīng)測試發(fā)現(xiàn) make 編譯過程中當 Jack 第一次被啟用時會在 home 根路徑下生成 .jack-server 目錄
可以通過修改該目錄中 config.properties 文件里的.jack.server.max-service值來設置并發(fā)線程數(shù)幸缕。
設置增加 Jack 的內(nèi)存容量來解決這個問題
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
然后進入到輸出路徑的 bin 目錄下:
cd /home/cjpx00008/aosp/out/host/linux-x86/bin
執(zhí)行下面的指令重啟 Jack 服務
./jack-admin stop-server
./jack-admin start-server
問題三
編譯百分之一的時候報的錯誤,bison 沒有安裝晰韵。
解決方法:
sudo apt-get install bison
sudo apt-get install g++-multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev
問題四
You are attemping to build with the incorrect version.具體錯誤如下:
如果你認真看了構(gòu)建環(huán)境的的要求,那么這個錯誤是可以避免的.當然,這個問題也很容易解決:安裝openjdk 8,別忘了使用sudo update-alternative命令切換jdk版本.
問題五
Out of memory error.具體錯誤如下:
這個錯誤比較常見,尤其是在編譯AOSP主線代碼時,常常會因為JVM heap size太小而導致該錯誤.
此時有兩種解決方法:
方法一:
在編譯命令之前,修改prebuilts/sdk/tools/jack-admin文件,找到文件中的這一行:
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
然后在該行添加-Xmx4096m,如:
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
然后再執(zhí)行
time make -8j
方法二:
在控制臺執(zhí)行以下命令:
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
執(zhí)行完該命令后,再使用make命令繼續(xù)編譯.某些情況下,當你執(zhí)行jack-admin kill-server時可能提示你命令不存在,此時去你去out/host/linux-x86/bin/目錄下會發(fā)現(xiàn)不存在jack-admin文件.如果我是你,我就會重新repo sync下,然后從頭來過.(其實发乔,你可以用方法一,而無須重新repo sync)
注意:在編譯SDK的時候同樣可能出現(xiàn)因jvm heap size太小而導致編譯錯誤,一旦出現(xiàn)用以上任何一種方案都可以解決.
問題六
使用emulator時,虛擬機停在黑屏界面,點擊無任何響應.此時,可能是kerner內(nèi)核問題,解決方法如下:
執(zhí)行如下命令
/out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7
通過使用kernel-qemu-armv7內(nèi)核 解決模擬器等待黑屏問題.而-partition-size 1024 則是解決警告: system partion siez adjusted to match image file (163 MB >66 MB)
如果你一開始編譯的版本是aosp_arm-eng,使用上述命令仍然不能解決等待黑屏問題時,不妨編譯aosp_arm64-eng試試.
問題七
Out of memory error.具體錯誤雪猪,該錯誤和第二條本質(zhì)一樣栏尚,尤其是你在進行編譯Android 8.*版本時更容易遇到該問題,其表現(xiàn)如下:
或是
無論表現(xiàn)是什么只恨,但錯誤的本質(zhì)還是Java heap space 译仗。當然,其解決該問題的方式和之前的第二條解決方案一樣內(nèi)存值盡量設置大一些坤次。
簡單的來說一下具體步驟:打開prebuilts/sdk/tools/jack-admin文件古劲,修改以下內(nèi)容:
參考
Android 7.1.1系統(tǒng)源碼下載缰猴、編譯产艾、刷機-Nexus 6實戰(zhàn)