1. 概述
Android 編譯系統是Android源碼的一部分,在學習Android編譯系統之前,可以參照使用AndroidStudio查看並調試Android源碼 來搞定源碼和編譯環境
Android Build 系統用來編譯 Android 系統,Android SDK 以及相關文檔。該系統主要由 Make 文件,BP文件,Shell 腳本以及 Python 腳本組成,其中最主要的是 Make 文件和BP文件。
Build 系統中最主要的處理邏輯都在 Make 文件中,而其他的腳本文件只是起到一些輔助作用
整個 Build 系統中的 Make 文件可以分爲三類:
-
第一類是 Build 系統核心文件
此類文件定義了整個 Build 系統的框架,而其他所有 Make 文件都是在這個框架的基礎上編寫出來的。Build 系統核心文件全部位於 aosp/build/core -
第二類是針對某個產品(一個產品可能是某個型號的手機或者平板電腦)的 Make 文件
這些文件通常位於 device 目錄下,該目錄下又以公司名以及產品名分爲兩級目錄,對於一個產品的定義通常需要一組文件,這些文件共同構成了對於這個產品的定義。如圖device下的AAA代表公司名稱,F16代表產品編號
-
第三類是針對某個模塊的 Make 文件。
整個系統中,包含了大量的模塊,每個模塊都有一個專門的 Make 文件,這類文件的名稱統一爲“Android.mk”,該文件中定義瞭如何編譯當前模塊。Build 系統會在整個源碼樹中掃描名稱爲“Android.mk”的文件並根據其中的內容執行模塊的編譯。
2. 編譯 Android 系統
關於源碼的下載,編譯和調試,可以查看:使用AndroidStudio查看並調試Android源碼
核心的編譯命令只有以下3句:
source build/envsetup.sh
lunch XXX
make -j8
source build/envsetup.sh
命令 source build/envsetup.sh
引入了 build/envsetup.sh
腳本。該腳本的作用是初始化編譯環境,並引入一些輔助的 Shell 函數,這其中就包括第二步使用 lunch 函數。
當我們執行過 source build/envsetup.sh
後可以使用 hmm
命令來查看常用的一些命令的含義:
除此之外,該文件中還定義了其他一些常用的函數,這些函數分爲以下幾類
編譯指令
命令 | 說明 |
---|---|
m | 在源碼樹的根目錄執行編譯 |
mm | 編譯當前路徑下所有模塊,但不包含依賴 |
mmm [module_path] | 編譯指定路徑下所有模塊,但不包含依賴 |
mma | 編譯當前路徑下所有模塊,且包含依賴(通常在第一次編譯某個模塊時,我們都會使用該命令) |
mmma [module_path] | 編譯指定路徑下所有模塊,且包含依賴 |
make [module_name] | 如果無參數,則表示編譯整個Android代碼 |
建議:首次編譯時採用make/mma/mmma編譯;當依賴模塊已經編譯過的情況,則使用mmm/mm編譯
代碼搜索
命令 | 說明 |
---|---|
cgrep | 在所有C/C++文件中執行搜索 |
jgrep | 在所有Java文件中執行搜索 |
ggrep | 在所有Gradle文件中執行搜索 |
mangerp | 在所有AndroidManifest.xml文件中執行搜索 |
mgrep | 在所有Android.mk文件中執行搜索 |
sepgrep | 在所有sepolicy文件中執行搜索 |
resgrep | 在所有res/*.xml文件中執行搜索 |
sgrep | 在所有資源文件中執行搜索 |
上述指令用法最終實現方式都是基於grep指令,在當前路徑下進行搜索的,各個指令用法格式:
xgrep [keyword] //xgrep代表的是上表的各個搜索指令
例如想要搜索所以AndroidManifest中包含launcher3
的位置:
mangrep launcher3
結果如圖所示:
導航指令
命令 | 說明 |
---|---|
croot | 切換到Android根目錄 |
cproj | 切換到工程根目錄 |
godir [filename] | 跳轉到包含某個文件的目錄 |
這裏需要注意的是cproj的原理是一層一層的執行cd ..
直到找到Android.mk文件爲止,所以如果你的項目是使用Android.bp
文件作來編譯的話,則這個指令會不好用.如圖展示了成功和失敗的情況:
成功:
失敗:
可以看到DeskClock使用的是Android.bp 所以沒法使用cproj來進行導航
信息查詢
命令 | 說明 |
---|---|
hmm | 查詢所有指令的help信息 |
findmakefile | 查詢當前目錄所在工程的Android.mk文件路徑(對Android.bp無效) |
print_launch_menu | 查詢lunch的所有可選項 |
printconfig | 查詢各項編譯變量值 |
gettop | 查詢Android源碼的根目錄 |
gettargetarch | 獲取TARGET_ARCH值 |
其他常用命令
- make clean:執行清理操作,等價於
rm -rf out/
- make update-api:更新API,在framework API改動後需執行該指令,Api記錄在目錄
frameworks/base/api