android源碼下載編譯

編譯環(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)版本的對應(yīng)關(guān)系
Linux:

圖1.jpg

Mac OS:

圖2.jpg

下載 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:

圖3.jpg

安裝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需要首先設(shè)置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文件需要重啟才能生效,但在不重啟的情況下,使用下面命令可以使當(dāng)前bash環(huán)境生效:

source /etc/profile

修改源碼:

修改源碼/androidsource/art/build/Android.common_build.mk文件,定位到75行,將下面的代碼

把true改成false
ifneq ($(WITHOUT_HOST_CLANG),true)

若不修改這里,編譯源碼的時候會出現(xiàn)錯誤,修改的目的是為了把CLANG這個編譯選項關(guān)掉,不會影響源碼編譯。

安裝依賴:

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

提高編譯效率,設(shè)置編譯器高速緩存:

prebuilts/misc/linux-x86/ccache/ccache -M 50G

導(dǎo)入編譯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項


圖4.png

安裝

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

打開模擬器:

導(dǎo)入編譯Android源碼所需的環(huán)境變量和其它參數(shù):

source build/envsetup.sh

lunch命令選擇目標,由于我編譯的版本是aosp_x86-eng,所以選擇5

lunch 5

打開模擬器

emulator

導(dǎo)入源碼到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:工程相關(guān)的設(shè)置,比如編譯器配置、入口,相關(guān)的libraries等。
android.iml:描述了modules,比如modules的路徑,依賴關(guān)系等。
android.iws:包含了一些個人工作區(qū)的設(shè)置。


圖5.png

注:<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/
圖6.png

編譯成功,生成文件路徑如下


圖7.png

aapt編譯:

查看編譯環(huán)境

. build/envsetup.sh
圖8.png

進入appt目錄,輸入mm命令,開始編譯

cd frameworks/base/tools/aapt
圖9.png

圖10.png

編譯成功,生成目錄


圖11.png

常見問題

問題一:

error: Exited sync due to fetch errors #33

解決方法:

repo sync -j8 -f --force-sync//8=cpu核心數(shù)*2

問題二:
Jack編譯過程中遇到的問題:
編譯過程中報 Out of memory error 并中斷編譯
按照官方的說法, Jack 并行編譯的時候占用的資源太大導(dǎo)致內(nèi)存溢出了
可以通過在 $HOME/.jack 文件中減小 SERVER_NB_COMPILE 的值來減小并行編譯數(shù)量, SERVER_NB_COMPILE 的值默認為4
但實際情況是 Jack 沒有在根路徑下生成 .jack 文件,并且手動創(chuàng)建設(shè)置 SERVER_NB_COMPILE 后重啟 Jack 服務(wù)也沒有效果。
經(jīng)測試發(fā)現(xiàn) make 編譯過程中當(dāng) Jack 第一次被啟用時會在 home 根路徑下生成 .jack-server 目錄

圖12.png

可以通過修改該目錄中 config.properties 文件里的.jack.server.max-service值來設(shè)置并發(fā)線程數(shù)。
圖13.png

設(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 服務(wù)

./jack-admin stop-server
./jack-admin start-server

問題三
編譯百分之一的時候報的錯誤,bison 沒有安裝。

圖14.png

解決方法:

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.具體錯誤如下:

圖15.png

如果你認真看了構(gòu)建環(huán)境的的要求,那么這個錯誤是可以避免的.當(dāng)然,這個問題也很容易解決:安裝openjdk 8,別忘了使用sudo update-alternative命令切換jdk版本.

問題五
Out of memory error.具體錯誤如下:

圖16.png

這個錯誤比較常見,尤其是在編譯AOSP主線代碼時,常常會因為JVM heap size太小而導(dǎo)致該錯誤.

此時有兩種解決方法:
方法一:
在編譯命令之前,修改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
圖17.png

執(zhí)行完該命令后,再使用make命令繼續(xù)編譯.某些情況下,當(dāng)你執(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太小而導(dǎo)致編譯錯誤,一旦出現(xiàn)用以上任何一種方案都可以解決.

問題六
使用emulator時,虛擬機停在黑屏界面,點擊無任何響應(yīng).此時,可能是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)如下:

圖18.png

或是

圖19.png

無論表現(xiàn)是什么,但錯誤的本質(zhì)還是Java heap space 。當(dāng)然,其解決該問題的方式和之前的第二條解決方案一樣內(nèi)存值盡量設(shè)置大一些。
簡單的來說一下具體步驟:打開prebuilts/sdk/tools/jack-admin文件,修改以下內(nèi)容:


圖20.png

參考

手把手教你在Mac OS下載、編譯及導(dǎo)入Android源碼

Android 7.1.1系統(tǒng)源碼下載、編譯、刷機-Nexus 6實戰(zhàn)

Android FrameWork學(xué)習(xí)(一)Android 7.0系統(tǒng)源碼下載\編譯

Google手機驅(qū)動

自己動手編譯最新Android源碼及SDK(Ubuntu)

修改aapt和自定義資源ID

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容