鍍金池/ 教程/ Android/ 構建系統
下載源碼
根據設備構建
Git 資源
構建系統
Android 平臺 64 位構建指導
初始化編譯環(huán)境
Android 源代碼
品牌指南
已知的問(wèn)題
Repo 命令手冊
構建內核
Bug 的生命周期
代碼主線(xiàn)、分支和版本
使用 Eclipse
提交補丁
下載與構建
參與
項目角色
補丁的生命周期
提交 Bugs
關(guān)于代碼風(fēng)格的指導
開(kāi)發(fā)
代碼名稱(chēng),標簽和版本號

構建系統

下面的信息對于構建 Android 資源樹(shù)的指導適用于各個(gè)分支,包括 master 分支。

選擇一個(gè)分支

有些構建工程的環(huán)境所需要的請求,是需要搞清楚你計劃要編譯這些代碼所使用的版本的。請查看 Codenames,Tags,and Build Numbers 里面完整的分支列表以供你來(lái)選擇。你也可以選擇下載,構建最新版本源代碼(被稱(chēng)之為 master),這樣你需要做的僅僅是在初始化倉庫時(shí),刪除之前的分支即可。

當已經(jīng)選擇一個(gè)分支后,就跟著(zhù)下面的指導去創(chuàng )建你的構建環(huán)境。

基礎的構建命令系列如下所示:

初始化

envsetup.sh 腳本來(lái)初始化環(huán)境。值得注意的是,用 . (一個(gè)單獨的點(diǎn))來(lái)替換 source 節省一些符號,簡(jiǎn)寫(xiě)也更方便的在說(shuō)明文檔中使用。

$ source build/envsetup.sh

或者是

$ . build/envsetup.sh

選擇一個(gè)目標

選擇一個(gè)目標用 lunch 來(lái)建立。明確的配置信息可以通過(guò)一個(gè)參數來(lái)實(shí)現。比如像下面的命令:

$ lunch aosp_arm-eng

這個(gè)命令是構建一個(gè)模擬器,并且可以使用 debug 模式。

如果使用沒(méi)有參數的 lunch 將會(huì )及時(shí)的提醒你從菜單中選擇一個(gè)目標參數。

所有構建目標可以從 BUILD-BUILDTYPE,BUILD 是一個(gè)代碼名稱(chēng),依賴(lài)于特定參數的混合體。這里是一部分的列表:

Build name Device Notes
aosp_arm ARM emulator AOSP,fully configured with all languages,apps,inputs methods
aosp_maguro maguro AOSP, running on Galaxy Nexus GSM/HSPA+ ("maguro")
aosp_panda panda AOSP, running on PandaBoard ("panda")

下列顯示的是其中一個(gè)的 BUILDTYPE:

Buildtype Use
user limited access; suited for production
userdebug like "user" but with root access and debuggability; preferred for debugging
eng development configuration with additional debugging tools

要想查看更多有關(guān)構建以及運行在真機的信息,請看 Building for Devices

構建代碼

make 可以完成任何事情。GUN 可以用一個(gè) -jn 參數,傳遞一個(gè)平行的任務(wù),一般來(lái)說(shuō)使用一個(gè)介于 1 和 2 之間的參數 N,乘以在電腦上用于構建硬件線(xiàn)程的數量。比如,在一個(gè) dual-E5520(2 個(gè) cpu,每個(gè) 4 核 ,每核 2 個(gè)線(xiàn)程)上,最快的構建是使用命令 make -j16make -j32。

$ make -j4

運行它!

你既可以運行你 build 在模擬器上,也可以在真機上。請注意你已經(jīng)用 lunch 選中了你需要構建的目標,而且他不大可能運行在與構建目標不相符的地方。

在設備上運行

為了在設備上運行,你需要使用 fastboot ,這個(gè)命令需要你在成功構建之后,添加到你的 PATH 中。將設備置于 fastboot 模式,你既可以手工的在根目錄下添加 key,也可以用下面的腳本命令:

$ adb reboot bootloader

一旦設備在 fastboot 模式下,運行

$ fastboot flashall -w

-w 選項用于清除在設備上 /data 分區;這個(gè)選項很適合第一次刷入真機,但在某些情況下并非必要。

要想查看更多有關(guān)構建以及運行在真機的信息,請看 Building for Devices。

Android 模擬設備

模擬器將會(huì )自動(dòng)被構建進(jìn)程添加在你的路徑中。要啟動(dòng)模擬器,請輸入:

$ emulator

使用 ccache

ccache 是一種編譯緩存,為的是讓 C 和 C++ 更快的構建的。在資源樹(shù)的根目錄下,按照下面的說(shuō)明去做:

$ export USE_CCACHE=1
$ export CCACHE_DIR=/<path_of_your_choice>/.ccache
$ prebuilts/misc/linux-x86/ccache/ccache -M 50G

建議的緩存大小是 50-100 G。

在 Linux 上,你可以通過(guò)以下的操作查看 ccache :

$ watch -n1 -d prebuilts/misc/linux-x86/ccache/ccache -s

在 Mac OS 上,你應該用 darwin-x86 來(lái)替換掉 linux-x86。

當使用 Ice Cream Sandwich (4.0.x) 或者是這之前的版本時(shí),你應該用 prebuilt 來(lái)替換掉 prebuilts/misc。

分析解決常見(jiàn)構建錯誤

錯誤的 Java 版本

如果你嘗試用與 Android 不對應的 Java 版本,make 命令將會(huì )終止,并提示下面的信息:

************************************************************
You are attempting to build with the incorrect version
of java.

Your version is: WRONG_VERSION.
The correct version is: RIGHT_VERSION.

Please follow the machine setup instructions at
    https://source.android.com/source/download.html
************************************************************

出現這一現象可能的原因是:

  • 安裝在初始化構建環(huán)境中所說(shuō)的 JDK 失敗。
  • 另一個(gè)之前版本的 JDK 出現在你的路徑中。將正確的 JDK 放在你的 PATH 的開(kāi)頭處,或者從環(huán)境變量中刪除導致問(wèn)題的 JDK。

Python 版本 3

Repo 的基于特殊功能的 Python 2.x,但是不幸的是和 Python 3 相沖突。為了使用 Repo,請安裝 Python 2.x:

$ apt-get install python

忽略文件系統的情況

如果你正在 Mac OS 上構建一個(gè) HFS 文件系統,你可能會(huì )偶然遇見(jiàn)下面的錯誤:

************************************************************
You are building on a case-insensitive filesystem.
Please move your source tree to a case-sensitive filesystem.
************************************************************

請根據初始化構建環(huán)境中的說(shuō)明創(chuàng )建一個(gè)敏感的磁盤(pán)鏡像。

沒(méi)有 USB 權限

在大多數 Linux 系統上,沒(méi)有特權的用戶(hù)不能通過(guò)默認的 USB 端口。如果你看見(jiàn)一個(gè)權限拒絕錯誤,請根據初始化構建環(huán)境來(lái)配置你的 USB 入口。

如果 adb 已經(jīng)運行,并且通過(guò)剛才的規則也不能連接到設備,這時(shí)可以通過(guò) adb kill-server 命令殺死。這將會(huì )導致 adb 使用新的配置重啟。