Android的编译系统

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android的编译系统

一、Makefile的主要流程

以下主要流程都在build/core/main.mk里安排。

初始化相关的参数设置(buildspec.mk、envsetup.mk、config.mk)

检测编译环境和目标环境

决定目标product

读取product的配置信息及目标平台信息

清除输出目录

检查版本号

读取Board的配置

读取所有Module的配置

根据配置产生必要的规则(build/core/Makefile)

生成image

主要配置文件:

build/core/config.mk summary of config

build/core/envsetup.mk generate dir config and so on

build/target/product product config

build/target/board board config

build/core/combo build flags config

这里解释下这里的board和product。borad主要是设计到硬件芯片的配置,比如是否提供硬件的某些功能,比如说GPU等等,或者芯片支持浮点运算等等。product是指针对当前的芯片配置定义你将要生产产品的个性配置,主要是指APK方面的配置,哪些APK会包含在哪个product中,哪些APK在当前product中是不提供的。

config.mk是一个总括性的东西,它里面定义了各种module编译所需要使用的HOST工具以及如何来编译各种模块,比如说BUILT_PREBUILT就定义了如何来编译预编译模块。envsetup.mk主要会读取由envsetup.sh写入环境变量中的一些变量来配置编译过程中的输

出目录,combo里面主要定义了各种Host和Target结合的编译器和编译选项。

配置部分主要完成以下几个工作:

a) 基于Android 产品的配置(product config):选择构建安装的运行程序(user package)

b) 设置target 等相关变量TARGET_ARCH, TARGET_OS,TARGET_BUILD_TYPE, TARGET_PREBUILT_TAG

c) 根据编译环境设置host等相关变量HOST_OS, HOST_ARCH,HOST_BUILD_TYPE, HOST_PREBUILT_TAG

d) 编译target上运行程序所需的工具链及编译参数设置,如linux-arm-

cc,cflag,include目录等。

e) 编译host上运行程序所需的工具链及编译参数设置。

下图简要介绍了Android build system的配置部分的主要构成及相互关系。

二、初始化参数设置

在main.mk里,简单设置几个主要编译路径的变量后,来到config.mk:

——————————————config.mk——————————————

其中设置了源文件的一系列路径,包括头文件、库文件、服务、API已经编译工具的路径。(前36行)

从40行开始,定义一些编译模块的生成规则:

除了CLEAR_V ARS是清楚本地变量之外,其他所有的都对应了一种模块的生成规则,每一个本地模块最后都会include其中的一种来生成目标模块。

回到config.mk,接着会尝试读取buildspec.mk的设置:

如同注释所说,会尝试查找buildspec.mk,如果文件不存在会自动使用环境变量的设置,如果仍然未定义,会按arm默认的设置去build。

这里的buildspec.mk可以自己创建,也可以将原先build/下的buildspec.mk.default直接命名为buildspec.mk并移到根目录。

实际上,buildspec.mk配置都被屏蔽了,我们可以根据需要直接打开和修改一些变量。在这里我们可以加入自己的目标产品信息:

ifndef TARGET_PRODUCT

TARGET_PRODUCT:=generic_x86

endif

以及输出目录设置:

OUT_DIR:=$(TOPDIR)generic_x86

三、读取Product的设定

回到config.mk,接着进行全局变量设置,进入envsetup.mk:

——————————————envsetup.mk——————————————

里面的大部分函数都在build/envsetup.sh中定义。

首先,设置版本信息,(11行)在build/core/version_defaults.mk中具体定义平台版本、SDK版本、Product版本,我们可以将BUILD_NUMBER作为我们产品generic_x86的version信息,当然,也可以自定义一个版本变量。

回到envsetup.mk,接着设置默认目标产品(generic),这里由于我们在buildspec.mk里设置过TARGET_PRODUCT,事实上这个变量值为generic_x86。

然后读取product的设置(41行),具体实现在build/core/product_config.mk中,进而进入product.mk,从build/target/product/AndroidProducts.mk中读出

PRODUCT_MAKEFILES,这些makefile各自独立定义product,而我们的产品generic_x86也应添加一个makefile文件generic_x86.mk。在generic_x86.mk中我们可以加入所需编译的PRODUCT_PACKAGES。

下面为generic_x86.mk:

相关文档
最新文档