1. 环境初始化
source ./build/envsetup.sh 扫描vender及device以下2及目录以上的vemdersetup.sh生成 lunch时的配置选项列表
lunch --选择编译的目标项目(device或者vendor下面的那个项目)
2. Makefile编译流程 (--> 表示include,缩进代表上下级关系)
a. 编译环境配置
./build/core/main.mk
--> config.mk
--> buildspec.mk (if exist,这个文件是在top目录下面的) config.mk里面查询 TARGET_BUILD_VARIANT这个变量是否在buildspec.mk里被设置,没有被设置的话, 则调用lunch选择配置.
--> envsetup.mk 编译配置
--> version_defaults.mk 设置android的版本信息,比如4.1.1
--> product_config.mk 配置目标项目相关信息,根据TARGET_PRODUCT匹配 product.mk中生产的PRODUCT信息列表得到目标编译的product INTERNAL_PRODUCT
--> node_fns.mk
--> product.mk 查询vender和device下面maxpat6以上的 AndroidProduct.mk并生成一个列表
--> device.mk
--> combo/select.mk 根据HOST_OS,HOST_ARCK配置本地编译工具gcc及参数(SDK等需要用的)根据TARGET_OS,TARGET_ARCH配置目标编译工具gcc及参数
b. 模块编译
./build/core/main.mk
定义 subdirs := $(TOP)
subdir_makefiles := \
$(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)
include $(subdir_makefiles)
//包含顶层目录以下所有能找到的Android.mk文件
3. make 默认使用的规则
Makefile 使用的是all的依赖关系,而android是
# This is the default target. It must be the first declared target.
.PHONY: droid
DEFAULT_GOAL := droid
$(DEFAULT_GOAL):
xxxxxx xxxxx
4. 有个疑问有待验证
product目录是否可以去掉Android.mk 他包含所有当前目录所有android.mk与AndroidProduct.mk冲突引起重复,(AndroidProduct.mk包含的定义信息在product.mk中要用到其相关内容).
解释: 理解错了,product目录的Android.mk 中
include $(call all-makefiles-under,$(LOCAL_PATH)) //这句不是包含当前目录下的所有*.mk,而是包含当前目录的所有子目录下面的Android.mk
在build/core/definitions.mk定义的all-makefiles-under
define all-makefiles-under
$(wildcard $(1)/*/Android.mk)
endef
5. 产品项目目录的Makefile
项目.mk
--> BoardConfig.mk
--> device.mk
一个完整项目下包含主要的5个Makefile:
Android.mk android工程组织编译模块的默认规则
AndroidProduct.mk 探测产品项目makefile(必须)
项目.mk 项目主要配置文件mk文件
BoardConfig.mk 项目板级相关配置mk文件(含有什么硬件)
device.mk 项目设备相关配置mk文件(根据用有什么硬件,选择需要的安装包)