一、最常见的几个编译的命令:
source build/envsetup.sh
lunch 型号-编译类型
make -j12
深入理解到Android Build(编译)系统。
二、编译命令
编译Android源码的第一步:source build/envsetup.sh source命令是Linux运行脚本的命令类似“.”,文件build/envsetup.sh在加载的过程中,在device目录寻中寻找那些名称为vendorsetup.sh的文件,并且将他们加载到终端来。另外,在sdk/bash_completion目录下的adb.sh文件,也加载到终端来,它是使用adb命令的bash completion工能的。加载该文件之后,我们在运行adb相关的命令的时候,通过按tab键可以自动的帮助我们完成命令的输入。
1、新增了lunch,m,mm,mmm命令
2、将vendor和device目录下的vendorsetup.sh加载到终端;
输入lunch
当输入lunch命令输出一个lunch菜单,该菜单列出了当前Android源码支持的所有设备类型,比如:full-eng表示的设备full即为emulation,lunch 命令帮我们设置很多环境变量,设置环境变量,就配置好了Android编译环境。Android编译环境初始化之后,获得了以下三个东西。
通过执行lunch命令设置好TARGET_PRODUCT、TARGET_BUILD_VARIANT、TARGET_BUILD_TYPE和TARGET_BUILD_APPS等环境变量。以上几个参数在编译的时候使用的用处十分的重要。
2、代码编译
编译指令 | 解释 |
---|---|
m | 在源码树的根目录执行编译 |
mm | 编译当前路径下所有模块,但不包含依赖 |
mmm [module_path] | 编译指定路径下的所有模块,但不包含依赖 |
mma | 编译当前路径下所有模块,且包含依赖 |
mmma [module_path] | 编译当前路径下所有的模块,且包含依赖 |
make [module_name] | 无参数,则表示编译整个Android代码 |
下面列举部分模块的编译指令
模块 | make 命令 | mmm命令 |
---|---|---|
init | make init | mmm system/core/init |
zygote | make app_process | mmm frameworks/base/cmds/app_process |
system_server | make services | mmm frameworks/base/services |
java framework | make framework | mmm frameworks/base |
framework资源 | make framework-res | mmm frameworks/base/core/res |
jni framework | make libandroid_runtime | mmm frameworks/base/core/jni |
binder | make libbinder | mmm frameworks/native/libs/binder |
上述mmm 命令同样适用于mm/mma/mmma,编译系统采用的采用是增量编译,只会编译发生变化的目标文件。当需要重新编译所有的相关模块,则需要编译命令后增加参数 -B 比如make -B[module_name],或者mmm -B [module_path]
- 对于m、mm、mmm、mma、mmma这些命令都是make方式来完成的。
- mm/mmm编译的效率很高,而make/mma/mmma编译较缓慢
- make/mma/mmma编译时会把所有的依赖模块一同编译,但是当依赖模块已经编译的情况,则使用mm/mmm编译。
代码搜索
搜索指令 | 解释 |
---|---|
cgrep | 所有C/C++文件执行搜索操作 |
jgrep | 所有java文件执行搜索操作 |
ggrep | 所有Gradle文件执行搜索操作 |
mangrep [keyword] | 所有AndroidManifest.xml文件执行搜索操作 |
mgrep [keyword] | 所有Android.mk文件执行搜索操作 |
sepgrep [keyword] | 所有sepolicy文件执行搜索操作 |
resgrep[keyword] | 所有本地res/*.xml文件执行搜索操作 |
sgrep[keyword] | 所有资源文件执行搜索操作 |
导航指令
导航指令 | 解释 |
---|---|
croot | 切换至Android根目录 |
cproj | 切换至工程的根目录 |
godir[filename] | 跳转到包含某个文件的文件夹 |
当每次修改某个文件后需要编译时,执行cproj后就会跳转到当前模块的根目录,也就是Android.mk文件所在目录,然后在执行mm指令,即可编译目标模块;当进入源码层级很深后,需要返回到根目录,执行croot一条指令完成,另外cd -指令可用于快速切换至上次的目录
其他指令
上述只是列举比较常用的指令,还有其他的指令,而且不同的build编译系统,支持的指令可能会存在一些差异,当忘记这些编译指令,可以通过执行hmm,查询指令的帮助信息。
最后在列举俩个比较常用的指令:
- make clean:执行清理操作,等价于rm -rf out/
- make update-api:更新API,在framework API改动后需执行该指令,Api记录在目录frameworks/base/api;