[笔记分享] [Build] Android编译系统源代码之main.mk

来源:互联网 发布:9块9包邮淘宝网\\ 编辑:程序博客网 时间:2024/06/10 12:41

介绍

源代码在build下,主要是在build/core下,下面是几个相对比较重要的文件。
main.mk: 主控Makefile, 如找到top目录下的所有Android.mk文件等。
base_rules.mk: 对Makefile的一些变量规则化。
binary.mk: 获取所有目标文件。
clear_vars.mk: 清楚编译系统中用到的临时变量。
config.mk: 包含编译目标程序所需的源文件及头文件等。
definitions.mk: 定义了系统用到的很多宏,相当于函数库。
envsetup.mk: 检查执行环境,决定主机、目标编译系统、结构等。
product_config.mk: 获取目标product。


main.mk

整个编译系统的核心控制是main.mk文件。流程如下:
1、初始化相关变量
2、检测编译环境和目标环境
3、决定目标product
4、读取 product 的设定
5、读取 product 所指定之目标平台架构设定
6、选择 toolchain
7、指定编译参数 (*-.mk)
8、清除输出目录
9、设定/检查版本编号
10、读取所有 BoardConfig.mk 文件
11、读取所有 module 的设定
12、根据设定,产生必需的 rule
13、产生 image

根据上面的工作流程,我们可以得到如下结构:
这里写图片描述

再看main.mk源代码,只分析我们需要的部分:

这里写图片描述
定义Shell。
这里写图片描述

定义顶层目录和编译系统路径。
这里写图片描述

包含config.mk和 cleanbuild.mk文件, conifg.mk会在后面章节分析。
这里写图片描述

大小写是否敏感。
这里写图片描述

确定编译路径。
这里写图片描述
Android对编译环境的检查如果符合条件,在下次编译的时候,不会再次进行检查。
这里写图片描述
检查完版本之后,会包含进definations.mk,如前所述,definations.mk中定义了很多编译系统中用到的宏,这些宏在编译时需要经常调用,因此在编译的很靠前的阶段,就将之包含了进来。

然后就是针对make时传入的编译类型(eng user userdebug showcommands等)进行编译配置,这些配置会影响到最终编译目标所包括的模块。对于eng user userdebug sdk win_sdk tests等编译目标的区别,可以通过查看main.mk的代码找出其中到底有什么不同。
此处略去部分部分不重要的内容,直接跳到
这里写图片描述
ifeq($(SDK_ONLY),true)处,这个判断语句一直到这个语句块结束,都是对subdirs变量的设置,subdirs变量决定了哪些子文件夹最终被编译。
这里写图片描述

subdir_makefiles变量的设置,决定了哪些Android.mk被编译。紧接着include $(subdir_makefiles)就会添加所有这些Android.mk文件的依赖。这其中包含了droid的依赖,后面我们会发现。
这里写图片描述
然后就会根据这些Makefile,找出所有需要编译的模块(module),以及进行必要的分eng_MODULES/debug_MODULES/tests_MODULES和modules_to_check/modules_to_install等),用以区别对待。紧接着是定义了一系列的隐含目标:prebuilt、all_copied_headers、files、checkbuild、ramdisk、systemtallball、userdataimage、userdatatarball、bootimg、droidcore等。

从这两幅图得出,我们默认的执行目标是droidcore,它会编译整个系统,包括kernel、bootloader等其他程序。Showcommands和默认的效果是差不多的。

阅读全文
1 0