首页 > 代码库 > android编译系统简要分析与使用

android编译系统简要分析与使用

 

开发Linux编程的程序员都清楚,Makefile是一个很重要的文件,该文件一个重要作用就是指定了编译规则。如此庞大的android系统源码当然也不例外了。

android源码中Android.mk就充当了Makefile的角色。android系统的编译系统太过复杂了,没办法,那些可都是谷歌里面的大牛们写的,对于我等程序员来说,首先最重要的就是会用啊,老板不关心你知识渊博与否,就关心你能不能搞定问题,至于如何搞定老板不关心。所以这里我只是简单的介绍下android的编译系统,目的很简单,如果要添加一个新平台的话,知道看哪些文件,修改哪些文件就可以了。

 

 

下图编译android系统的三大步骤。

 

source build/envsetup.sh

 

上面的命令引入了 build/envsetup.sh脚本。该脚本的作用是初始化编译环境,并引入一些辅助的 Shell 函数,这其中就包括第二步中选择目标所用的lunch 函数。除此之外,该文件中还定义了其他一些常用的函数,如下所示:

 

名称说明
croot切换到源码树的根目录
m在源码树的根目录执行 make
mmBuild 当前目录下的模块
mmmBuild 指定目录下的模块
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 源码中已经定义好的一种产品,是为模拟器而设置的。而编译类型会影响最终系统中包含的模块,下图所示是三种编译类型,前面的文章只是稍微提了一下:

名称说明
eng默认类型,该编译类型适用于开发阶段。
当选择这种类型时,编译结果将:
  • 安装包含 eng, debug, user,development 标签的模块
  • 安装所有没有标签的非 APK 模块
  • 安装所有产品定义文件中指定的 APK 模块
user该编译类型适合用于最终发布阶段。
当选择这种类型时,编译结果将:
  • 安装所有带有 user 标签的模块
  • 安装所有没有标签的非 APK 模块
  • 安装所有产品定义文件中指定的 APK 模块,APK 模块的标签将被忽略
userdebug该编译类型适合用于 debug 阶段。
该类型和 user 一样,除了:
  • 会安装包含 debug 标签的模块
  • 编译出的系统具有 root 访问权限

 

首先在android源码的根目录下有一个makefile文件,如下图所示,可知其指向了build/core/中的main.mk。 

android编译系统简要分析与使用