1. 概述
Android 编译系统是Android源码的一部分,在学习Android编译系统之前,可以参照使用AndroidStudio查看并调试Android源码 来搞定源码和编译环境
Android Build 系统用来编译 Android 系统,Android SDK 以及相关文档。该系统主要由 Make 文件,BP文件,Shell 脚本以及 Python 脚本组成,其中最主要的是 Make 文件和BP文件。
Build 系统中最主要的处理逻辑都在 Make 文件中,而其他的脚本文件只是起到一些辅助作用
整个 Build 系统中的 Make 文件可以分为三类:
-
第一类是 Build 系统核心文件
此类文件定义了整个 Build 系统的框架,而其他所有 Make 文件都是在这个框架的基础上编写出来的。Build 系统核心文件全部位于 aosp/build/core -
第二类是针对某个产品(一个产品可能是某个型号的手机或者平板电脑)的 Make 文件
这些文件通常位于 device 目录下,该目录下又以公司名以及产品名分为两级目录,对于一个产品的定义通常需要一组文件,这些文件共同构成了对于这个产品的定义。如图device下的AAA代表公司名称,F16代表产品编号
-
第三类是针对某个模块的 Make 文件。
整个系统中,包含了大量的模块,每个模块都有一个专门的 Make 文件,这类文件的名称统一为“Android.mk”,该文件中定义了如何编译当前模块。Build 系统会在整个源码树中扫描名称为“Android.mk”的文件并根据其中的内容执行模块的编译。
2. 编译 Android 系统
关于源码的下载,编译和调试,可以查看:使用AndroidStudio查看并调试Android源码

核心的编译命令只有以下3句:
source build/envsetup.sh
lunch XXX
make -j8
source build/envsetup.sh
命令 source build/envsetup.sh
引入了 build/envsetup.sh
脚本。该脚本的作用是初始化编译环境,并引入一些辅助的 Shell 函数,这其中就包括第二步使用 lunch 函数。
当我们执行过 source build/envsetup.sh
后可以使用 hmm
命令来查看常用的一些命令的含义:
除此之外,该文件中还定义了其他一些常用的函数,这些函数分为以下几类
编译指令
命令 | 说明 |
---|---|
m | 在源码树的根目录执行编译 |
mm | 编译当前路径下所有模块,但不包含依赖 |
mmm [module_path] | 编译指定路径下所有模块,但不包含依赖 |
mma | 编译当前路径下所有模块,且包含依赖(通常在第一次编译某个模块时,我们都会使用该命令) |
mmma [module_path] | 编译指定路径下所有模块,且包含依赖 |
make [module_name] | 如果无参数,则表示编译整个Android代码 |
建议:首次编译时采用make/mma/mmma编译;当依赖模块已经编译过的情况,则使用mmm/mm编译
代码搜索
命令 | 说明 |
---|---|
cgrep | 在所有C/C++文件中执行搜索 |
jgrep | 在所有Java文件中执行搜索 |
ggrep | 在所有Gradle文件中执行搜索 |
mangerp | 在所有AndroidManifest.xml文件中执行搜索 |
mgrep | 在所有Android.mk文件中执行搜索 |
sepgrep | 在所有sepolicy文件中执行搜索 |
resgrep | 在所有res/*.xml文件中执行搜索 |
sgrep | 在所有资源文件中执行搜索 |
上述指令用法最终实现方式都是基于grep指令,在当前路径下进行搜索的,各个指令用法格式:
xgrep [keyword] //xgrep代表的是上表的各个搜索指令
例如想要搜索所以AndroidManifest中包含launcher3
的位置:
mangrep launcher3
结果如图所示:
导航指令
命令 | 说明 |
---|---|
croot | 切换到Android根目录 |
cproj | 切换到工程根目录 |
godir [filename] | 跳转到包含某个文件的目录 |
这里需要注意的是cproj的原理是一层一层的执行cd ..
直到找到Android.mk文件为止,所以如果你的项目是使用Android.bp
文件作来编译的话,则这个指令会不好用.如图展示了成功和失败的情况:
成功:
失败:
可以看到DeskClock使用的是Android.bp 所以没法使用cproj来进行导航
信息查询
命令 | 说明 |
---|---|
hmm | 查询所有指令的help信息 |
findmakefile | 查询当前目录所在工程的Android.mk文件路径(对Android.bp无效) |
print_launch_menu | 查询lunch的所有可选项 |
printconfig | 查询各项编译变量值 |
gettop | 查询Android源码的根目录 |
gettargetarch | 获取TARGET_ARCH值 |
其他常用命令
- make clean:执行清理操作,等价于
rm -rf out/
- make update-api:更新API,在framework API改动后需执行该指令,Api记录在目录
frameworks/base/api