首先,編譯Android代碼通常使用:
#制作顯示命令
這實際上相當於下面的完整命令(詳見build/core/envsetup.mk)。
# TARGET _ ARCH = arm TARGET _ PRODUCT = generic TARGET _ BUILD _ TYPE = release make show命令
可以看出,默認情況下,編譯系統認為TARGET_PRODUCT是泛型。
那麽如何針對具體產品編譯Android呢?
這需要看Android Makefile如何解析環境變量TARGET_PRODUCT。
Android Makefile的引用關系如下
makefile->;build/core/main . MK-& gt;build/core/config . MK-& gt;build/core/env setup . MK-& gt;構建/核心/產品配置. mk
在build/core/product_config.mk中,編譯系統首先調用build/core/product.mk中定義的函數get-all-product-makefiles來
遍歷vendor的所有子目錄,找到vendor下的所有AndroidProducts.mk,不同子目錄下的AndroidProducts.mk中定義了PRODUCT_NAME、PRODUCT_DEVICE _ device等不同的信息。(我們也可以通過打開build/core/product_config.mk中的#$(dump-products)語句,讓控制臺在編譯時輸出所有產品信息)。然後build/core/product_config.mk會調用resolve-short-product-name將AndroidProducts.mk中定義的PRODUCT_DEVICE分配給TARGET_PRODUCT與TARGET_DEVICE匹配。
有了這個TARGET_DEVICE,回到build/core/config.mk,
將包含$(target _ dev CIE)/board config . MK。
board_config_mk := /
$(strip $(通配符/
$(SRC _ TARGET _ DIR)/board/$(TARGET _ DEVICE)/board config . MK/
vendor/*/$(TARGET _ DEVICE)/board config . MK/
))
包括$(board_config_mk)
這個配置文件BoardConfig.mk決定了目標系統的編譯屬性,比如使用ALSA還是不使用GENERIC_AUDIO等等。
另外,TARGET_DEVICE宏還決定了這裏的TARGET_DEVICE_DIR,因為TARGET_DEVICE_DIR走的是上面提到的BoardConfig.mk的路徑。
目標設備目錄:= $(patsubst %/,%,$(目錄$(board_config_mk)))
當然,Android的Ob目標輸出也是由TARGET_DEVICE決定的。請參見build/core/envsetup.mk。
目標_輸出_根_釋放:= $(輸出_目錄)/目標
目標_輸出_根_調試:= $(調試_輸出_目錄)/目標
目標輸出根:= $(目標輸出根_$(目標生成類型))
目標產品輸出根:= $(目標產品輸出根)/產品
產品輸出:= $(目標產品輸出根)/$(目標設備)
回到build/core/main.mk,編譯系統接下來要做的就是遍歷所有的word目錄,找到所有的Android.mk文件,並包含這些Android.mk文件。
#
#典型構建;包括我們能找到的任何Android.mk文件。
#
subdir_makefiles := /
$(shell build/tools/find leaves . py-prune = out-prune =。repo - prune=。git $(subdirs) Android.mk)
包含$(subdir_makefiles)
我們再來看看其中的壹個。
。/build/target/board/Android.mk
順便說壹下,它引用了
include $(目標設備目錄)/AndroidBoard.mk
按照上面TARGET_DEVICE_DIR的定義,它又進入了。
供應商下TARGET_DEVICE指向的目錄。這個mk文件定義了壹個特定的產品需要編譯安裝app和腳本。