手把手教你在Mac OS下載、編譯及匯入Android原始碼

JeromeLiee發表於2019-04-28

1. 要求

1.1 硬體

  • 160g可用磁碟空間。

筆者編譯的是Android 9.0原始碼,下載下來後將近40g,編譯後153g,所以至少需要160g可用磁碟空間。

看網上有別人下載編譯7.1.1版本的原始碼,編譯下來需要67g,則可用磁碟空間至少需要分配80g。

注:在編譯過程中,如果由於磁碟空間不足導致編譯失敗,可重新調整磁碟大小,然後接著之前的進度繼續編譯,所以此處看個人編譯的版本,但至少要保證可用磁碟不能太小。

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 的開發者工具)
  • 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 建立分割槽大小寫的磁碟映像

Mac OS預設會在不區分大小寫的檔案系統中執行,但由於Git並不支援此類檔案系統,所以需要在Mac OS上建立一個區分大小寫的磁碟分割槽。我們這裡使用命令列來建立,一是比較方便,二是後期可擴充套件。

在終端輸入以下命令來建立一個160g大小的磁碟映像:

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

會在當前使用者目錄下生成一個android.dmg.sparseimage檔案,可簡單理解為該檔案是編譯原始碼所需要的驅動盤。

建議在分割槽時size指定為160g,但如果後期不夠,可以通過該命令來調整分割槽大小,例如下面命令調整為200g:

$ hdiutil resize -size 200g ~/android.dmg.sparseimage
複製程式碼

注意:調整分割槽大小的命令,需要在該分割槽磁碟映像已解除安裝的情況下才能生效。

2.2 新增裝載和解除安裝磁碟分割槽的命令和函式

為了方便裝載和解除安裝該分割槽磁碟映像,我們可以向~/.bash_profile檔案中新增如下函式:

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

需要裝載分割槽磁碟映像時,執行如下命令即可,裝載路徑為/Volumes/android

$ mountAndroid
複製程式碼

同樣,解除安裝的函式如下,我們也將它新增到~/.bash_profile檔案中:

# unmount the android file image
umountAndroid() { hdiutil detach /Volumes/android; }
複製程式碼

執行如下命令,便可解除安裝該分割槽磁碟映像:

$ 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,則執行如下命令:
$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
複製程式碼
  • 如果是使用Homebrew,則執行如下命令:
$ 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目錄下,再給它建立一個軟連結,可以避免下次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 設定檔案描述符數量上限

在 Mac OS 中,可同時開啟的檔案描述符的預設數量上限太低,在高度並行的編譯流程中,可能會超出此上限。要提高此上限,請將下列行新增到 ~/.bash_profile 中:

# set the number of open files to be 1024
ulimit -S -n 1024
複製程式碼

至此,一切準備工作就緒,接下來就是下載原始碼的過程了。

3. 下載原始碼

3.1 說明

這裡參考Google 教程。由於牆的原因,即使我們作為技術人員能翻過去,但使用起來可能還是有各種各樣的問題,所以這裡我們可以通過清華大學映象站來下載。

3.2 下載安裝Repo工具

由於Android原始碼龐大複雜,所以Google專門開發了Repo來管理Android原始碼庫,這裡不多作介紹,有興趣可自行閱讀repo工具介紹

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

$ mkdir ~/bin
$ PATH=~/bin:$PATH
複製程式碼

然後下載Repo工具,並確保它可執行:

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

3.3 初始化 Repo 客戶端

在2.2小節中,我們通過mountAndroid命令裝載了我們分割槽後的磁碟映像,其裝載路徑為/Volumes/android,所以我們需要在該目錄下進行初始化:

切換到該目錄下,並且建立一個aosp的工作目錄:

$ cd /Volumes/android/
$ mkdir aosp
$ cd aosp
複製程式碼

現在,我們的原始碼根目錄全路徑為/Volumes/android/aosp

Repo的執行過程中會嘗試訪問官方的git源更新自己,如果想使用清華的映象源進行更新,可以將如下內容複製到你的~/.bashrc(沒有該檔案則建立一個)裡:

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“系統偏好設定” -> “節能”裡勾選上“防止進入睡眠”,如下圖所示:

手把手教你在Mac OS下載、編譯及匯入Android原始碼

接下來就是漫長的等待過程了,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 環境設定

使用envsetup.sh指令碼初始化環境:

$ 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 是以下型別之一,表示在什麼環境下執行:

編譯型別 使用情況
user 許可權受限;適用於生產環境
userdebug 與“user”類似,但具有 root 許可權和可除錯性;是進行除錯時的首選編譯型別
eng 具有額外除錯工具的開發配置

比如aosp_arm-engBUILDaosp_armBUILDTYPEengaosp代表Android開源專案,arm表示系統是執行在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核數:

$ sysctl -n machdep.cpu.core_count
4
複製程式碼

上面輸出的CPU核數為4,則可以啟動4個執行緒來編譯原始碼:

$ make -j4
複製程式碼

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

#### 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) ####
複製程式碼

此時繼續執行下面的命令,會在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分鐘:

手把手教你在Mac OS下載、編譯及匯入Android原始碼

匯入成功後,在Project Structure中,選擇Modules,刪除所有的依賴,只保留下圖所示。這樣在檢視原始碼跳轉的時候,不會進入android.jar,會直接跳轉至本專案的檔案中。

手把手教你在Mac OS下載、編譯及匯入Android原始碼

現在你可以自由地閱讀原始碼了,enjoy it!

手把手教你在Mac OS下載、編譯及匯入Android原始碼

參考

Google官方Android原始碼編譯教程 清華大學開源軟體映象站 - Android 映象使用幫助 macOS(Sierra 10.12)上Android原始碼(AOSP)的下載、編譯與匯入到Android Studio Android AOSP基礎(二)AOSP原始碼下載 Android AOSP基礎(三)Android系統原始碼的整編和單編 使用Android Studio匯入原始碼

相關文章