Android編譯系統(一、環境與命令)

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章