未来,风也会等你
本节记录的主要内容
android编译系统的结构
编译中心main.mk基本分析
除非特别说明,本节中的目录均为基于android的源码目录。
1.android编译系统结构
Android编译系统可以分为三个部分:
build/core:该目录包含大量.mk文件
子项目:每个子项目都包含自己的Android.mk,编译时会包含该文件。 子工程如何编译由Andorid.mk文件决定3
out/:编译结果输出到该目录。 编译结果可以是jar包、apk或者补码文件等。
在Android系统中,主要是根据.mk文件进行编译。
它们之间的关系如下:
编译关系
基本流程是:
当我们编译系统时,输入make后,默认会搜索当前目录下的Makefile文件。 其内容如下:
### DO NOT EDIT THIS FILE ###include build/core/main.mk### DO NOT EDIT THIS FILE ###
可以看到,它只包含一个main.mk文件,说明main.mk将是系统编译的重要组成部分。
系统编译完成后,会包含很多子工程。 子工程如何编译由子工程的Android.mk文件决定。
编译完成后,大部分编译结果会存放在out/target/..
2.编译中心main.mk的基本分析
决定使用的shell类型(编译的脚本使用shell句型,不同的shell会有不同的句型)
SHELL := $(ANDROID_BUILD_SHELL)elseSHELL := /bin/bashend
定义默认目标名称,定义如下
droid. .PHONY: droid DEFAULT_GOAL := droid $(DEFAULT_GOAL): droid_targets
包含config.mk。 该文件主要进行一系列的系统配置。 该文件将在前面详细解释。
设置编译时使用的java版本。 Linux 上必须使用 OpenJDKandroid怎么编译源码包,MacOS 上必须使用 OracleJDK。
包含definitions.mk,定义了很多编译过程中用到的函数
# Bring in standard build system definitions.include $(BUILD_SYSTEM)/definitions.mk
包含 dex_preopt.mk。 dex 文件在 Dalvik 中执行。 不同的CPU会略有不同。 为了提高Dalvik的执行效率,可以对dex文件进行优化。该文件可以配置一些与dex优化相关的选项。
# Bring in dex_preopt.mkinclude $(BUILD_SYSTEM)/dex_preopt.mk
检测产品类型。 如果不是user、userdebug、eng系统会报错。
ifneq ($(filter user userdebug eng,$(MAKECMDGOALS)),) $(info ***************************************************************) $(info ***************************************************************) $(info Do not pass '$(filter user userdebug eng,$(MAKECMDGOALS))' on the make command line.) $(info Set TARGET_BUILD_VARIANT in buildspec.mk, or use lunch or) $(info choosecombo.) $(info ***************************************************************) $(info ***************************************************************) $(error stopping) endif
检测PDK中java支持的级别。 PDK是Google将提前发布给设备开发制造商OEM和芯片制造商的Android最新版本,让这些制造商能够快速更新他们的设备和芯片。
存在三个值,"not defined": 不支持, "sdk":仅支持SDK的API,"platform":支持 platform API TARGET_BUILD_JAVA_SUPPORT_LEVEL := platform
Android.mk文件android怎么编译源码包,包含用户所选产品下的所有子项目
subdir_makefiles := $(shell build/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) $(subdirs) Android.mk)
这里使用了脚本文件findleaves.py,有兴趣的高手可以研究一下。
根据系统设置进行完整编译和SDK编译。主要通过FULL_BUILD和is_sdk_build编译
包含Makefile(build/core/),定义了编译过程中需要的各种临时目标对象
定义一些通用目标,无论是哪种产品都可用。
例如:
ramdisk:生成ramdisk.imgsystemtarball:生成systemtarball.imgboottarball:生成boot.imguserdatatarball:生成userdata.img