本文記錄了AOSP在Mac系統(tǒng)上下載和編譯的過(guò)程。
采用的系統(tǒng)是 macOS?10.13.1
所使用的AOSP分支是 android-8.1.0_r7
系統(tǒng)預(yù)留空間 大于200G
一. 環(huán)境配置
? ? 環(huán)境配置,官網(wǎng)給出了非常全的教程:Build Environment
????對(duì)于Mac用戶(hù)來(lái)說(shuō),需要配置的相對(duì)也不會(huì)很多
? ? 1. 創(chuàng)建大小寫(xiě)敏感文件系統(tǒng)
? ? ? ?????AOSP源碼編譯需要一個(gè)大小寫(xiě)敏感的文件系統(tǒng)環(huán)境,所以我們自己需要?jiǎng)?chuàng)建一個(gè)。打開(kāi)Terminal,輸入
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 150g ~/android.dmg
? ? ? ? 上面的150g就是我們創(chuàng)建的文件系統(tǒng)的可用大小,android.dmg就是我們創(chuàng)建的文件系統(tǒng)鏡像,其存放的目錄可以在任何地方,這里我們暫時(shí)制定在用戶(hù)根目錄下。之后找到該文件雙擊后,就可以將其掛載到系統(tǒng)文件系統(tǒng)中。我們可以在Finder左側(cè)看到新掛載的文件系統(tǒng)。
? ? 另外對(duì)于創(chuàng)建好的鏡像文件,我們也可以重新分配其大小
hdiutil resize -size <newsize>g ~/android.dmg
? ? 2.安裝JDK
對(duì)于Mac用戶(hù)來(lái)說(shuō)我們系統(tǒng)自帶了Open JDK7,不過(guò)如果編譯的是7.0以上的android系統(tǒng)的話(huà),則需要Open JDK 8 的環(huán)境,所以我們自己需要下載安裝,我們可以到官網(wǎng)選擇需要的版本進(jìn)行下載Java官網(wǎng)
下面列出Android版本與JDK的對(duì)應(yīng)關(guān)系:
Android 7.0 (Nougat) - Android 8.0 (O release): Ubuntu -?OpenJDK 8, Mac OS -?jdk 8u45 or newer
Android 5.x (Lollipop) - Android 6.0 (Marshmallow): Ubuntu -?OpenJDK 7, Mac OS -?jdk-7u71-macosx-x64.dmg
Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat): Ubuntu -?Java JDK 6, Mac OS -?Java JDK 6
Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu -?Java JDK 5
? ? 3.安裝Repo
? ? Repo是AOSP中用于下載和管理源碼的工具,也可以將其看成是git的上層管理控制工具。我們可以通過(guò)Terminal進(jìn)行下載,
mkdir ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/
repochmod a+x ~/bin/repo
之后我們需要將repo配置到環(huán)境變量中,打開(kāi) ~/.bash_profile,我們將以下代碼加入到文件最后一行
PATH=~/bin:$PATH
重新打開(kāi)Terminal,我們輸入repo后可以看到配置成功。
????4. 安裝XCode
? ? Xcode為AOSP提供Native編譯環(huán)境,對(duì)于Xcode的安裝我們可以直接通過(guò)App Store進(jìn)行安裝,目前Xcode版本為9.x,SDK版本為10.13,不過(guò)對(duì)于8.x版本的Android源碼來(lái)說(shuō),該版本有點(diǎn)高,我們需要在完成Xcode的安裝后再下載一個(gè)低版本的SDK,我們可以到這里去下載:MacOSX SDK下載,我們可以下載MacOSX10.12.sdk.tar.xz
下載完成之后,Terminal輸入
tar -jxvf MacOSX10.12.sdk.tar.xz
進(jìn)行解壓,可以獲得一個(gè)MacOSX10.11.sdk的目錄,之后我們通過(guò)Finder,在應(yīng)用程序中找到我們Xcode,右鍵顯示包內(nèi)容,進(jìn)入到Xcode里面,之后將我們剛解壓出來(lái)的文件放到Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs目錄下。
安裝Xcode command line tools
xcode-select --install
????5. 其他依賴(lài)庫(kù)安裝
官方推薦用MacPorts來(lái)安裝,需要從MacPorts官網(wǎng)安裝一個(gè)MacPorts,MacPorts官網(wǎng),安裝完之后將其配置到環(huán)境變量之中,也就是將export PATH=/opt/local/bin:$PATH配置到~/.bash_profile最后一行。
之后安裝?gmake libsdl git gnupg?bison,通過(guò)Terminal輸入
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg?bison
回車(chē)后即可進(jìn)行安裝,首次可能會(huì)出現(xiàn)更新的問(wèn)題,需要根據(jù)其給出的提示進(jìn)行相應(yīng)的操作。
如果出現(xiàn)Port gmake not found的錯(cuò)誤的話(huà),可以先執(zhí)行
sudo port -d sync
當(dāng)然如果用其他包管理器可以下載到?gmake libsdl git gnupg?bison 的話(huà)也是可以的。
二. AOSP源碼下載
????對(duì)于在國(guó)內(nèi)的開(kāi)發(fā)者來(lái)說(shuō),使用國(guó)內(nèi)的鏡像站下載源碼是個(gè)不錯(cuò)的選擇,我們這里推薦清華鏡像站
其為我們提供了初始化包的下載方式,一開(kāi)始我們可以不需要使用repo進(jìn)行拉取代碼,對(duì)于這個(gè)初始化包我們有兩種下載方式:
????一種是使用其官網(wǎng)提供的方法,首先打開(kāi)終端Terminal,定位到需要存放源碼的目錄,輸入
wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下載初始化包
?????按回車(chē)后,就會(huì)從鏡像站下載資源包,需要注意的是,這個(gè)包大小有40多G,所以下載過(guò)程需要花費(fèi)非常漫長(zhǎng)的時(shí)間,另外不支持?jǐn)帱c(diǎn)續(xù)傳。
?????另外一種下載方式是使用第三方下載器,比如使用迅雷,直接在下載地址中輸入https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,即可進(jìn)行下載。
?????這里推薦使用第二種方式,主要是速度快,而且支持?jǐn)帱c(diǎn)續(xù)傳,非常方便。下載完成之后,我們會(huì)獲得一個(gè)aosp-latest.tar的文件,這是源碼的壓縮包。
三. 代碼同步更新
?我們將aosp-latest.tar放到大小寫(xiě)敏感的文件系統(tǒng)中,使用tar命令進(jìn)行解壓
tar xf aosp-latest.tar
cd?AOSP
可以獲得一個(gè)AOSP目錄,里面包含一個(gè)隱藏的.repo目錄,我們需要將鏡像站的地址更新到里面的配置文件中。打開(kāi).repo/manifest.xml,找到里面的
<remote name="aosp"
? ? ? ?fetch="https://android.googlesource.com"
? ? ? ?review="android-review.googlesource.com"/>
將? ?fetch="https://android.googlesource.com" 改成?fetch="https://aosp.tuna.tsinghua.edu.cn"
另外,打開(kāi).repo/manifests.git/config,將url = https://android.googlesource.com/platform/manifest 修改為url = https://aosp.tuna.tsinghua.edu.cn/platform/manifest。
做完這些之后,我們將Terminal定位到AOSP目錄,輸入
repo sync
注意:使用清華鏡像的需要注意的是,因?yàn)槲覀冇行薷膍anifest文件,而.repo整個(gè)文件也是通過(guò)git進(jìn)行管理的,所以首次sync會(huì)提示文件沒(méi)有commit,所以需要先到.repo目錄下執(zhí)行g(shù)it 的 add、commit操作。
sync操作需要一個(gè)漫長(zhǎng)到等待過(guò)程,成功后就可以在A(yíng)OSP目錄看到最新的源碼資源。
使用Repo一個(gè)比較好的地方是,即使更新中途斷網(wǎng)了也沒(méi)關(guān)系,因?yàn)槠溆杏洃浌δ埽匦螺斎朐撁睿瑫?huì)跳過(guò)已經(jīng)更新的資源。
四. 查看和切換分支
在A(yíng)OSP目錄下,我們可以用repo來(lái)查看當(dāng)前所有可切換的分支,輸入
cd .repo/manifests
git branch -a | cut -d / -f 3
可以列出所有的分支
從中選擇android-8.1.0_r7,進(jìn)行切換,切換的命令如下
repo init -b?android-8.1.0_r7
repo sync
之后花費(fèi)一些時(shí)間等待切換即可。
五. 編譯
編譯需要執(zhí)行一下幾個(gè)過(guò)程
1. 進(jìn)入到AOSP目錄,執(zhí)行?
make clobber
這會(huì)清除之前的緩存文件。
2. 之后執(zhí)行
source build/envsetup.sh
初始化一些環(huán)境變量
3. 接下來(lái)輸入
lunch aosp_arm-eng
選擇目標(biāo)編譯版本。
如果不想使用該版本的話(huà),我們可以直接輸入lunch,其會(huì)提示所有的可以編譯的版本。
4. 編譯
make -j4
輸入該命令后就會(huì)開(kāi)始執(zhí)行編譯,整個(gè)過(guò)程會(huì)持續(xù)1~2個(gè)小時(shí),請(qǐng)耐心等待。
六. 運(yùn)行
直接在A(yíng)OSP目錄下運(yùn)行
emulator
七. 問(wèn)題記錄處理
? ? 1. bison bug
? ? 我們?cè)诰幾g的時(shí)候可能會(huì)遇到的一個(gè)問(wèn)題,這是AOSP源碼里面的一個(gè)問(wèn)題,解決方法是通過(guò)Terminal
cd? external/bison
git cherry-pick c0c852bd6fe462b148475476d9124fd740eba160
mm
完成后回到AOSP目錄執(zhí)行
cp out/host/darwin-x86/bin/bison? prebuilts/misc/darwin-x86/bison/
之后執(zhí)行make -j4就能正常編譯
該問(wèn)題在?https://groups.google.com/forum/#!msg/android-building/D1-c5lZ9Oco/hPBVZ0ElEAAJ 中有討論到。