转载地址:http://hi.baidu.com/snownight/blog/item/f472d9f9f450f157242df262.html

Main.mk分析

Main.mk主要包含如下几个部分的内容

1. SHELL设置

2. 编译环境配置

3. 编译环境检查

4. 包含必要的宏

5. 根据make参数设置编译时的变量

6. 包含需要编译的Android.mk

7. 设置编译系统Target:prerequisites 控制整个编译流程

下面对上面几点进行必要解释:

有了前面小节对Android编译系统架构的分析,如果需要修改Android编译系统,就可以不至于盲目找问题,修改代码了。今天分析下main.mk,看它能为我们Android编译提供什么有价值的信息,以及如何自己定制我们的Android编译系统。

Main.mk的第一句就根据ANDROID_BUILD_SHELL来包裹编译系统用到的Shell,如果我们不想使用bash,而想使用sh,那么就可以在它前面写上ANDROID_BUILD_SHELL := /bin/sh,或者在build/envsetup.sh中添加相关定义。

定义完SHELL之后,就是对MAKE_VERSION的检查,然后定义了默认的编译目标droid!

如果我们敲入make之后,不加任何参数,默认的目标就是droid。注意虽然后面的include $(BUILD_SYSTEM)/config.mk写在默认目标droid依赖之后,但其和之后的语句都是要执行的,这是Makefile的语法决定的。

后面会include config.mk cleanbuild.mk对编译系统进行必要的配置。后面就是对编译环境的检查,包括是否大小写敏感、路径检查、java版本检查、javac版本检查。Android对编译环境的检查如果符合条件,在下次编译的时候,不会再次进行检查。

检查完版本之后,会包含进definations.mk,如前所述,definations.mk中定义了很多编译系统中用到的宏,这些宏在编译时需要经常调用,因此在编译的很靠前的阶段,就将之包含了进来。

然后就是针对make时传入的编译类型(eng user userdebug showcommands等)进行编译配置,这些配置会影响到最终编译目标所包括的模块。对于eng user userdebug sdk win_sdk tests等编译目标的区别,读者可以通过查看main.mk的代码找出其中到底有什么不同。

此处略去部分部分不重要的内容,直接跳到

Ifeq($(SDK_ONLY),true)处,大概368行附近,这个判断语句一直到这个语句块结束,都是对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等),用以区别对待。

紧接着是定义了一系列的隐含目标:prebuiltall_copied_headersfilescheckbuildramdisksystemtallballuserdataimageuserdatatarballbootimgdroidcore等。最重要的一点,是会发现droid依赖于droidcore,droidcore依赖于

droidcore: files \

systemimage \

$(INSTALLED_BOOTIMAGE_TARGET) \

$(INSTALLED_RECOVERYIMAGE_TARGET) \

$(INSTALLED_USERDATAIMAGE_TARGET) \

$(INSTALLED_FILES_FILE)

正是这几个依赖项,控制着整个android的编译。

下一篇博文会讲述一个system.img的整个生成过程

更多相关文章

  1. Android关闭SdcardFS
  2. android studio安装 虚拟机"VT-x is disabled in BIOS"
  3. Android(安卓)中不同的系统版本隐藏和显示systemui方法
  4. Ubuntu 16.04 64bit 编译 Android(安卓)4.4 源码
  5. Android系统版本及其屏幕适配
  6. Android(安卓)Device Monitor官方替代工具
  7. Google Android源代码结构
  8. smnp-android移植与简洁使用
  9. 【展讯平台】Android(安卓)驱动(Kernel)、系统(framework) 定制,

随机推荐

  1. Error reading device /dev/bakupvg/baku
  2. 个人理解简单工厂模式和策略模式的区别
  3. 多线程学习(三)多线程开发带来的问题与解决
  4. 为什么说Python会成为最流行的编程语言?
  5. IPython6.0发布:放弃支持Python2.7
  6. Django2.0即将带来3个重要特性
  7. 多线程学习(三)那些队列可用于线程池
  8. 用翻译赚钱,翻译社规则调整
  9. Fedora写给Python的情书
  10. 值得关注的5个Python开源项目