posts - 189,comments - 115,trackbacks - 0
Android Building System
http://blog.csdn.net/liushaogeng/article/details/5834186


最近研究了下Android的编译系统,下面结合编译我们自己的产品mobot来对整个编译系统进行必要的介绍,方便大家今 后对默认编译的修改。

 

先列出几个觉得重要的Make文件:

build/buildspec.mk

build/envsetup.sh

build/core/main.mk

build/core/envsetup.mk

build/config.mk

 

总的来说,Android以模块(module/package)的形式来组织各个系统的部件,每个模块(module/package)的目录下都会有一个Android.mk。所谓module就是指系统的Native Code,而相对于Java写的Android application称为package。

 

 

 

Makefile的主要流 程 1

初始化参数设置 2

读取Product的设定 3

读取BoardConfig 4

读取所有Module 4

产生相应的Rules,生成image 5

具体make操作: 6

完整编译 6

模块编译 6

单独编译image文件 7

一些疑问和解答: 7

 

 

 

Makefile的主要流程

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

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

 检测编译环境和目标环境

 决定目标product

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

 清除输出目录

 检查版本号

 读取Board的配置

 读取所有Module的配置

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

 生成image

初始化参数设置

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

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

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

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

Android 
Building System - bimoshi - 血域天使的个人主页

这里面除了第一个CLEAR_VARS外,其他都对应的一种模块的生成规则,每一个module都会来include其中某个来生成目标模块。

例如:

Camera模块的makefile里( Android.mk )就包含了其中的一种生成规则BUILD_PACKAGE:

Android 
Building System - bimoshi - 血域天使的个人主页

也就是Camera会按照package.mk里的生成规则去生成目标模块。

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

Android 
Building System - bimoshi - 血域天使的个人主页

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

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

 

 

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

ifndef TARGET_PRODUCT

TARGET_PRODUCT:=mobot

endif

以及输出目录设置:

OUT_DIR:=$(TOPDIR)mobot

读取Product的设定

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

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

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

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

Android Building System - bimoshi - 血域天使的个人主页

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

然后读取product的设置(41行), 具体实现在build/core/ product_config.mk 中,进而进入product.mk,从build/target/product/ AndroidProducts.mk 中读出PRODUCT_MAKEFILES,这些makefile各自独立定义product,而我们的产品mobot也应添加一个makefile文件mobot.mk。在mobot.mk中我们可以加入所需编译的PRODUCT_PACKAGES。

下面为HOST配置信息及输出目录,最后打印相关信息:

Android 
Building System - bimoshi - 血域天使的个人主页

读取BoardConfig

接着回到config.mk,(114行)这 里会搜索所有的BoardConfig.mk,主要有以下两个地方:

$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk 

vendor/*/$(TARGET_DEVICE)/BoardConfig.mk 

这里的TARGET_DEVICE就是mobot,就是说为了定义我们自己的产品mobot,我们要在build/target/board下添加一个自己的 目录mobot用来加载自己 的board配置。

在BoardConfig.mk中会决定是否编译bootloader、kernel等信息。

读取所有Module

结束全局变量配置后,回到main.mk,马上对编译工具及版本进行检查,错误便中断编译。

142行,包含文件 definitions.mk ,这里面定义了许多变量和函数供main.mk使用。main.mk第446行,这里会去读取所有的Android.mk文件:

include $(ONE_SHOT_MAKEFILE)

这个 ONE_SHOT_MAKEFILE 是在前面提到 的mm(envsetup.mk)函数中赋 值的:

ONE_SHOT_MAKEFILE=$M make -C $T files $@

而M=$(findmakefile),最终实现在:

Android 
Building System - bimoshi - 血域天使的个人主页

回到main.mk,最终将遍历查找到的所有子目录下的Android.mk的路径保存到subdir_makefiles变量里(main.mk里的470行):

Android 
Building System - bimoshi - 血域天使的个人主页

我们在package/apps下每个模块根目录都能看到Android.mk,里面会去定义当前本地模块的Tag: LOCAL_MODULE_TAGS ,Android会通过这个Tag来决定哪些本地模块会编译进系统,通过PRODUCT和LOCAL_MODULE_TAGS来决定哪些应用包会编译进系统。( 前面说 过,你也能通过buildspec.mk来 制定你要编译进系统的模块 )

这个过 程在mian.mk的445行开始,最后需要编译的模块路径打包到ALL_DEFAULT_INSTALLED_MODULES (602行):

Android 
Building System - bimoshi - 血域天使的个人主页

 

产生相应的Rules,生成image

所有需要配置的准备工作都已完成,下面该决定如何生成image输出文件了,这一过程实际上在build/core/Makefile中处理的。

这里定义各种img的生成方式,包括ramdisk.img、userdata.img、system.img、update.zip、recover.img等。具体对应的rules可以参考下图:

http://p.blog.csdn.net/images/p_blog_csdn_net/yili_xie/EntryImages/20091214/make%20goals.png

当Make include所有的文件,完成对所有make文件的解析以后就会寻找生成 对应目标 的规则,依次生成它的依赖,直到 所有满足的模块被编译好,然后使用相应的工具打包成相应的img。

 

具体make操作:

完整编译

我们在根目录下输入make命令即可开始完全编译。这个命令实际编译生成的默认目标是droid:

Android 
Building System - bimoshi - 血域天使的个人主页

也就是说,大家敲入make实际上执行的make droid。而接下来大家看看main.mk文件里最后面的部分,会有很多伪目标,如sdk、clean、clobber等,这些在默认的make droid的命令下是不会执行的。我们可以在make后加上这些标签来单独实现一些操作。如:输入make sdk 将会生成该版本对应的SDK,输入make clean会清除上次编译的输出。

模块编译

有时候我们只修改了某一个模块,希望能单独编译这个模块而不是重新完整编译一次,这时候我们要用到 build/envsetup.sh中提供的几个bash的帮助函数。

在 源代码根目录下执行:

.  build/envsetup.sh(.后面有空格)

这 样大家相当于多了几个可用的命令。

这 时可以用help命令查看帮助信息:

Android 
Building System - bimoshi - 血域天使的个人主页

其中对模块编译有帮助的是tapas、m、mm、mmm这几个命令。

1、 tapas——以交互方式设置build环境变量。

   输入:tapas

    第一步,选择目标设备:

Android 
Building System - bimoshi - 血域天使的个人主页

     例如 我们选择1

    第二步,选择代码格式:

Android Building System - bimoshi - 血域天使的个人主页

我们选择1

第三步,选择产品平台:

Android 
Building System - bimoshi - 血域天使的个人主页

     注意:这里,Google源代码里默认是generic,而我们针对自己的产品应修改成mobot

           具体在build/envsetup.sh里的函数chooseproduct()中对相应代码进行修 改。

 

2、 m、mm、mmm使用独立模块的make命令。

几个命 令的功能使用help命令查看。

举个例 子,我们修改了Camera模块的代码,现 在需要重新单独编译这一块,这时可以使用mmm命令,后面跟指定模块的路径(注意是模块的根目录)。

具体如 下:

mmm packages/apps/Camera/

为了可 以直接测试改动,编译好后需要重新生成system.img

可以执 行:make snod

单独编译image文件

一般我 们完整编译后,会生成三个重要的image文 件:ramdisk.img、system.img和userdata.img。当然我们可以分开单独去编译 这三个目标:

make ramdisk —— ramdisk.img

make userdataimage —— userdata.img

make systemimage  —— system.img

一些疑问和解答:

1)  什么是recovery.img?

顾名思义,recovery.img是为了恢复系统的,相对于普通的boot.img,recovery.img多了一些图片文件(恢复时界面的背景)、/sbin/recovery/目录(跟 恢复有关的二进制文件),一 些初始化文件也不相同(init.rc、init.goldfish.rc、default.prop)

这就是为什么启 动恢复模式时会进入类似文本界面而不是图形界面。

将recovery.img文件复制到SD卡中,进入shell下输入:

mount -a

flash_image recovery /sdcard/recovery.img

若提示“no space on device”,可用fastboot模式刷

fastboot erase recovery

fastboot flash recovery recovery.img

在关机状态下按home+power键进入recovery模式,根据选项选择需要的操作。

 

2)  make sdk和make droid编译有什么不同?

make sdk:

其实,执行make sdk,编译后会在目录out/host/linux-x86里生成sdk目录,这个sdk和官方下载的sdk包是一样的,可以直接使用。

make droid:

实际上droid就是默认的生成目标,和直接敲make是一样的,都会完整编译出目标image文件,但不会编译出sdk。

 

3)  我们将默认产 品改为mobot,那我怎么编译原先的generic?

其实,无论编译哪个目标产品版本,只要产品相关设置存在,都可以直接在编译时加上目标产品名来编译。会在out/target/product/下生成对应的 产品输出目录,如:要编译generic版本:

make TARGET_PRODUCT := generic


原帖:http://bimoshi.blog.163.com/blog/static/14613297201022233711527/


posted on 2011-10-19 16:53 MEYE 阅读(669) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: