這個章節(jié)闡述如何建立起你的本地工作環(huán)境來構(gòu)建 Android 源文件。你需要使用 Linux 或 Mac OS 操作系統(tǒng)。目前暫不支持在 Windows 下編譯。
想對整個代碼審查和代碼更新過程有個整體的了解,請參閱 Life of a Patch。
部分構(gòu)建環(huán)境的需求取決于你打算編譯的源碼版本,查看 Build Numbers 里面包含一個完整的分支列表供你選擇。你也許想選擇下載最新的源碼(Master)進行構(gòu)建,在這種情況下你可以在初始化倉庫的時候簡單的忽略分支規(guī)范。
當你選擇了一個分支后,參考下面相應的說明來搭建你的編譯環(huán)境。
這些說明適用于所有分支,包括 master 分支。
通常內(nèi)部測試 Android 的構(gòu)建是在最近一個版本的 Ubuntu LTS (14.04)中,但是大多數(shù)發(fā)行版本都應該具備構(gòu)建所需的工具,歡迎反饋您在其他版本上的嘗試結(jié)果,無論成功還是失敗。
Gingerbread(2.3.x)或以上版本,包括 master 分支,都需要一個64位的環(huán)境,它之前的版本可以在32位系統(tǒng)下進行編譯。
提示:參閱 下載與構(gòu)建了解對硬件環(huán)境和軟件環(huán)境的需求。然后參考下面對 Ubuntu 和 Mac OS 下構(gòu)建的詳細說明。
Android Open Source Project(AOSP)的 master 分支需要 Java 7。在 Ubuntu 下可以使用 OpenJDK。
Java 7:適用于最新版本的 Android
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
也可以運行如下指令升級默認的 Java 版本:
sudo update-alternatives --config java
sudo update-alternatives --config javac
如果你遇到 Java 版本錯誤,參考 wrong-java-version 中描述的來設置它的路徑。
開發(fā)較早版本的 Android,下載安裝相應的 Java JDK:
Java 6:適用 Gingerbread 到 KitKat 的版本
Java 5:適用 Cupcake 到 Froyo 的版本
提示: 在構(gòu)建過程中的命令會確定使用的是 Sun JDK 而不是先前安裝的 JDK。
你將需要一個64位版本的 Ubuntu 。推薦 Ubuntu 14.04。
$ sudo apt-get install bison g++-multilib git gperf libxml2-utils make zlib1g-dev:i386 zip
你也許會使用 Ubuntu 12.04 來構(gòu)建較早版本的 Android。 master 分支和最近的發(fā)行都不支持 12.04 版本。
$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
在 Ubuntu 10.04-11.10 上構(gòu)建已不在被支持,但仍可以用來構(gòu)建較早的 AOSP。
$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \
libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \
libxml2-utils xsltproc
在 Ubuntu 10.10 中:
$ sudo ln -s /usr/lib32/mesa/libGL.so.1 /usr/lib32/mesa/libGL.so
在 Ubuntu 11.10 中:
$ sudo apt-get install libx11-dev:i386
在 GNU/Linux systems 系統(tǒng)下,(尤其是 Ubuntu 系統(tǒng)),通常用戶在默認情況下不能直接讀取 USB 設備。我們要對系統(tǒng)進行配置才能允許這種操作。
推薦的做法是創(chuàng)建一個文件 /etc/udev/rules.d/51-android.rules
(作為 root 用戶),接著將下面對內(nèi)容復制上去。 <username>
必須被替換成實際被授權通過 USB 訪問手機的用戶名。
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"
這些規(guī)則會在下次插入設備的時候生效。因此可能需要先拔出設備再插回去。
知道這些就可以在 Ubuntu Hardy Heron (8.04.x LTS) 和 Lucid Lynx (10.04.x LTS) 上工作。其他版本的 Ubuntu 或其他 GNU/Linux 的發(fā)行版本需要不同的設置。
默認情況下,每個構(gòu)建出來的結(jié)果都存儲在系統(tǒng)資源目錄的子文件夾 out/
目錄下。
在一些擁有多個存儲設備的機器上。構(gòu)建在存儲源文件并輸出到單獨卷的時候會進行的較快。還有其他一些性能,比如可以將輸出存儲到一個經(jīng)過速度優(yōu)化的文件系統(tǒng)中并且不會造成穩(wěn)健性崩潰,因為所有文件都可以在文件損壞的情況下被重新生成。
要使用這種功能,配置輸出 OUT_DIR_COMMON_BASE
變量指向到你存儲輸出數(shù)據(jù)的地方。
export OUT_DIR_COMMON_BASE=<path-to-your-out-directory>
每個源代碼樹的輸出目錄都將在文件夾創(chuàng)建后以源碼樹命名。
舉個例子,如果你現(xiàn)在有一些源代碼樹,比如 /source/master1
和 /source/master2
并且 OUT_DIR_COMMON_BASE
設置為 /output
,輸出目錄就會是 /output/master1
和 /output/master2
。
有一個重要的情況就是不能將多個源代碼樹輸出到同一個目錄并且具有相同的名稱,否則他們會在同時使用同一個輸出目錄的時候出現(xiàn)不可預知的結(jié)果,然后終止。
這些僅支持 Jelly Bean (4.1) 及以上版本,包括 master 分支。
在默認安裝下, Mac OS 運行在一個保留但不區(qū)分大小寫的文件系統(tǒng)上。這種文件系統(tǒng)并不被 git 支持而且一些 git 指令 (比如 git status )表現(xiàn)異常。出于此原因,我們推薦你在一個區(qū)分大小寫的文件系統(tǒng)上工作使用 AOSP 源代碼樹。 使用磁盤映像可以非常容易地達到目的,討論如下。
一旦合適的文件系統(tǒng)準備好,在現(xiàn)代的 Mac OS 環(huán)境下構(gòu)建 master 分支會變得非常容易。較早的一些分支,包括 ICS,需要一些額外的工具和 SDK。
你可以用你的 Mac OS 環(huán)境下正在使用對磁盤映像創(chuàng)建一個區(qū)分大小寫的文件系統(tǒng)。為了創(chuàng)建這個映像,啟動磁盤工具并選擇 "New Image" 。完成構(gòu)建最少需要 25GB;以后可能會需要更多。使用分散的映像可以節(jié)省空間并且以后可以根據(jù)需要增大。請確定選擇“區(qū)分大小寫,日志”作為卷格式。
你也可以在 shell 里輸入下面的命令來創(chuàng)建它。
# hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
這會創(chuàng)建一個 .dmg(或者 .dmg.sparsefile)文件,一旦被安裝,將成為具有Android 開發(fā)所需格式的驅(qū)動器。
如果你以后需要更大的空間,你可以使用下面的指令來重新設置分散映像的大小。
# hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
一個名為 android.dmg 的地盤映像被安裝在你的主目錄下,你可以在 ~/.bash_profile
文件中添加一個輔助功能模塊。
# mount the android file image
function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }
注意:如果你的系統(tǒng)創(chuàng)建了一個 .dmg.sparsefile 文件,請將 -/android.dmg 替換為 -/android.dmg.sparsefile 。
# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }
一旦你安裝了 android 卷,你可以在這里進行你所有的工作。也同樣可以像一個外部驅(qū)動器一樣直接彈出(卸載)它。
Android 開源工程 (AOSP) 中 Android 的 master 和 5.0.x 分支需要 Java 7。在 Mac OS 中,使用 jdk-7u71-macosx-x64.dmg。
要開發(fā) Android Gingerbread 到 KitKat 之間的版本,下載并安裝 Java JDK 的 Java 6 版本。
要在 Mac OS 環(huán)境下構(gòu)建最新版本的源代碼,你需要一臺具備 Intel/x86 的機器并且系統(tǒng)在 Mac OS X v10.8(Mountain Lion)或以上, Xcode 版本在4.5.2以上并包含命令行工具。
要在 Mac OS 環(huán)境下構(gòu)建 5.0.x 及其之前的源碼,你需要一臺具備 Intel/x86 的機器并且系統(tǒng)在 Mac OS X v10.8(Mountain Lion)或以上, Xcode 版本在4.5.2以上并包含命令行工具。
要在 Mac OS 環(huán)境下構(gòu)建 4.2.x 及其之前的源代碼,你需要一臺 Intel/x86 的機器并且系統(tǒng)為 Mac OS X v10.6 (Snow leopard) 或 Mac OS X v10.7 (Lion),具備 Xcode 4.2(蘋果開發(fā)者工具)。盡管 Lion 系統(tǒng)并不事先具備 JDK,但它會在你嘗試構(gòu)建源碼的時候自動安裝。
剩下的關于 Mac OS 的內(nèi)容只針對那些希望構(gòu)建較早分支的用戶。
要在 Mac OS 環(huán)境下構(gòu)建 android-4.0.x 及其之前的版本分支,你需要一臺 Intel/x86 的機器并且運行 Mac OS X v10.5 (Leopard) 系統(tǒng)或 Mac OS X v10.6 (Snow Leopard) 系統(tǒng),同時你將需要 Mac OS X v10.5 的 SDK 。
從 Apple 開發(fā)者平臺獲取安裝 Xcode。我們推薦 3.1.4 或更新版本(比如 gcc 4.2)。4.x 的版本可能會造成困難。如果你還沒有準備好注冊成為 Apple 開發(fā)者,則需要創(chuàng)建一個 Apple ID 來進行下載。
注意:確保在你的 /usr/bin 路徑之前存在 /opt/local/bin 路徑。如果沒有,請將下面的內(nèi)容添加到你的 ~/.bash_profile 文件中:
export PATH=/opt/local/bin:$PATH
注意:如果在你的主目錄下沒有
.bash_profile
文件,那就創(chuàng)建一個。
$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
如果使用的是 Mac OS X v10.4 ,還需要安裝 bison:
$ POSIXLY_CORRECT=1 sudo port install bison
在 Android ICS 之前的版本,存在一個 bug 阻止了 android 的構(gòu)建。你可以按照下面的步驟使用 MacPorts 安裝 3.81 版本:
/opt/local/etc/macports/sources.conf
并添加下面一行內(nèi)容 file:///Users/Shared/dports
添加完上面一行。之后創(chuàng)建這樣一個目錄:
$ mkdir /Users/Shared/dports
$ svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/
$ portindex /Users/Shared/dports
$ sudo port install gmake @3.81
在 Mac OS 上,默認的文件同時打開數(shù)量值太低,所以一個高并發(fā)的構(gòu)建會超出這個限制。
為了增加這個上限,將下面的一行添加到你的 -/.bash_profile 文件中:
# set the number of open files to be 1024
ulimit -S -n 1024
你可以選擇性的讓構(gòu)建使用 ccache 匯編工具。 Ccache 作為一個編譯緩存器可以用來為重構(gòu)建提速。如果你經(jīng)常使用 make clean,或者經(jīng)常切換不同的工程進行構(gòu)建的話,這將會非常好用。
在你的 .bashrc(或其它同類文件)中添加下面一行:
export USE_CCACHE=1
默認情況下 cache 會被存儲在 ~/.ccache 下。如果你的主目錄在 NFS 活著其它非本地系統(tǒng)上,你也同樣需要在你的 .bashrc 文件中指定目錄。
export CCACHE_DIR=<path-to-your-cache-directory>
建議緩存大小設為 50 - 100 GB 之間。在你下載好源代碼之后運行下面的指令:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
在 Mac OS 中,你應該將 linux-x86 替換為 darwin-x86 :
prebuilts/misc/darwin-x86/ccache/ccache -M 50G
在構(gòu)建 Ice Cream Sandwich (4.0.x) 或更早版本的時候,ccache 會在一個不同的位置下:
prebuilt/linux-x86/ccache/ccache -M 50G
這些設置被存儲在 CCACHE_DIR 并且一直生效。
你的編譯環(huán)境已經(jīng)準備好了,接下來下載源代碼。