Android8.1源碼編譯實踐(Mac)

第0步:版本選擇

AOSP版本選擇很重要,若是選錯了,會形成編譯失敗等各類問題,編譯AOSP對Xcode的版本是有要求的;html

好比:AOSP6.0-7.0,要求Xcode的版本是8.3,然而在MacOS 10.14上面是不支持Xcode8.3的這就很尷尬;
因爲如今你們的Mac環境基本是更新到最新的10.14了,因此這裏推薦你們選擇android-8.1.0_r1。

編譯環境:java

  • 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 源文件進行操做。android

經過 shell 使用如下命令建立磁盤映像:git

# hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 150g ~/android.dmg

這裏設置分配150g的大小,這將建立一個 .dmg(也多是 .dmg.sparseimage)文件,該文件在裝載後可用做具備 Android 開發所需格式的存儲卷。github

若是您之後須要更大的存儲卷,還可使用如下命令來調整稀疏映像的大小:shell

# hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage

雙擊生成的.dmg.sparseimage文件,就會看到掛載的磁盤了,以後全部操做都在這個磁盤分區中進行,您能夠像對待外接硬盤同樣將其彈出(卸載)。api

若是你喜歡在命令行中掛載/卸載分區,能夠向 ~/.bash_profile 中添加輔助函數:xcode

# mount the android file image
function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }
# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }

注意文件名路徑是否一致,要使.bash_profile配置生效,須要:bash

# 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 -n 1024

第三步:下載源代碼

安裝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用戶名和郵箱:

# git config --global user.name "Your Name"
# git config --global user.email "you@example.com"

初始化repo,這裏採用清華大學的鏡像,並設置分支android-8.1.0_r15:

#repo init -u https://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 -v 1.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:

  1. ~/.jack-settings
  2. ~/.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-admin kill-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這個文件夾刪除,下載一個新的:

wget https://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系統成功了。
Xnip2019-05-18_22-22-31

相關文章
相關標籤/搜索