1. 程式人生 > >Mac 10.12 編譯 Android 原始碼

Mac 10.12 編譯 Android 原始碼

Android 原始碼系列文章:

環境準備

這裡只講 Mac 10.12 的環境配置, 其他的我沒有嘗試過, 不好描述

我們需要的編譯的是 Android6.0, 所以我們需要 Xcode , Command Line Tool 以及 JDK 7

關於 Xcode 的版本問題, 上面說的是4.5.2 ,其實在 Max 10.12 上是根本安裝不了這麼低的版本的.
我這邊使用的是 Xcode 8, 同樣編譯成功, 所以 Xcode 版本不是問題

根據官方文件, 我們還需要安裝一些其他的依賴

安裝 Xcode command line tools :

xcode-select --install

這個一般 Mac 使用者都裝過

安裝 MacPorts

安裝完後, 需要配置環境變數如下:

export PATH=/opt/local/bin:$PATH

將上面這句話, 複製到.bash_profile 中即可.

通過 MacPorts 安裝其他依賴

在 terminal 中執行如下命令即可

POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

設定同時開啟檔案數量限制

ulimit -S -n 1024

將上面這句話, 複製到.bash_profile 中即可.

到這裡官網文件上說的相關環境配置已經安裝好了. 接下來可以嘗試去編譯看看

第一次編譯

我們在 Android 原始碼目錄下執行如下清理命令:

make clobber

如果按照上面的配置的話, 會出現如下錯誤:

build/core/combo/mac_version.mk:38: *****************************************************
build/core/combo/mac_version.mk:39: * Can not find SDK 10.6 at /Developer/SDKs/MacOSX10.6.sdk
build/core/combo/mac_version.mk:40: *****
************************************************ build/core/combo/mac_version.mk:42: *** Stop.. Stop. ** Don't have a product spec for: 'aosp_x86' ** Do you have the right repo manifest?

我前面說過, 我們使用 Xcode 8 是沒有問題的, 但是這裡提示我們缺少相應的 MacOsX sdk
這個 sdk 的目錄在 Xcode 的應用程式包裡面, 目錄如下:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs

我們編譯的是 Android 6.0 可以下 10.9 10.10 10.11 的都可以, 我嘗試或10.9 和 10.11 的都編譯通過了.

我們把 sdk 下下來, 解壓, 並且放到 Xcode 的相應目錄下面. 然後建立 名為MacOSX10.11.sdk 的快捷方式入下圖:

只要執行如下命令即可

sudo ln -s MacOSX10.11 MacOSX10.11.sdk

加入 MacOSX 的 sdk 後, 我們還需要修改一個檔案, 位置如下

原始碼目錄/build/core/combo/mac_version.mk

我們開啟這個檔案, 發現是一些mac 的環境校驗
這個檔案我們只要修改一行, 修改為下圖那樣子就可以了:

自此 Mac 編譯 Android 原始碼的環境配置算是真的結束了.

第二次編譯

清理

我們在 Android 原始碼目錄下執行如下清理命令:

make clobber

沒有任何異常

設定環境

source build/envsetup.sh

沒有任何異常

選擇編譯目標

lunch

執行 lunch 命令後, 會輸出一個列表讓我們選擇

我這邊是計劃, 吧編譯好的 rom 直接刷到 N5手機上的, 所以這裡我選了 aosp_hammerhead_userdebug

這裡來簡單說一說 列表中各項是什麼意思,

其實 lunch命令的格式是 lunch BUILD-BUILDTYPE 如果我們後面沒有輸入BUILD-BUILDTYPE 則會彈出一個列表讓我們選擇

我們就以aosp_hammerhead_userdebug 來看BUILD-BUILDTYPE

aosp_hammerheadBUILD
userdebugBUILDTYPE

hammerhead 其實是 N5 手機的別名, 所以這裡我才會選這個

什麼是BUILD

BUILD指的是特定功能的組合的特定名稱,即表示編譯出的映象可以執行在什麼環境.其中,aosp(Android Open Source Project)代表Android開源專案;arm表示系統是執行在arm架構的處理器上,arm64則是指64位arm架構;處理器,x86則表示x86架構的處理器;此外,還有一些單詞代表了特定的Nexus裝置,下面是常用的裝置程式碼和編譯目標,更多參考官方文件

什麼是BUILDTYPE

BUILD指的是特定功能的組合的特定名稱,即表示編譯出的映象可以執行在什麼環境.其中,aosp(Android Open Source Project)代表Android開源專案;arm表示系統是執行在arm架構的處理器上,arm64則是指64位arm架構;處理器,x86則表示x86架構的處理器;此外,還有一些單詞代表了特定的Nexus裝置,下面是常用的裝置程式碼和編譯目標,更多參考官方文件

裝置型號 裝置程式碼 編譯目標
Nexus 6P angler aosp_angler-userdebug
Nexus 5X bullhead aosp_bullhead-userdebug
Nexus 6 shamu aosp_shamu-userdebug
Nexus 5 hammerhead aosp_hammerhead-userdebug

如果不需要刷入到手機上的話,選擇 arm 或者 x86 的即可

開始編譯

通過make指令進行程式碼編譯,該指令通過-j引數來設定參與編譯的執行緒數量,以提高編譯速度.比如這裡我們設定8個執行緒同時編譯:

make -j8

參與編譯的執行緒並不是越多越好,通常是根據你機器cup的核心來確定:core*2,即當前cpu的核心的2倍.
比如我的 mac 是4核心 4執行緒的, 所有使用8個執行緒編譯最好

編譯一個多小時後, 看到 ### make completed successfully (01:18:45(hh:mm:ss)) 表示編譯成功了, 如下圖:

執行模擬器

如果我們之前選擇的是 aosp_arm_eng 這些的話, 那麼可以直接執行如下命令啟動虛擬機器

source build/envsetup.sh
lunch(選擇剛才你設定的目標版本,比如這裡了我選擇的是2)
emulator

如果我們是編譯後立即執行虛擬機器的話, 由於之前執行過 source 和 lunch 命令, 這裡只需要執行 emulator命令

我這邊選擇的是 aosp_hammerhead-userdebug 電腦環境不對, 等了好久, 也沒看到開機介面.

下載驅動

原始碼編譯好後, 接下來我們需要吧 rom 刷入到 N5 手機上了.

別急著刷, 這裡我們還需要針對我們的 AOSP 版本, 選擇 N5 手機的相應驅動.

我們下載的是 android-6.0.1_r77

看上圖, 編號是M4B30Z

我們把上面三個檔案下載下來, 並解壓到原始碼目錄下,
其實就是三個 shell 指令碼檔案, 如下圖:

然後我們在 termianl 中依次執行者三個檔案,例如:

$ ./extract-broadcom-hammerhead.sh

The license for this software will now be displayed.
You must agree to this license before using this software.

Press Enter to view the licensels

回車後檢視license,翻到license最後,輸入I ACCEPT後回車,這時會將驅動檔案釋放到vendor目錄。
依次將驅動搞定之後,按照前面的步驟再次編譯, 這次編譯會很快的, 別急.

開始刷機

再次編譯完後, 開始使用 fastboot 刷機了
插上手機, 執行如下命令:

#手機連上電腦的情況下
adb reboot bootloader
#cd 到原始碼編譯輸出的目錄
fastboot -w flashall

等一會, 手機刷完重啟後就是自己的編譯的 Android 系統了