Android編譯系統分析之幾個關鍵點(二)
已開通新的部落格,後續文字都會發到新部落格
Android 編譯系統解析系列文件
解析lunch的執行過程以及make執行過程中include檔案的順序
關注一些make執行過程中的幾個關鍵點
對一些獨特的語法結構進行解析
這篇文章的主要內容我們來分析關於BoardConfig.mk的一些關鍵的知識點
BoardConfig概覽
BoardConfig 顧名思義,主要是配置一些Board(平臺級)相關的東西,大致涉及的內容有arch架構(32還是64位),CPU的型別,Bootloader,Kernel,RadioImage等是否定義預編譯,還有核心的一些page大小,固定的地址偏移等內容,總的來說,這個檔案的主要內容就是定義一些與硬體相關的配置
使用方法
BoardConfig.mk檔案的使用方法很簡單,只需要在Android編譯系統指定的三個位置建立BoardConfig.mk
使用範圍
BoardConfig.mk檔案的使用位置有三個build, device, vendor,不過檔案的存在需要唯一,為什麼是這三個位置,我們在稍後的解析中就可以看到
BoardConfig解析
關於BoardConfig.mk檔案的解析的程式碼很短,所有程式碼只有20行多一點
# 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') \ )) ifeq ($(board_config_mk),) $(error No config file found for TARGET_DEVICE $(TARGET_DEVICE)) endif ifneq ($(words $(board_config_mk)),1) $(error Multiple board config files for TARGET_DEVICE $(TARGET_DEVICE): $(board_config_mk)) endif include $(board_config_mk) ifeq ($(TARGET_ARCH),) $(error TARGET_ARCH not defined by board config: $(board_config_mk)) endif TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk))) board_config_mk :=
從解析前的註釋中,我們能簡單的看出BoardConfig檔案的存放位置:
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)
其中SRC_TARGET_DIR在config.mk檔案中已經定義,指向build/target
也就是說Android編譯系統允許的BoardConfig.mk存在的位置有三個
- build/target/board/$(TARGET_DEVICE)
- vendor/*/$(TARGET_DEVICE)
- device/*/$(TARGET_DEVICE)
這三個位置除了固定深度4層之外,還指定了TARGET_DEVICE
的限制,這個TARGET_DEVICE
的內容是什麼,如果你看過之前關於lunch的解析,你應該明白,這個值就是我們自己在product_makefile檔案中定義的PRODUCT_DEVICE
這個值
Android編譯系統要求這個檔案是唯一的,所以在獲取這三個位置的BoardConfig.mk之後,我們需要告訴使用者只需要一個BoardConfig.mk檔案,然後載入這個BoardConfig.mk檔案即可
當然,從程式碼實現的角度來說,實現多個BoardConfig.mk檔案同時載入也沒有問題,但是從程式碼維護的角度來說,這樣不利於這部分配置檔案的維護,所以還是放在一個檔案內比較好
在載入完這個檔案之後,我們還通過這個檔案定義了一個變數TARGET_DEVICE_DIR
,我們將BoardConfig.mk檔案存在的位置作為了我們後邊要載入其他內容的目錄,主要是用來作為kernel預編譯以及一些資訊的檔案
至此,關於BoardConfig.mk檔案的載入我們也已經解析完了
總結
- BoardConfig.mk檔案的定義遠遠沒有AndroidProduct.mk檔案複雜,畢竟一個成型的Product,平臺級別的配置基本已經定型了,我們無需要再做複雜的配置
- 我們可以看到對於一個Product可以有三個可選的位置放BoardConfig.mk檔案,所以對於無法確定目標機型在哪個位置存放了這個配置檔案,我們可以通過輸出
TARGET_DEVICE_DIR
的值來判斷