VirtualBox Ubuntu 16.04環(huán)境下編譯AOSP 7.1.2 源碼

話說最初投奔Android平臺就是看中其開源的特性,善于利用OS源碼,對個人開發(fā)成長確實有不可替代的作用。May the Force be with you.

在經(jīng)歷若干次下載失敗,編譯錯誤之后,最后編譯成功,看到了久違的 emulator (是的,幾乎20mins 后才能啟動的那個原生模擬器 = =! ).

主要步驟如下:

0 安裝VirtualBox 以及 安裝Ubuntu系統(tǒng)

請參考 http://blog.csdn.net/u013553529/article/details/54838490。
注意: 最好預(yù)留100GB+的磁盤空間 和 4GB+的內(nèi)存,并優(yōu)選OS 鏡像
Ubuntu(64-bit)。

1 下載Android源代碼

由于眾所周知的原因,官方的Google 站點(diǎn) https://source.android.com/source/downloading.html 不能訪問。建議選擇國內(nèi)清華鏡像。

1.1 下載 repo 工具

同樣通過鏡像下載 https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/ 。要注意的一點(diǎn)是,該工具 repo 是一個可執(zhí)行文件 (出現(xiàn)過一次下載后發(fā)現(xiàn)是一個HTTP 404 response 的html 文件)。

1.2 下載特定的OS版本

按 傳統(tǒng)初始化方法
建立工作目錄:

mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY

初始化倉庫:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

如果需要某個特定的 Android 版本(列表):

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.2_r36

同步源碼樹(以后只需執(zhí)行這條命令來同步):

repo sync

由于網(wǎng)絡(luò)原因,在使用repo sync同步代碼的過程中會多次出錯,總不能時時刻刻刻盯著,能不能在同步失敗的情況下,自動重試呢?當(dāng)然可以,我們可以寫一個簡單的shell腳本

#!/bin/bash
#FileName source_asyn.sh
PATH=~/bin:$PATH
# 注意修改成你要編譯的版本,比如這里我在mac上編譯的是android-7.1.2_r36
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.2_r36
repo sync
while [$? = 1]: do
echo "=========download failed,again============"
sleep 5
repo sync
done

代碼同步完成后,原來的 .repo 隱藏文件下的對應(yīng)版本的源代碼會出現(xiàn)在 WORKING_DIRECTORY 文件夾下。

2 編譯代碼

2.0 預(yù)設(shè)置參數(shù)

鑒于極易出現(xiàn)2.0.2中描述的問題,建議提前檢查修改配置,并啟動server

編譯過程中主要碰到的問題包括:

2.0.1 Communication error with Jack server

Communication error with Jack server (28). Try 'jack-diagnose'

解決方法:
jack-admin start-server

2.0.2 GC overhead limit exceeded (version 1.2-rc4 'Carnac' ...)

解決方法:
按出錯的提示,可以對應(yīng)修改JVM參數(shù),修改最大可用heap內(nèi)存。

  • 1 停止運(yùn)行中的server ./prebuilds/sdk/tools/jack-admin stop-server

  • 2 修改VM 啟動參數(shù):
    gedit ./prebuilds/sdk/tools/jack-admin

JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation}" 直接修改為 :
JACK_SERVER_VM_ARGUMENTS="-Xmx4096m -Dfile.encoding=UTF-8 -XX:+TieredCompilation"。注意:這里不再使用${parameter:=default}的語法,直接給JACK_SERVER_VM_ARGUMENTS賦值。

  • 3 重新啟動 server ./prebuilds/sdk/tools/jack-admin start-server, 可以從log中看到剛剛設(shè)置的 -Xmx 參數(shù)

以上是本人碰到過的編譯錯誤。如果遇到其它類型的錯誤,可以參考 這里 解決。

2.1 設(shè)置環(huán)境

cd WORKING_DIRECTORY
source build/envsetup.sh

2.2 選擇編譯目標(biāo)

執(zhí)行 lunch,選擇默認(rèn)的aosp_arm-eng。

aosp(Android Open Source Project)代表Android開源項目;arm表示系統(tǒng)是運(yùn)行在arm架構(gòu)的處理器上
-eng:代表engineer,也就是所謂的開發(fā)工程師的版本,擁有最大的權(quán)限(root等),此外還附帶了許多debug工具

更多關(guān)于build 以及 build type的說明,請移步這里.

2.3 編譯

通過make指令進(jìn)行代碼編譯,該指令通過-j參數(shù)來設(shè)置參與編譯的線程數(shù)量,以提高編譯速度.比如這里我們設(shè)置8個線程同時編譯:
make -j8
需要注意的是,參與編譯的線程并不是越多越好,通常是根據(jù)你機(jī)器cup的核心來確定:core*2,即當(dāng)前cpu的核心的2倍.比如,我現(xiàn)在的筆記本是雙核四線程的,因此根據(jù)公式,最快速的編譯可以make -j8.
(通過cat /proc/cpuinfo查看相關(guān)cpu信息)

編譯成功后,你會看到類似的信息:
#### make completed successfully (hh:mm:ss) ####

3 啟動模擬器

emulator

4 參考

清華大學(xué)開源軟件鏡像站

打造自己的Android源碼學(xué)習(xí)環(huán)境 系列 blog

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

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

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

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