2021-05-12 14:32:11
macOS Mojave 10.14.4 下 Android 8.1原始碼編譯詳解
第0步:版本選擇
AOSP版本選擇很重要,如果選錯了,會造成編譯失敗等各種問題,編譯AOSP對Xcode的版本是有要求的;
比如:AOSP6.0-7.0,要求Xcode的版本是8.3,然而在MacOS 10.14上面是不支援Xcode8.3的這就很尷尬;
由於現在大家的Mac環境基本是更新到最新的10.14了,所以這裡推薦大家選擇Android-8.1.0_r1。
編譯環境:
- OS: macOS Mojave 10.14.4
- JDK: 1.8.0_144
- Xcode: 10.2.1
- XcodeSDK: 10.11
- AOSP: android-8.1.0_r15
- Git: 2.21.0
第一步:建立區分大小寫的磁碟映像
由於Mac OS的檔案系統預設是不區分大小寫的,Git 並不支援此類檔案系統,而且此類檔案系統會導致某些 Git 命令(例如 git status)的行為出現異常,所以我們需要在區分大小寫的檔案系統中對 AOSP 原始檔進行操作。
通過 shell 使用以下命令建立磁碟映像:
# hdiutil create -type SPARSE -fs'Case-sensitive Journaled HFS+' -size 150g ~/android.dmg
這裡設定分配150g的大小,這將建立一個 .dmg(也可能是 .dmg.sparseimage)檔案,該檔案在裝載後可用作具有 Android 開發所需格式的儲存卷。
如果您以後需要更大的儲存卷,還可以使用以下命令來調整稀疏映像的大小:
# hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
雙擊生成的.dmg.sparseimage檔案,就會看到掛載的磁碟了,之後所有操作都在這個磁碟分割區中進行,您可以像對待外接硬碟一樣將其彈出(解除安裝)。
如果你喜歡在命令列中掛載/解除安裝分割區,可以向 ~/.bash_profile 中新增輔助函數:
# mount the android file image
functionmountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }
# unmount the android file image
functionumountAndroid() { hdiutil detach /Volumes/android; }
注意檔名路徑是否一致,要使.bash_profile設定生效,需要:
#source ~/.bash_profile
之後你就可以在命令列中通過mountAndroid和unmountAndroid來操作了。
第二步:安裝所需的程式包
安裝 Xcode 命令列工具:
一般在安裝Xcode的時候會自動安裝命令列工具,這裡保險起見,檢查一下:
# xcode-select--install
通過 macports.org 安裝 MacPorts。
將以下內容新增到~/.bash_profile中
export PATH=/opt/local/bin:$PATH
通過 MacPorts 獲取 Make、Git 和 GPG 程式包:
# POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
如果您使用 Mac OS X v10.4,還需要安裝 bison:
# POSIXLY_CORRECT=1 sudo port install bison
設定檔案描述符數量上限
在 Mac OS 中,可同時開啟的檔案描述符的預設數量上限太低,在高度並行的編譯流程中,可能會超出此上限。
要提高此上限,請將下列行新增到 ~/.bash_profile 中:
# set the number of open files to be 1024
ulimit -S -n1024
第三步:下載原始碼
安裝Repo
Repo 是一款工具,可讓您在 Android 環境中更輕鬆地使用 Git.
直接執行下面的命令:
# curl https://storage.googleapis.com/git-repo-downloads/repo > ~/repo
會在主目錄下生成repo檔案,接著給他賦予可執行的許可權:
# chmod a+x ~/repo
為了可以方面的使用repo命令,我們把它移動到/opt/local/bin裡面,因為這個路徑我們在上一步中已經加入到PATH了,所以我們可以在任何一個地方執行repo命令;
# mv ~/repo /opt/local/bin
同步原始碼
進入第一步中建立好的分割區,建立工作目錄:
# mkdir aosp
#cd aosp
repo的執行過程中會嘗試存取官方的git源更新自己,如果想使用tuna的映象源進行更新,可以將如下內容複製到你的~/.bash_profile裡:
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
設定Git使用者名稱和郵箱:
# gitconfig --global user.name"Your Name"
# gitconfig --global user.email"you@example.com"
初始化repo,這裡採用清華大學的映象,並設定分支android-8.1.0_r15:
#repoinit-uhttps://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r15
最後一步:
# repo sync
原始碼同步過程中常常會因為網路因素而斷開,如果斷開了繼續執行repo sync命令即可,直到下載完成。
漫長的等待......
下載完成後差不多佔用70G大小,因為我們後續不需要再進行分支切換與同步,所以我們可以把目錄下的.repo資料夾給刪除了,畢竟Mac的SSD容量寶貴,刪除之後你會發現硬碟大小沒有釋放,這就有點尷尬了,這個問題目前也沒找到解決的辦法,我的方法是按照第一步建立一個新的分割區,把內容拷貝進去,然後把舊的分割區刪了,這樣空間就釋放了。
編譯原始碼
優化編譯環境 設定 ccache
要使用 ccache,請在原始碼樹的根目錄下執行以下命令:
#export USE_CCACHE=1
#export CCACHE_DIR=/<path_of_your_choice>/.ccache
#prebuilts/misc/darwin-x86/ccache/ccache -M 50G
注意<path_of_your_choice>是你原始碼下載的根目錄。
最後請將以下內容新增到 .bash_profile(或等同檔案)中:
export USE_CCACHE=1
設定ANDROID_Java_HOME環境變數
在~/.bash_profile中新增以下內容,前提必須是安裝了JDK1.8:
export ANDROID_JAVA_HOME=$(/usr/libexec/java_home -v1.8)
設定XcodeSDK的版本
執行以下命令,開啟組態檔:
# vi build/soong/cc/config/x86_darwin_host.go
檢視darwinSupportedSdkVersions,這裡列出了支援的sdk版本:
darwinSupportedSdkVersions = []string{ "10.10", "10.11", "10.12", }
接著我們進入以下目錄檢視現有的XcodeSDK版本:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
這裡我們選擇10.11的版本,如果沒有MacOSX10.11.sdk則去MacOSX-SDKs 中下載一個,解壓到該目錄,並把其他版本的刪除,確保只保留一個就行了。
開始編譯
首先要把shell切換到bash(如果你使用的是zsh)
#chsh -s /bin/bash
初始化環境:
#source build/envsetup.sh
選擇編譯的分支:
#lunch
會出現以下列表:
Lunch menu... pick a combo: 1. aosp_arm-eng 2. aosp_arm64-eng 3. aosp_mips-eng 4. aosp_mips64-eng 5. aosp_x86-eng 6. aosp_x86_64-eng 7. aosp_car_arm-userdebug 8. aosp_car_arm64-userdebug 9. aosp_car_x86-userdebug 10. aosp_car_x86_64-userdebug ......
Which would you like? [aosp_arm-eng]
要求輸入對應的數位:
如果你想在你的Nexus上裝置執行,請參照官方裝置對應列表選擇;
如果你只想在本機的虛擬機器上執行,Mac系統的話選擇aosp_x86-eng即可。
最後一步,編譯:
#make -j6
通過-jN引數來設定編譯的並行任務數,以提高編譯速度,在此前我的CPU核心數為6,這裡N值最好選在6到12之間,這裡我們設定6個並行任務進行編譯。
這裡需要注意的是,每次退出再進入命令列要執行以上命令之前,都要先執行:
#source build/envsetup.sh
編譯中遇到的問題
問題1:Jack編譯報錯:communication error with Jack server
原因:JACK編譯器不支援多使用者同時編譯,其他使用者在編譯,埠被占用。
解決方法:
如下:修改以下兩個組態檔中的埠號server.service.port和server.admin.port,比如都改為8096/8097:
- ~/.jack-settings
- ~/.jack-server/config.properties
注意:
兩個檔案中的埠號必須一致。
修改後的埠號必須是沒有被使用的。
問題2: 出現Try increasing heap size with java option '-Xmx'
原因: 出現這個錯誤是由於電腦記憶體不足;
解決方法:在命令列分別執行以下三條語句,然後繼續編譯;
#export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
# ./prebuilts/sdk/tools/jack-adminkill-server
# ./prebuilts/sdk/tools/jack-admin start-server
問題3: BISON_PKGDATADIR=external/bison/data prebuilts/misc/darwin-x86/bison/bison -d
在log中出現BSION等字樣;
原因:網上說這個bsion的一個bug;
解決方法:拉取新的分支,重新編譯 bison:
#cd external/bison
#git cherry-pick c0c852bd6fe462b148475476d9124fd740eba160
如果這步驟發生錯誤了(比如之前刪除了.repo資料夾)
這時候我們就把bison這個資料夾刪除,下載一個新的:
wgethttps://android.googlesource.com/platform/external/bison/+archive/c0c852bd6fe462b148475476d9124fd740eba160.tar.gz
解壓後進入bison資料夾,執行:
# mm
# cp out/host/darwin-x86/bin/bison prebuilts/misc/darwin-x86/bison/
結束
最後一切順利的話,經過漫長的編譯後,最終會出現以下畫面則說明編譯Android系統成功了???
相關文章