没有合适的资源?快使用搜索试试~ 我知道了~
理解 Android Build 系统1
需积分: 0 0 下载量 201 浏览量
2022-08-04
00:44:23
上传
评论
收藏 605KB PDF 举报
温馨提示
试读
13页
前言Android Build 系统是 Android 源码的一部分。关于如何获取 Android 源码,请参照 Android Source 官方网站:And
资源详情
资源评论
资源推荐
在 IBM Bluemix 云平台上
开发并部署您的下一个应
用。
开始您的试用
开始您的试用
IBM
Bluemix
点击按钮,开始云上的开发!
开始您的试用
开始您的试用
Android Build 系统是用来编译 Android 系统,Android SDK 以及相关文档的一套框架。众所周知,Android 是一个开源
的操作系统。Android 的源码中包含了许许多多的模块。 不同产商的不同设备对于 Android 系统的定制都是不一样的。
如何将这些模块统一管理起来,如何能够在不同的操作系统上进行编译,如何在编译时能够支持面向不同的硬件设备,
不同的编译类型,且还要提供面向各个产商的定制扩展,是非常有难度的。 但 Android Build 系统很好的解决了这些问
题,这里面有很多值得我们开发人员学习的地方。对于 Android 平台开发人员来说,本文可以帮助你熟悉你每天接触到
的构建环境。对于其他开发人员来说,本文可以作为一个 GNU Make 的使用案例,学习这些成功案例,可以提升我们的
开发经验。
强波,就职于富士通南大软件技术有限公司。一直从事 Java 开发,对 Java 虚拟机,软件架构以及云计算等技术有浓厚兴趣。
2013 年 3 月 28 日
前言
Android Build 系统是 Android 源码的一部分。关于如何获取 Android 源码,
请参照 Android Source 官方网站:
http://source.android.com/source/downloading.html
。
Android Build 系统用来编译 Android 系统,Android SDK 以及相关文档。该
系统主要由 Make 文件,Shell 脚本以及 Python 脚本组成,其中最主要的是
Make 文件。
众所周知,Android 是一个开源的操作系统。Android 的源码中包含了大量的开源项目以及许多的模块。不
同产商的不同设备对于 Android 系统的定制都是不一样的。
如何将这些项目和模块的编译统一管理起来,如何能够在不同的操作系统上进行编译,如何在编译时能够
支持面向不同的硬件设备,不同的编译类型,且还要提供面向各个产商的定制扩展,是非常有难度的。
但 Android Build 系统很好的解决了这些问题,这里面有很多值得我们开发人员学习的地方。
对于 Android 平台开发人员来说,本文可以帮助你熟悉你每天接触到的构建环境。
对于其他开发人员来说,本文可以作为一个 GNU Make 的使用案例,学习这些成功案例,可以提升我们的
开发经验。
概述
Build 系统中最主要的处理逻辑都在 Make 文件中,而其他的脚本文件只是起到一些辅助作用,由于篇幅所
限,本文只探讨 Make 文件中的内容。
整个 Build 系统中的 Make 文件可以分为三类:
第一类是 Build 系统核心文件,此类文件定义了整个 Build 系统的框架,而其他所有 Make 文件都是在这个
框架的基础上编写出来的。
图 1 是 Android 源码树的目录结构,Build 系统核心文件全部位于 /build/core(本文所提到的所有路径都是
以 Android 源码树作为背景的,“/”指的是源码树的根目录,与文件系统无关)目录下。
developerWorks 中国
developerWorks 中国
技术主题
技术主题
Open source
Open source
文档库
文档库
理解 Android Build 系统
理解 Android Build 系统
理解AndroidBuild系统 https://www.ibm.com/developerworks/cn/openso...
1of13 2016年06月15日18:13
图 1. Android 源码树的目录结构
第二类是针对某个产品(一个产品可能是某个型号的手机或者平板电脑)的 Make 文件,这些文件通常位
于 device 目录下,该目录下又以公司名以及产品名分为两级目录,图 2 是 device 目录下子目录的结构。
对于一个产品的定义通常需要一组文件,这些文件共同构成了对于这个产品的定义。例如,/device/sony
/it26 目录下的文件共同构成了对于 Sony LT26 型号手机的定义。
图 2. device 目录下子目录的结构
第三类是针对某个模块(关于模块后文会详细讨论)的 Make 文件。整个系统中,包含了大量的模块,每
个模块都有一个专门的 Make 文件,这类文件的名称统一为“Android.mk”,该文件中定义了如何编译当前
模块。Build 系统会在整个源码树中扫描名称为“Android.mk”的文件并根据其中的内容执行模块的编译。
理解AndroidBuild系统 https://www.ibm.com/developerworks/cn/openso...
2of13 2016年06月15日18:13
编译 Android 系统
执行编译
Android 系统的编译环境目前只支持 Ubuntu 以及 Mac OS 两种操作系统。关于编译环境的构建方法请参
见以下路径:
http://source.android.com/source/initializing.html
在完成编译环境的准备工作以及获取到完整的 Android 源码之后,想要编译出整个 Android 系统非常的容
易:
打开控制台之后转到 Android 源码的根目录,然后执行如清单 1 所示的三条命令即可(
"$"
是命令提示
符,不是命令的一部分。):
完整的编译时间依赖于编译主机的配置,在笔者的 Macbook Pro(OS X 10.8.2, i7 2G CPU,8G RAM,
120G SSD)上使用 8 个 Job 同时编译共需要一个半小时左右的时间。
清单 1. 编译 Android 系统
$ source build/envsetup.sh
$ lunch full-eng
$ make -j8
这三行命令的说明如下:
第一行命令“source build/envsetup.sh”引入了
build/envsetup.sh
脚本。该脚本的作用是初始化编译环
境,并引入一些辅助的 Shell 函数,这其中就包括第二步使用 lunch 函数。
除此之外,该文件中还定义了其他一些常用的函数,它们如表 1 所示:
表 1. build/envsetup.sh 中定义的常用函数
名称
说明
croot
切换到源码树的根目录
m
在源码树的根目录执行 make
mm
Build 当前目录下的模块
mmm
Build 指定目录下的模块
cgrep
在所有 C/C++ 文件上执行 grep
jgrep
在所有 Java 文件上执行 grep
resgrep
在所有 res/*.xml 文件上执行 grep
godir
转到包含某个文件的目录路径
printconfig
显示当前 Build 的配置信息
add_lunch_combo
在 lunch 函数的菜单中添加一个条目
第二行命令“lunch full-eng”是调用 lunch 函数,并指定参数为“full-eng”。lunch 函数的参数用来指定此次编
译的目标设备以及编译类型。在这里,这两个值分别是“full”和“eng”。“full”是 Android 源码中已经定义好的
一种产品,是为模拟器而设置的。而编译类型会影响最终系统中包含的模块,关于编译类型将在表 7 中详
细讲解。
如果调用 lunch 函数的时候没有指定参数,那么该函数将输出列表以供选择,该列表类似图 3 中的内容
(列表的内容会根据当前 Build 系统中包含的产品配置而不同,具体参见后文“添加新的产品”),此时可以
通过输入编号或者名称进行选择。
图 3. lunch 函数的输出
理解AndroidBuild系统 https://www.ibm.com/developerworks/cn/openso...
3of13 2016年06月15日18:13
剩余12页未读,继续阅读
嘻嘻哒的小兔子
- 粉丝: 25
- 资源: 321
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0