已开通新的博客,后续文字都会发到新博客
https://www.0xforee.top
Android 编译系统解析系列文档
编译系统入口envsetup.sh解析
解析lunch的执行过程以及make执行过程中include文件的顺序
关注一些make执行过程中的几个关键点
对一些独特的语法结构进行解析
概览
Android编译系统概览
- makefile语法的简要说明Makefile文件的include顺序main.mk文件中include的各文件职责
- config.mk文件中include的各文件职责
Android编译系统流程的简要总结
正文
编译android的源代码时我们要经历三个阶段
source build/envsetup.sh
lunch project_name
make (SHOW_COMMANDS)
关于前两阶段的具体内容请参见另一篇文章 android 编译系统之lunch分析
这一章节我们主要来看看整个android编译系统的整体框架
Android编译系统概览
makefile语法的简要说明
target ... : prerequisites ...
[tab] command
这是makefile基本语法
target
就是目标文件,可以是一个object,也可以是一个可执行文件,还可以是一个label(伪目标)prerequisites
就是要生成target所依赖的文件或者目标command
也就是make要执行的命令(任意的shell命令)
注意,command命令必须要使用[tab]键开头,否则make无法识别
明白了语法规则,来看看执行规则:
target 这一个或者多个目标的文件依赖于prerequistites中的文件,其生成规则在command中,这其中的依赖规则判断是:如果prerequisites中有一个或以上文件比target新(判断modification times),那么就执行command所定义的命令
默认情况下执行make命令会在当前目录下依次寻找GNUMakefile(GNU独有)、makefile、Makefile这三个文件,然后执行文件中声明的第一个目标
所以我们在源码根目录执行make文件时,会默认执行Makefile,而这个文件内容只有一行
include build/core/main.mk
我们直接来看main.mk文件干了什么
Makefile文件的include顺序
通过解析main.mk文件,我们可以大致看到include的文件的顺序
# 以下为执行make与lunch时,include文件顺序以及行号
#执行make时,会include build/core/main.mk
main.mk (
89:include help.mk
93:include config.mk
99:include cleanbuild.mk
260:include definitions.mk
263:include dex_preopt.mk
297:include pdk_config.mk
487:include $(ONE_SHOT_MAKEFILE)(如果变量不为空,则include)
525:include post_clean.mk
531:include legacy_prebuilts.mk
797:include Makefile
)
#执行lunch时候,会直接make -f build/core/config.mk #
config.mk (
60:include pathmap.mk
151:include envsetup.mk (
10:include version_defaults.mk (
34:include build_id.mk
)
138:include product_config.mk (
178:include nod