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)版本的對應關系
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需要首先設置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項


圖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

打開模擬器:

導入編譯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ū)的設置撕阎。


圖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 并行編譯的時候占用的資源太大導致內(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 目錄

圖12.png

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

設置增加 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 沒有安裝晰韵。

圖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)境的的要求,那么這個錯誤是可以避免的.當然,這個問題也很容易解決:安裝openjdk 8,別忘了使用sudo update-alternative命令切換jdk版本.

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

圖16.png

這個錯誤比較常見,尤其是在編譯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
圖17.png

執(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)如下:

圖18.png

或是

圖19.png

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


圖20.png

參考

手把手教你在Mac OS下載、編譯及導入Android源碼

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

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

Google手機驅(qū)動

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

修改aapt和自定義資源ID

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滑绒,隨后出現(xiàn)的幾起案子闷堡,更是在濱河造成了極大的恐慌,老刑警劉巖疑故,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杠览,死亡現(xiàn)場離奇詭異,居然都是意外死亡纵势,警方通過查閱死者的電腦和手機踱阿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門管钳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人软舌,你說我怎么就攤上這事才漆。” “怎么了佛点?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵醇滥,是天一觀的道長。 經(jīng)常有香客問我超营,道長鸳玩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任演闭,我火速辦了婚禮不跟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘船响。我一直安慰自己躬拢,他們只是感情好躲履,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布见间。 她就那樣靜靜地躺著,像睡著了一般工猜。 火紅的嫁衣襯著肌膚如雪米诉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天篷帅,我揣著相機與錄音史侣,去河邊找鬼。 笑死魏身,一個胖子當著我的面吹牛惊橱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箭昵,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼税朴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了家制?” 一聲冷哼從身側(cè)響起正林,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颤殴,沒想到半個月后觅廓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡涵但,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年杈绸,在試婚紗的時候發(fā)現(xiàn)自己被綠了帖蔓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞳脓,死狀恐怖讨阻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情篡殷,我是刑警寧澤钝吮,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站板辽,受9級特大地震影響奇瘦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜劲弦,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一耳标、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邑跪,春花似錦次坡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至轴踱,卻和暖如春症脂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淫僻。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工诱篷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雳灵。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓棕所,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悯辙。 傳聞我的和親對象是個殘疾皇子琳省,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容