前言
我們知道,Android OS是基於Linux內核的移動操作系統,主要分成了
- Application
- ApplicationFramework(Java)
- System Libraries(Native C/C++)/Android Runtime
- HAL(Hardware Abstraction Layer)
- Linux Kernel
這幾個部分。
作為一個Android Developer,熟練使用Android系統API是必不可少的(Application),但是在進階的道路上,揭開API的『面具』,直面API背后的Android FW/Linux Kernel同樣是一條必經之路。
今天就介紹一下,如何在Mac OSX上進行Android系統源代碼的編譯。
正文
AOSP 是Google領導的Android系統開源項目,旨在為開發者創建定制的Android堆棧版本提供源代碼以及相關信息。AOSP的相關簡介可以在這里查看。
下面就分步進行Android系統源碼的編譯:
1. 創建區分大小寫的磁盤映像
AOSP項目使用git進行版本控制,mac默認的磁盤對大小寫是非敏感的,在這類文件系統中,可能導致git的一些命令失效(比如:git status),因此需要創建出一個Case-sensitive的磁盤映像來存儲AOSP項目代碼。
-
創建磁盤空間:
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/ android.dmg
執行完成后,會在用戶根目錄(命令行cd ~)創建出一個未掛載的磁盤映像android.dmg(也可能是android.dmg.sparseimage)
-
調整磁盤大小:
創建完成后,可對磁盤空間的大小進行調整hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
這里如果想要完整編譯master分支,resize的大小建議120G左右,否則空間不足會導致編譯重置,並且mac存儲空間中會多一部分無法刪除的占用。
雙擊用戶目錄的android.dmg.sparseimage即可掛載磁盤空間。
2. 安裝JDK
需注意,AOSP項目必須基於Open JDK的版本。
3. 安裝Xcode
-
從App store下載xcode安裝,完成后執行
$ xcode-select --install
Note:這里最好再運行一下
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
以防后面的步驟出現warning:
Warning: Xcode appears to be installed but xcodebuild is unusable; some ports will likely fail to build.
4. 安裝MacPorts
-
根據自己的系統來選擇 MacPorts的下載地址
-
編輯.bash_profile文件(如果沒有此文件,vi會自動創建)
vi ~/.bash_profile
-
復制
export PATH=/opt/local/bin:$PATH
到.bash_profile文件中。 -
激活MacPorts命令:
source ~/.bash_profile
5. 通過MacPorts安裝Make、Git、GPG
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
同時,由於mac中允許同時打開的文件描述符數較低,復制以下文本至.bash_profile文件中:
ulimit -S -n 1024
6. 下載源代碼
可以參閱 [官方教程]
-
確保主目錄下有一個
bin/
目錄,在.bash_profile中添加:mkdir ~/bin PATH=~/bin:$PAT
激活:
source ~/.bash_profile
-
下載repo
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo
關於repo的介紹,看這里。
-
初始化repo
掛載的磁盤目錄一般在/Volumes文件夾下,cd /Volumes
進去后,找到掛載的磁盤名,cd進入磁盤目錄后:repo init -u https://android.googlesource.com/platform/manifest
-
開始下載源碼
repo sync
Note:這里下載的為AOSP master分支的代碼,也就是當前最新的Android版本。如需repo特定分支,請使用:
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
你可以從這里查看源代碼的各版本分支。
如需使用本地鏡像或者需要驗證git,請參閱官方教程。
7. 編譯
編譯過程在經歷了多個Android版本之后變得更加簡單明了。可以參考 [官方教程]
-
設置環境
source build/envsetup.sh
-
cd到源代碼目錄后:
make -j17
GNU Make 可以借助 -jN 參數處理並行任務,通常使用的任務數 N 介於編譯時所用計算機上硬件線程數的 1-2 倍之間。
Note:此博文僅編譯代碼用於查看系統代碼。如需要設備調試或者需要修改代碼,請參閱郭霖的博客。
8. 在AndroidStudio中查看源碼
關於AndroidStuido的下載以及介紹,請移步 Android Studio官方網站。
-
編譯完成后,cd到源代碼目錄,如
/Volumes/android/source
,執行:mmm development/tools/idegen/
-
idegen完成后,執行:
sh ./development/tools/idegen/idegen.sh
-
以上兩步完成以后,打開AndroidStudio -> File -> Open -> 源代碼目錄 -> android.ipr,即可在AndroidStuido中查看Android源代碼。
寫在后面
網上其實有很多編譯源碼的教程,但是大多都是比較老舊的版本,親測下來最新的master分支已經解決了很多遺留的編譯問題。
整個過程並沒有很復雜,最難以應對的就是mac昂貴的硬盤空間了,256G的HD結結實實折騰了幾次才最終編譯完成。
遇到問題多看官方文檔才是最正確的姿勢。