1. 程式人生 > >Android編譯系統分析之幾個關鍵點(二)

Android編譯系統分析之幾個關鍵點(二)

已開通新的部落格,後續文字都會發到新部落格

http://www.0xfree.top


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檔案的載入我們也已經解析完了

總結

  1. BoardConfig.mk檔案的定義遠遠沒有AndroidProduct.mk檔案複雜,畢竟一個成型的Product,平臺級別的配置基本已經定型了,我們無需要再做複雜的配置
  2. 我們可以看到對於一個Product可以有三個可選的位置放BoardConfig.mk檔案,所以對於無法確定目標機型在哪個位置存放了這個配置檔案,我們可以通過輸出TARGET_DEVICE_DIR的值來判斷