MacOS X 編譯Android源碼

MacOS X 編譯Android源碼

  • 本篇文章已受權微信公衆號 guolin_blog (郭霖)獨家發佈

因爲在工做中遇到了不少關於android內部實現的問題,雖而後面都解決了,有些是看了源碼實現,有些源碼看不了只能去google,百度。這就致使了對於不少的問題實際上是知其然不知其因此然,因此從如今開始我下定決心開始學習Android的源碼。那說到源碼就必須提到編譯源碼這件事情。
最開始是在個人MBP上面安裝了linux的雙系統準備在ubuntu上面來安裝編譯源碼,不過這個方法有個弊端就是查看源碼的過程真是爽翻天啊,因此開始搗鼓再mac上面編譯源碼php

在google了一些方法以後發現比較混亂以致於難以完成,因此此次使用官方的方法來完成源碼的編譯。

那麼如今開始了:html


1. 系統要求

Mac OS (Intel/x86)java

  • Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本,具備 Xcode 4.5.2 和命令行工具python

  • Android 5.x (Lollipop):Mac OS v10.8 (Mountain Lion),具備 Xcode 4.5.2 和命令行工具linux

  • Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat):Mac OS v10.6 (Snow Leopard) 或 Mac OS X v10.7 (Lion),以及 Xcode 4.2(Apple 的開發者工具)android

  • Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich):Mac OS v10.5 (Leopard) 或 Mac OS X v10.6 (Snow Leopard),以及 Mac OS X v10.5 SDKgit


2. JDK

這裏會須要註冊一個 甲骨文的帳號github


3. 主要程序包

  • python
  • gmake
  • git

gmake 後面會下載的,你只須要安裝好python2.7 然而通常python是安裝好的shell


4. 搭建編譯環境

4.1. 建立區分大小寫的磁盤映像

您可使用磁盤映像在現有的 Mac OS 環境中建立區分大小寫的文件系統。要建立磁盤映像,請啓動磁盤工具,而後選擇「新建映像」。完成編譯至少須要 25GB 空間;更大的空間可以更好地知足將來的需求。使用稀疏映像有助於節省空間,並且之後能夠隨着需求的增長進行擴展。請務必選擇「Case sensitive, Journaled」存儲卷格式。macos

我推薦使用這種方式來創建磁盤映像

您也能夠經過 shell 使用如下命令建立磁盤映像:
# hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
這將建立一個 .dmg(也多是 .dmg.sparseimage)文件,該文件在裝載後可用做具備 Android 開發所需格式的存儲卷。
若是您之後須要更大的存儲卷,還可使用如下命令來調整稀疏映像的大小:
# hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
對於存儲在主目錄下的名爲 android.dmg 的磁盤映像,您能夠向 ~/.bash_profile 中添加輔助函數:
要在執行 mountAndroid 時裝載磁盤映像,請運行如下命令:
# mount the android file image
function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }
注意:若是系統建立的是 .dmg.sparseimage 文件,請將 ~/android.dmg 替換成 ~/android.dmg.sparseimage。
要在執行 umountAndroid 時卸載磁盤映像,請運行如下命令:
# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }
裝載 android 存儲卷後,您將在其中開展全部工做。您能夠像對待外接式存儲盤同樣將其彈出(卸載)。


4.2. 安裝Xcode

你只須要在AppStore 裏面安裝Xcode就能夠了。
以後須要運行一下命令

$ xcode-select --install

或者你也能夠選擇直接運行命令,不過我不推薦,下個xcode有好處的哦


4.3. 安裝MacPorts

下載連接 根據本身的系統來選擇

  • 編輯.bash_profile,若是沒有就新建(不用特地操做,vi能夠自動生成的)

vi ~/.bash_profile

vi的小提示,按i切換到insert模式就是編輯模式,按esc退出編輯模式,按:wq 保存退出
複製 export PATH=/opt/local/bin:$PATH 到文件中。

輸入source ~/.bash_profile 使命令生效


4.4. 經過 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 中:
ulimit -S -n 1024

4.5. 設置ccache

  • 在源代碼的根目錄下執行如下命令

export USE_CCACHE=1
export CCACHE_DIR=/<path_of_your_choice>/.ccache


5. 下載源代碼

5.1. 安裝repo

  • 確保主目錄下有一個 bin/ 目錄,而且該目錄包含在路徑中

mkdir ~/bin
PATH=~/bin:$PATH

(要在~/.bash_profile中添加;輸入source ~/.bash_profile 使命令生效)

  • 下載 Repo 工具,並確保它可執行

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

5.2. 初始化repo客戶端

必須使用以前建立的區分大小寫的文件系統,通常掛載的新的盤是在/Volumes/ 路徑下的
我分出來的區分大小寫的文件系統名字是Android 因此我cd進去就ok了

  • 建立一個目錄 mkdir XXX (XXX 是你本身取得名字)
  • cd XXX

若是遇到repo: command not found 問題 請在初始工做目錄輸入
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
export PATH=$PATH:$HOME/bin

5.3. 配置git信息

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

5.4. 初始化repo

repo init -u https://android.googlesource.com/platform/manifest

  • P.S. 此時須要,若是不能沒有關係,咱們能夠經過其餘的鏡像來完成這一步操做

5.5. 清華鏡像下載

清華鏡像 首先咱們能夠看到

2016-06-24 : 關閉 git:// 協議,僅支持 HTTPS

因此咱們是沒法使用repo來同步代碼的,因此咱們要這麼作:

tar xf aosp-latest.tar 解壓的目錄

cd aosp

repo sync

此後,每次只需運行 repo sync 便可保持同步。 咱們強烈建議您保持天天同步,並儘可能選擇凌晨等低峯時間

5.6.科大鏡像下載

科大鏡像

科大鏡像沒有去掉git協議,因此咱們能夠順暢的完成下載按照頁面提示的操做便可


6. 編譯準備工做

對於運行帶標記的 AOSP 版本分支的受支持設備,您能夠從 Google 的 Nexus 驅動程序頁面下載相關的官方二進制文件。有了這些二進制文件,您將有權使用採用非開放源代碼的其餘硬件功能。要編譯 AOSP 的 master 分支,請使用 Nexus 設備的二進制文件預覽。在針對某種設備編譯 master 分支時,請使用適用於最新編號版本的二進制文件或具備最新日期的二進制文件。

  • 解壓縮下載的文件將會獲得一個sh的文件經過終端sh xxx.sh運行

此處須要agree用戶協議,你只須要按住向下鍵,就能夠劃到最後輸入 I ACCEPT 就能夠了。

  • sh運行完成以後會獲得一個vendor文件夾,將其複製到源代碼的根目錄下

  • 清理
    爲了確保新安裝的二進制文件在解壓後會被適當考慮在內,請使用如下命令刪除全部之前編譯操做的已有輸出:make clobber

6.1. 設置環境

  • 使用 envsetup.sh 腳本初始化環境

source build/envsetup.sh

6.2. 選擇目標

  • 使用 lunch 選擇要編譯的目標。

lunch
而後會出現對應的列表選擇其中某個數字便可

該命令表示針對模擬器進行完整編譯,而且全部調試功能均處於啓用狀態。
若是您沒有提供任何參數就運行命令,lunch 將提示您從菜單中選擇一個目標。
全部編譯目標都採用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能組合的代號。
BUILDTYPE 是如下類型之一

編譯類型 使用狀況
user 權限受限;適用於生產環境
userdebug 與「user」相似,但具備 root 權限和可調試性;是進行調試時的首選編譯類型
eng 具備額外調試工具的開發配置
  • 因爲本人有一個nexus 5x 的手機 ,因此準備在nexus5x 的手機上運行本身編譯的代碼,因此我選擇的編譯命令爲aosp_bullhead-userdebug

若是想要針對真機調試,請參閱運行版本進行命令選擇。我在這裏不建議初次接觸源碼編譯的人進行真機調試,刷磚了就gg了。

6.3. 編譯代碼

您可使用 make 編譯任何代碼。GNU Make 能夠藉助 -jN 參數處理並行任務,一般使用的任務數 N 介於編譯時所用計算機上硬件線程數的 1-2 倍之間。例如,在一臺雙核 E5520 計算機(2 個 CPU,每一個 CPU 4 個內核,每一個內核 2 個線程)上,要實現最快的編譯速度,可使用介於 make -j16 到 make -j32 之間的命令。

make -j4

  • 請注意,本部分只是一個摘要,用於確保設置已完成。如需關於編譯 Android 的詳細說明,請參閱運行編譯系統

編譯過程當中遇到的問題

  • xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
    Answer:

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer


  • build/core/combo/mac_version.mk:26: none of the installed SDKs (wifi-serviceac_sdk_versions_installed) match supported versions (10.8 10.9 10.10 10.11), trying 10.8
    緣由boxen的版本過低了須要更新

https://github.com/boxen/our-boxen 根據此處進行更新

  • no SDK 10.8 at /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk, trying legacy dir
    build/core/combo/mac_version.mk:40: *****************************************************
    build/core/combo/mac_version.mk:41: * Can not find SDK 10.8 at /Developer/SDKs/MacOSX10.8.sdk
    build/core/combo/mac_version.mk:42: *****************************************************

經過查看build/core/combo/mac_version.mk文件咱們能夠看到
mac_sdk_versions_supported := 10.8 10.9 10.10 10.11 而我電腦是10.12版本的因此我加了個10.12在這句話以後 就能夠了

咱們須要下載一個MacOSX10.11.sdk放到這個目錄中。 ReleasePage由於10.12這個版本的sdk中syscall這個方法被棄用了,因此咱們須要換回11這個版本的sdk

  • could not find jdk tools.jar at /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/../lib/tools.jar, please check if your JDK was installed correctly. Stop.
    在~/.bash_profile 中添加 export ANDROID_JAVA_HOME=$JAVA_HOME
  • system/core/libcutils/threads.c:38:10: error: 'syscall' is deprecated: first deprecated in OS X 10.12 - syscall(2) is unsupported; please switch to a supported interface. For SYS_kdebug_trace use kdebug_signpost(). [-Werror,-Wdeprecated-declarations]

咱們須要下載一個MacOSX10.11.sdk解壓後放到這個目錄中Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/

  • external/doclava/src/com/google/doclava/Converter.java:407: 錯誤: 找不到符號
    m.isAbstract(), m.isSynchronized(), m.isNative(), m.isDefault(), true,
    ^
    符號: 方法 isDefault()
    位置: 類型爲AnnotationTypeElementDoc的變量 m

應該是jdk版本不對 你須要查看你在安裝過程當中哪裏使用了1.7版本的jdk 能夠經過查看java -versionjavac -version 來查看

  • Communication error with Jack server (52). Try 'jack-diagnose'

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

  • Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@googl

修改文件 prebuilts/sdk/tools/jack-admin 修改這個語句加上-Xmx4096m ----> JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"

  • frameworks/base/tools/aidl/aidl_language_l.l:55: warning, rule cannot be matched

https://blog.csdn.net/xljxiang/article/details/83044067

  • abuild/core/base_rules.mk:238: error: external/googletest/googletest: MODULE.TARGET.STATIC_LIBRARIES.libgtest already defined by external/googletest/googletest.

unset NDK_ROOT


7.0 刷機

終於build完成了 真是歷經千幸萬苦啊。

首先第一步 在源代碼的更目錄下輸入

sudo adb reboot bootloader

(若是發現沒有成功請從新輸入6.1和6.2的步驟)
而後你就會到達這個界面

刷機界面

fastboot oem unlock輸入這個命令 而後經過音量鍵選擇yes 經過待機鍵確認

再而後輸入

fastboot flashall -w

  • 出現錯誤error: could not load android-info.txt: No such file or directory

export ANDROID_PRODUCT_OUT=/Volumes/android/android-7.1.1_r24/out/target/product/generic (請替換你本身的目錄)

  • 出現錯誤error: could not load boot.img

你會發現沒有boot.img 這個文件 這時候你只須要 make bootimage 就會生成對應的文件

相關文章
相關標籤/搜索