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


1. 要求

1.1 硬件

  • 160g可用磁盤空間。

筆者編譯的是Android 9.0源碼,下載下來後將近40g,編譯後153g,因此至少須要160g可用磁盤空間。php

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

注:在編譯過程當中,若是因爲磁盤空間不足致使編譯失敗,可從新調整磁盤大小,而後接着以前的進度繼續編譯,因此此處看我的編譯的版本,但至少要保證可用磁盤不能過小。java

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上創建一個區分大小寫的磁盤分區。咱們這裏使用命令行來建立,一是比較方便,二是後期可擴展。android

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

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

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

建議在分區時size指定爲160g,但若是後期不夠,能夠經過該命令來調整分區大小,例以下面命令調整爲200g:shell

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

注意:調整分區大小的命令,須要在該分區磁盤映像已卸載的狀況下才能生效。macos

2.2 添加裝載和卸載磁盤分區的命令和函數

爲了方便裝載和卸載該分區磁盤映像,咱們能夠向~/.bash_profile文件中添加以下函數:xcode

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

須要裝載分區磁盤映像時,執行以下命令便可,裝載路徑爲/Volumes/androidbash

$ 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「系統偏好設置」 -> 「節能」裏勾選上「防止進入睡眠」,以下圖所示:

接下來就是漫長的等待過程了,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分鐘:

導入成功後,在Project Structure中,選擇Modules,刪除全部的依賴,只保留下圖所示。這樣在查看源碼跳轉的時候,不會進入android.jar,會直接跳轉至本項目的文件中。

如今你能夠自由地閱讀源碼了,enjoy it!

參考

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

相關文章
相關標籤/搜索