跟编译相关的mk文件就如上所述,其中AndroidProducts.mk中的内容如下:
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/msmnile.mk
他会去调用msmnile.mk,因此真正的主编译文件是AndroidBoard.mk/ AndroidProducts.mk/BoardConfig.mk,其实这三个是android原生设计的主入口。
我们可以在build目录中去一探究竟。首先我们在编译android的第一步就是source build/envsetup.sh,其中会有如下操作:
./make/envsetup.sh:1734:49355:for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
./make/envsetup.sh:1735:49456: `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
./make/envsetup.sh:1736:49557: `test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
会查找devcie/vendor和product目录中是否包含有vendorsetup.sh,并且去执行。一般在一个板级目录中会有定义该文件。
在高通平台上,选择在一个通用的common目录下统一添加板型,比如device/qcom/common/vendorsetup.sh,其中会有关键的添加板型的步骤:
add_lunch_combo msmnile-userdebug
add_lunch_combo msmnile_au-userdebug
你可以选择在该文件中继续添加自己的板型,但是这只是一个选择而已,也可以在自己对应的板型目录中添加vendorsetup.sh文件,并且把板型信息写入来新增板型。
这样后面我们在lunch的时候就会有对应的板型了。在lunch之后我们其实就已经确定了TARGET_PRODUCT,那么TARGET_DEVICE是在哪里定义的呢?
我们从上面的流程知道,lunch最新确定的就是TARGET_PRODUCT:
function lunch()
{
...
TARGET_PRODUCT=$product
...
}
根据板型会进行下一步的环境变量的初始化,详情在build/make/core/product.mk里面有介绍,我们不再详述,通过一系列操作,最终会调用到AndroidProducts.mk里面的一些定义。
build/make/core/product.mk:
define _search-android-products-files-in-dir
$(sort $(shell test -d $(1) && find -L $(1) \
-maxdepth 6 \
-name .git -prune \
-o -name AndroidProducts.mk -print))
endef
AndroidProducts.mk比如:
PRODUCT_NAME := msmnile
PRODUCT_DEVICE := msmnile
通过PRODUCT_DEVICE就会最终定义了TARGET_DEVICE。后面就可以进一步找到BoardConfig.mk和AndroidBoard.mk:
./make/core/envsetup.mk:247:
board_config_mk := \
$(strip $(sort $(wildcard \
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
$(shell test -d device && find -L device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
$(shell test -d vendor && find -L vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
)))
./make/core/envsetup.mk:264:9562:TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))
./make/target/board/Android.mk:7:107:-include $(TARGET_DEVICE_DIR)/AndroidBoard.mk