標籤:
1.Android 編譯系統概述Build 系統中最主要的處理邏輯都在 Make 檔案中,而其他的指令檔只是起到一些輔助作用。整個 Build 系統中的 Make 檔案可以分為三類:① Build 系統核心檔案,此類檔案定義了整個 Build 系統的架構,而其他所有 Make 檔案都是在這個架構的基礎上編寫出來的。Build 系統核心檔案全部位於 /build/core目錄下。
②針對某個產品(一個產品可能是某個型號的手機或者平板電腦)的 Make 檔案,這些檔案通常位於 device 目錄下,該目錄下又以公司名以及產品名分為兩級目錄對於一個產品的定義通常需要一組檔案,這些檔案共同構成了對於這個產品的定義。
③第三類是針對某個模組的 Make 檔案。整個系統中,包含了大量的模組,每個模組都有一個專門的 Make 檔案,這類檔案的名稱統一為“Android.mk”,該檔案中定義了如何編
譯當前模組。Build 系統會在整個源碼樹中掃描名稱為“Android.mk”的檔案並根據其中的內容執行模組的編譯。
2.編譯Tiny4412 Android系統
編譯Android系統命令如下:
source build/envsetup.shlunch full_tiny4412-engmake -j4
①第一行命令“source build/envsetup.sh”引入了
build/envsetup.sh指令碼。該指令碼的作用是初始化編譯環境,並引入一些輔助的 Shell 函數,這其中就包括第二步使用 lunch 函數。它還會引入device/company/product/vendorsetup.sh②第二行命令“lunch full-eng”是調用 lunch 函數,並指定參數為full_tiny4412-eng。lunch 函數的參數用來指定此次編譯的目標裝置以及編譯類型。調用lunch函數 首先執行add_lunch_combo()函數 這樣就顯示一個列表,當你選擇後 系統會調用choosecombo()後 會預先設定值一些環境變數 並且調用config.mk ,所有跟config.mk有關的後面的步驟都是這個時候執行的。命令列也可以看到一系列的環境變數顯示,實現該命令是 dumpvar.mk。
③調用make 執行make droidcore ,主要提取了Android.mk的定義規則 並找到整個系統有關該檔案的指令碼 做一個系統級的編譯。3.源碼編譯過程分析
整個 Build 系統的入口檔案是源碼樹根目錄下的“Makefile”的檔案,當在原始碼根目錄上調用 make 命令時,make 命令首先將讀取該檔案。它的內容如下。
### DO NOT EDIT THIS FILE ###include build/core/main.mk### DO NOT EDIT THIS FILE ###
它引用了 build/core/main.mk 檔案。 main.mk 檔案中又引用了其他.mk檔案,其他.mk檔案中又會包含更多的.mk檔案,這樣就將了整個 Build 系統串聯起來了。
3.1 主要的 Make 檔案的說明
| 檔案名稱 |
說明 |
| main.mk |
最主要的 Make 檔案,該檔案中首先將對編譯環境進行檢查,同時引入其他的 Make 檔案,設定全域變數 和幾個最主要的Make目標,比如Droid、sdk等 |
| help.mk |
包含了名稱為 help 的 Make 目標的定義,該目標將列出主要的 Make 目標及其說明。 |
| pathmap.mk |
將許多標頭檔的路徑通過名值對的方式定義為映射表,並提供 include-path-for 函數來擷取。例如,通過$(call include-path-for, frameworks-native)便可以擷取到 framework 本地代碼需要的標頭檔路徑。 |
| envsetup.mk |
配置 Build 系統需要的環境變數,例如:TARGET_PRODUCT,TARGET_BUILD_VARIANT,HOST_OS,HOST_ARCH 等。當前編譯的主機平台資訊(例如作業系統,CPU 類型等資訊)就是在這個檔案中確定的。另外,該檔案中還指定了各種編譯結果的輸出路徑。 |
| combo/select.mk |
根據當前編譯器的平台選擇平台相關的 Make 檔案。 |
| dumpvar.mk |
在 Build 開始之前,顯示此次 Build 的配置資訊。 |
| config.mk |
整個 Build 系統的設定檔,最重要的 Make 檔案之一。該檔案中主要包含以下內容:
- 定義了許多的常量來負責不同類型模組的編譯。
- 定義編譯器參數以及常見檔案尾碼,例如 .zip,.jar.apk。
- 根據 BoardConfig.mk 檔案,配置產品相關的參數。
- 設定一些常用工具的路徑,例如 flex,e2fsck,dx。
|
| definitions.mk |
最重要的 Make 檔案之一,在其中定義了大量的函數。這些函數都是 Build 系統的其他檔案將用到的。例如:my-dir,all-subdir-makefiles,find-subdir-files,sign-package 等,關於這些函數的說明請參見每個函數的代碼注釋。 |
| distdir.mk |
針對 dist 目標的定義。dist 目標用來拷貝檔案到指定路徑。 |
| dex_preopt.mk |
針對啟動 jar 包的預先最佳化。 |
| pdk_config.mk |
顧名思義,針對 pdk(Platform Developement Kit)的設定檔。 |
${ONE_SHOT_MAKEFILE} |
ONE_SHOT_MAKEFILE 是一個變數,當使用“mm”編譯某個目錄下的模組時,此變數的值即為當前指定路徑下的 Make 檔案的路徑。 |
${subdir_makefiles} |
各個模組的 Android.mk 檔案的集合,這個集合是通過 Python 指令碼掃描得到的。 |
| post_clean.mk |
在前一次 Build 的基礎上檢查當前 Build 的配置,並執行必要清理工作。 |
| legacy_prebuilts.mk |
該檔案中只定義了 GRANDFATHERED_ALL_PREBUILT 變數。 |
| Makefile |
被 main.mk 包含,該檔案中的內容是輔助 main.mk 的一些額外內容。
|
3.2 主要Makefile的調用流程
build/core/main.mk主要流程為:
l 初始化相關的參數設定(buildspec.mk、envsetup.mk、config.mk)
l 檢測編譯環境和目標環境
l 決定目標product
l 讀取product的配置資訊及目標平台資訊
l 清除輸出目錄
l 檢查版本號碼
l 讀取Board的配置
l 讀取所有Module的配置
l 根據配置產生必要的規則(build/core/Makefile)
l 產生image
①main.mk:它是整個系統編譯系統主導檔案,它的主要內容如下
#定義預設的target即make命令後不加參數的預設目標# This is the default target. It must be the first declared target..PHONY: droidDEFAULT_GOAL := droid$(DEFAULT_GOAL):#引入help.mk,help.mk 包含了名稱為 help 的 Make 目標的定義,#該目標將列出主要的 Make 目標及其說明# Targets that provide quick help on the build system.include $(BUILD_SYSTEM)/help.mk#引入config.mk,定義產品,主機的各種基本變數# Set up various standard variables based on configuration# and host information.include $(BUILD_SYSTEM)/config.mk#引入clean操作的定義# This allows us to force a clean build - included after the config.mk# environment setup is done, but before we generate any dependencies. This# file does the rm -rf inline so the deps which are all done below will# be generated correctlyinclude $(BUILD_SYSTEM)/cleanbuild.mk#引入基本編譯系統的定義,提供了大量的實用函數# Bring in standard build system definitions.include $(BUILD_SYSTEM)/definitions.mk#讀取android源碼樹中所有的Android.mkifneq ($(dont_bother),true)## Include all of the makefiles in the system## Can‘t use first-makefiles-under here because# --mindepth=2 makes the prunes not work.subdir_makefiles := $(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git $(subdirs) Android.mk)$(foreach mk, $(subdir_makefiles), $(info including $(mk) ...)$(eval include $(mk)))
②config.mk解析:產品配置主導檔案
#引入envsetup.mk定義大部分全域變數,配置編譯時間的環境變數。#該檔案可以指定使用者編譯配置# ---------------------------------------------------------------# Define most of the global variables. These are the ones that# are specific to the user‘s build configuration.include $(BUILD_SYSTEM)/envsetup.mk
③envsetup.mk:用來配置編譯時間的環境變數
#引入BoardConfig.mk,BoardConfig.mk主要寫了product使用的硬體所支援和不支援的功能性內容。#BroadConfig.mk設定了每個裝置的自己的一些變數值,來區別編譯時間的行為include $(board_config_mk)......# Boards may be defined under $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)# or under vendor/*/$(TARGET_DEVICE). Search in both places, but# make sure only one exists.# Real boards should always be associated with an OEM vendor.board_config_mk := $(strip $(wildcard $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk $(shell test -d device && find device -maxdepth 4 -path ‘*/$(TARGET_DEVICE)/BoardConfig.mk‘) \ $(shell test -d vendor && find vendor -maxdepth 4 -path ‘*/$(TARGET_DEVICE)/BoardConfig.mk‘) ))#設定版本資訊# Set up version information.include $(BUILD_SYSTEM)/version_defaults.mk#引入產品層級的配置# Read the product specs so we can get TARGET_DEVICE and other# variables that we need in order to locate the output files.include $(BUILD_SYSTEM)/product_config.mk
④product_config.mk:產品層級的配置,讀取指定的目錄下所有的AndrodProducts.mk檔案中定義的產品資訊
#引用AndroidProducts.mk#讀取AndrodProducts.mk檔案中定義的產品資訊ifneq ($(strip $(TARGET_BUILD_APPS)),)# An unbundled app build needs only the core product makefiles.all_product_configs := $(call get-product-makefiles, $(SRC_TARGET_DIR)/product/AndroidProducts.mk)else# Read in all of the product definitions specified by the AndroidProducts.mk# files in the tree.all_product_configs := $(get-all-product-makefiles)endif
⑤AndroidProducts.mk列出了產品版本定義檔案名稱的列表 該列表下的檔案定義了產品的各種版本資訊
⑥BoardConfig.mk該檔案用來配置產品,它其中定義的都是裝置底層的硬體特性,例如該裝置的板級相關資訊,Wifi相關資訊以及bootloader和核心等資訊。 參考文章:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/http://www.jianshu.com/p/6d0e3492c91e
Tiny4412 Android 5.0 編譯系統學習筆記