手把手教你在Mac OS下載榔至、編譯及導入Android源碼


1. 要求

1.1 硬件

  • 160g可用磁盤空間。

筆者編譯的是Android 9.0源碼欺劳,下載下來后將近40g洛退,編譯后153g,所以至少需要160g可用磁盤空間杰标。

看網(wǎng)上有別人下載編譯7.1.1版本的源碼兵怯,編譯下來需要67g,則可用磁盤空間至少需要分配80g腔剂。

注:在編譯過程中媒区,如果由于磁盤空間不足導致編譯失敗,可重新調(diào)整磁盤大小掸犬,然后接著之前的進度繼續(xù)編譯袜漩,所以此處看個人編譯的版本,但至少要保證可用磁盤不能太小湾碎。

1.2 軟件

1.2.1 編譯的Android版本與需要的Mac OS版本
  • Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本宙攻,具有 Xcode 4.5.2 和命令行工具
  • Android 5.x (Lollipop) :Mac OS v10.8 (Mountain Lion),具有 Xcode 4.5.2 和命令行工具
  • 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 的開發(fā)者工具)
  • 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 SDK
1.2.2 JDK

2. 準備工作

2.1 創(chuàng)建分區(qū)大小寫的磁盤映像

Mac OS默認會在不區(qū)分大小寫的文件系統(tǒng)中運行递惋,但由于Git并不支持此類文件系統(tǒng),所以需要在Mac OS上建立一個區(qū)分大小寫的磁盤分區(qū)溢陪。我們這里使用命令行來創(chuàng)建萍虽,一是比較方便,二是后期可擴展形真。

在終端輸入以下命令來創(chuàng)建一個160g大小的磁盤映像:

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

會在當前用戶目錄下生成一個android.dmg.sparseimage文件杉编,可簡單理解為該文件是編譯源碼所需要的驅動盤。

建議在分區(qū)時size指定為160g咆霜,但如果后期不夠邓馒,可以通過該命令來調(diào)整分區(qū)大小围来,例如下面命令調(diào)整為200g:

$ hdiutil resize -size 200g ~/android.dmg.sparseimage

注意:調(diào)整分區(qū)大小的命令班缰,需要在該分區(qū)磁盤映像已卸載的情況下才能生效。

2.2 添加裝載和卸載磁盤分區(qū)的命令和函數(shù)

為了方便裝載和卸載該分區(qū)磁盤映像洽议,我們可以向~/.bash_profile文件中添加如下函數(shù):

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

需要裝載分區(qū)磁盤映像時偿衰,執(zhí)行如下命令即可挂疆,裝載路徑為/Volumes/android

$ mountAndroid

同樣,卸載的函數(shù)如下下翎,我們也將它添加到~/.bash_profile文件中:

# unmount the android file image
umountAndroid() { hdiutil detach /Volumes/android; }

執(zhí)行如下命令缤言,便可卸載該分區(qū)磁盤映像:

$ umountAndroid

2.3 安裝Xcode和其它軟件包

  1. 安裝Xcode命令行工具:
$ xcode-select --install
  1. 安裝Xcode,直接在AppStore里安裝即可视事。

  2. 安裝MacPortsHomebrew胆萧,MacPorts和Homebrew是軟件包管理工具,可用來直接在終端里安裝俐东、更新和卸載軟件包跌穗。建議二者都安裝,筆者在通過MacPorts安裝gnupg時死活裝不上虏辫,最后通過Homebrew安裝成功:

  3. ~/.bash_profile文件中導入路徑蚌吸,就可以使用port或brew命令來管理軟件包了:

 export PATH=/opt/local/bin:$PATH
 export PATH=/usr/local/bin:$PATH
  1. 安裝gmake、libsdl砌庄、git和gnupg
  • 如果是使用MacPorts羹唠,則執(zhí)行如下命令:
$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
  • 如果是使用Homebrew,則執(zhí)行如下命令:
$ brew install gmake libsdl git gnupg2

2.4 下載Mac OS SDK

由于新版本的Mac OS更新(我這里是10.14.4 Mojave版本)娄昆,導致Android源碼在編譯時可能報如下錯誤:

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]
    return syscall(SYS_thread_selfid);

所以需要下載舊版本的Mac OS SDK佩微,建議下載MacOSX10.11.sdk.tar.xz
版本,解壓到自定義目錄萌焰,然后建立軟鏈接哺眯。例如我放在~/lib目錄下,再給它創(chuàng)建一個軟鏈接扒俯,可以避免下次Mac OS或Xcode升級的時候被刪除:

$ sudo ln -s ~/lib/MacOSX10.11.sdk /Applications/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk

2.3 設置文件描述符數(shù)量上限

在 Mac OS 中奶卓,可同時打開的文件描述符的默認數(shù)量上限太低一疯,在高度并行的編譯流程中,可能會超出此上限寝杖。要提高此上限,請將下列行添加到 ~/.bash_profile 中:

# set the number of open files to be 1024
ulimit -S -n 1024

至此互纯,一切準備工作就緒瑟幕,接下來就是下載源碼的過程了。

3. 下載源碼

3.1 說明

這里參考Google 教程留潦。由于墻的原因只盹,即使我們作為技術人員能翻過去,但使用起來可能還是有各種各樣的問題兔院,所以這里我們可以通過清華大學鏡像站來下載殖卑。

3.2 下載安裝Repo工具

由于Android源碼龐大復雜,所以Google專門開發(fā)了Repo來管理Android源碼庫坊萝,這里不多作介紹孵稽,有興趣可自行閱讀repo工具介紹

按照官方建議十偶,首先在主目錄下有一個 bin/ 目錄菩鲜,并且將該目錄包含在路徑中:

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

然后下載Repo工具,并確保它可執(zhí)行:

$ curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
$ chmod a+x ~/bin/repo

3.3 初始化 Repo 客戶端

在2.2小節(jié)中惦积,我們通過mountAndroid命令裝載了我們分區(qū)后的磁盤映像接校,其裝載路徑為/Volumes/android,所以我們需要在該目錄下進行初始化:

切換到該目錄下狮崩,并且創(chuàng)建一個aosp的工作目錄:

$ cd /Volumes/android/
$ mkdir aosp
$ cd aosp

現(xiàn)在蛛勉,我們的源碼根目錄全路徑為/Volumes/android/aosp

Repo的運行過程中會嘗試訪問官方的git源更新自己睦柴,如果想使用清華的鏡像源進行更新诽凌,可以將如下內(nèi)容復制到你的~/.bashrc(沒有該文件則創(chuàng)建一個)里:

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 init來初始化master分支:

$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

要對master以外的分支進行校驗坦敌,請使用 -b 來指定相應分支皿淋。要查看分支列表,請參閱源代碼標記和版本恬试,筆者這里指定的是android-9.0.0_r35分支:

$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-9.0.0_r35

3.4 下載 Android 源代碼樹

在終端輸入以下命令來下載源碼:

$ repo sync

由于下載源碼過程比較長窝趣,所以最好將你的Mac“系統(tǒng)偏好設置” -> “節(jié)能”里勾選上“防止進入睡眠”,如下圖所示:

image

接下來就是漫長的等待過程了训柴,30多g哑舒,帶寬如果還可以的話,差不多不到兩小時就下載完成了幻馁,會提示:

Syncing work tree: 100%(xxx/xxx), done.

4. 編譯

編譯命令還是在下載源碼的目錄下輸入洗鸵,即/Volumes/android/aosp越锈。

4.1 切換bash

由于Android編譯只能使用bash,所以你如果使用zsh等其它的shell膘滨,需要切換至bash甘凭,切換命令如下:

$ chsh -s /bin/bash

然后重啟終端才能生效。

4.2 環(huán)境設置

使用envsetup.sh腳本初始化環(huán)境:

$ source build/envsetup.sh

4.3 選擇編譯目標

輸入lunch火邓,會提示如下:

$ lunch 

You're building on Darwin

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
     11. mini_emulator_arm64-userdebug
     12. m_e_arm-userdebug
     13. m_e_mips-userdebug
     14. m_e_mips64-eng
     15. mini_emulator_x86-userdebug
     16. mini_emulator_x86_64-userdebug
     17. uml-userdebug
     18. aosp_crosshatch-userdebug
     19. aosp_blueline-userdebug
     20. aosp_cf_x86_auto-userdebug
     21. aosp_cf_x86_phone-userdebug
     22. aosp_cf_x86_tablet-userdebug
     23. aosp_cf_x86_tablet_3g-userdebug
     24. aosp_cf_x86_tv-userdebug
     25. aosp_cf_x86_wear-userdebug
     26. aosp_cf_x86_64_auto-userdebug
     27. aosp_cf_x86_64_phone-userdebug
     28. aosp_cf_x86_64_tablet-userdebug
     29. aosp_cf_x86_64_tablet_3g-userdebug
     30. aosp_cf_x86_64_tv-userdebug
     31. aosp_cf_x86_64_wear-userdebug
     32. cf_x86_auto-userdebug
     33. cf_x86_phone-userdebug
     34. cf_x86_tablet-userdebug
     35. cf_x86_tablet_3g-userdebug
     36. cf_x86_tv-userdebug
     37. cf_x86_wear-userdebug
     38. cf_x86_64_phone-userdebug
     39. cf_x86_64_tablet-userdebug
     40. cf_x86_64_tablet_3g-userdebug
     41. cf_x86_64_tv-userdebug
     42. cf_x86_64_wear-userdebug
     43. aosp_marlin-userdebug
     44. aosp_marlin_svelte-userdebug
     45. aosp_sailfish-userdebug
     46. aosp_walleye-userdebug
     47. aosp_walleye_test-userdebug
     48. aosp_taimen-userdebug
     49. hikey-userdebug
     50. hikey64_only-userdebug
     51. hikey960-userdebug

Which would you like? [aosp_arm-eng] 

這里列出了所有的可編譯的目標丹弱。所有編譯目標都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能組合的代號铲咨,BUILDTYPE 是以下類型之一躲胳,表示在什么環(huán)境下運行:

編譯類型 使用情況
user 權限受限;適用于生產(chǎn)環(huán)境
userdebug 與“user”類似纤勒,但具有 root 權限和可調(diào)試性坯苹;是進行調(diào)試時的首選編譯類型
eng 具有額外調(diào)試工具的開發(fā)配置

比如aosp_arm-engBUILDaosp_armBUILDTYPEeng摇天,aosp代表Android開源項目粹湃,arm表示系統(tǒng)是運行在arm架構的處理器上,更多見官方文檔泉坐。

如果你有Pixel或Nexus真機再芋,選擇對應的編譯目標即可,否則我們就選模擬器坚冀,即5.aosp_x86-eng济赎。在上面的Which would you like? [aosp_arm-eng]后面輸入5即可。也直接選擇:

$ lunch 5

$ lunch aosp_x86-eng

4.4 編譯代碼

在編譯之前记某,通過輸入以下命令司训,可以查看你的Mac的CPU核數(shù):

$ sysctl -n machdep.cpu.core_count
4

上面輸出的CPU核數(shù)為4,則可以啟動4個線程來編譯源碼:

$ make -j4

接下來就是漫長的編譯過程液南,一般需要2~3個小時壳猜,如果看到下面的提示,則表示已經(jīng)編譯完成:

#### build completed successfully (02:15:52 (hh:mm:ss)) ####

4.5 運行模擬器

在編譯完成后滑凉,終端里輸入以下命令统扳,便可使用模擬器來運行編譯的版本:

$ emulator

5. Android Studio導入源碼

5.1 編譯idegen模塊

編譯完成之后,運行以下命令畅姊,編譯idegen模塊:

$ mmm development/tools/idegen/

idegen模塊編譯完成后會有如下提示:

#### make completed successfully (46 seconds) ####

此時繼續(xù)運行下面的命令咒钟,會在aosp根目錄生成對應的android.iprandroid.iml IDEA工程配置文件

$ development/tools/idegen/idegen.sh

Read excludes: 17ms
Traversed tree: 218013ms

5.2 導入源碼

啟動Android Studio若未,選擇一個已存在的Android Studio項目朱嘴,然后選中aosp根目錄下的android.ipr文件,如果提示需要你convert,確認convert就行萍嬉。首次導入大概需要20~30分鐘:

image

導入成功后乌昔,在Project Structure中,選擇Modules壤追,刪除所有的依賴磕道,只保留下圖所示。這樣在查看源碼跳轉的時候行冰,不會進入android.jar溺蕉,會直接跳轉至本項目的文件中。

image

現(xiàn)在你可以自由地閱讀源碼了资柔,enjoy it焙贷!

image

參考

Google官方Android源碼編譯教程
清華大學開源軟件鏡像站 - Android 鏡像使用幫助
macOS(Sierra 10.12)上Android源碼(AOSP)的下載撵割、編譯與導入到Android Studio
Android AOSP基礎(二)AOSP源碼下載
Android AOSP基礎(三)Android系統(tǒng)源碼的整編和單編
使用Android Studio導入源碼

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贿堰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啡彬,更是在濱河造成了極大的恐慌羹与,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庶灿,死亡現(xiàn)場離奇詭異纵搁,居然都是意外死亡,警方通過查閱死者的電腦和手機往踢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門腾誉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峻呕,你說我怎么就攤上這事利职。” “怎么了瘦癌?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵猪贪,是天一觀的道長。 經(jīng)常有香客問我讯私,道長热押,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任斤寇,我火速辦了婚禮桶癣,結果婚禮上,老公的妹妹穿的比我還像新娘娘锁。我一直安慰自己鬼廓,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布致盟。 她就那樣靜靜地躺著碎税,像睡著了一般尤慰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雷蹂,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天伟端,我揣著相機與錄音,去河邊找鬼匪煌。 笑死责蝠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的萎庭。 我是一名探鬼主播霜医,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驳规!你這毒婦竟也來了肴敛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吗购,失蹤者是張志新(化名)和其女友劉穎医男,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捻勉,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡镀梭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了踱启。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片报账。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖埠偿,靈堂內(nèi)的尸體忽然破棺而出透罢,到底是詐尸還是另有隱情,我是刑警寧澤胚想,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布琐凭,位于F島的核電站,受9級特大地震影響浊服,放射性物質發(fā)生泄漏统屈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一牙躺、第九天 我趴在偏房一處隱蔽的房頂上張望愁憔。 院中可真熱鬧,春花似錦孽拷、人聲如沸吨掌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膜宋。三九已至窿侈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秋茫,已是汗流浹背史简。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肛著,地道東北人圆兵。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像枢贿,于是被迫代替她去往敵國和親殉农。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容