話說最初投奔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-server2 修改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
