一、android build system编译系统概述
二、envsetup.sh脚本(Android10)
三、soong_ui.bash脚本
四、soong_ui的main.go
五、kati中调用main.mk
六、make目录中的main.mk
七、AndroidProducts.mk
八、module-info.json
九、子模块的执行
文章目录
编译的逻辑顺序
1. 执行source envsetup.sh
脚本
执行source envsetup.sh
脚本,初始化环境变量和常用命令函数,如lunch
,make
,m/mm/mmm
,mma/mmma
参考envsetup
目录相关文档
2. 执行lunch
命令
执行lunch
命令读取项目配置信息
此时会调用build/make/core/config.mk
脚本
3. 执行make
orm
命令开始编译
这一步会用到build/make/core/main.mk
main.mk
1. kati与main.mk
ifndef KATI
... #1流程
else #KATI
... #2流程
endif #KATI
第一次是没有KATI的话就去执行流程1 (这时用的是make命令)
第二次是有KATI的话就去执行流程2 (这时用的是kati命令)
一般来讲,不会走到流程1,soong_ui调用kati,直接走流程2
2. Android.mk加载
/build/make/core/main.mk
文件中,通过如下方式include每个子目录的Android.mk
#
# Include all of the makefiles in the system
#
subdir_makefiles := $(SOONG_ANDROID_MK) $(file <$(OUT_DIR)/.module_paths/Android.mk.list)
subdir_makefiles_total := $(words int $(subdir_makefiles) post finish)
.KATI_READONLY := subdir_makefiles_total
$(foreach mk,$(subdir_makefiles),$(info [$(call inc_and_print,subdir_makefiles_inc)/$(subdir_makefiles_total)] including $(mk) ...)$(eval include $(mk)))
正因为这一块儿逻辑,所以我们经常能在编译时看到[xxx/xxx] including xxxx
这样的log
2.1 inc_and_print宏函数
此函数是用计数,每调用一次传进来的$1
变量多一个.
字符串。计算$1
变量总共有几个.
。
可以理解为调用一次计数+1
一次。
这里的$1
就是subdir_makefiles_inc
变量
具体函数定义如下
# $1 is the variable name to increment
define inc_and_print
$(strip $(eval $(1) := $($(1)) .)$(words $($(1))))
endef
2.2 subdir_makefiles_total变量
subdir_makefiles_total
变量通过$(words)
,计算$subdir_makefiles
加上int
、post
、finish
三个字符串一供几个字符串,得出需要include的makefile文件的总数字
subdir_makefiles_total
变量和subdir_makefiles_inc
变量,配合起来使用。显示编译进度。
2.3 Android.mk.list
$(OUT_DIR)/.module_paths/Android.mk.list
中存放着此次编译找到的所有Android.mk
文件
2.4 build/soong/ui/build/finder.go
build/soong/ui/build/finder.go
中的func FindSources(ctx Context, config Config, f *finder.Finder)
函数定义了如下逻辑:
- 搜索Android源码中的
Android.mk
文件,将对应的文件路径放入Android.mk.list
文件中 - 搜索Android源码中的
Android.bp
文件,将对应的文件路径放入Android.bp.list
文件中 - 搜索Android源码中的
CleanSpec.mk
文件,将对应的文件路径放入CleanSpec.mk.list
文件中 - 搜索Android源码
device
、vendor
、product
目录中的AndroidProducts.mk
文件,将对应的文件路径放入AndroidProducts.mk.list
文件中
FindSources
函数会在soong_ui中被调用