Android 编译命令

Android 编译命令

一、编译命令

编译Android源码的第一步

# 在源码根目录执行
source build/envsetup.sh

其中source命令就是用于运行shell脚本命令,功能等价于”.”,因此该命令也等价于. build/envsetup.sh。在文件envsetup.sh声明了当前会话终端可用的命令,这里需要注意的是当前会话终端,也就意味着每次新打开一个终端都必须再一次执行这些指令。

source envsetup.sh  #初始化编译环境,包括后面的lunch和make指令
lunch #指定此次编译的目标设备以及编译类型,可以直接跟数字(没有指定的话,会出现选项)
make  -j12 #开始编译,默认为编译整个系统,其中-j12代表的是编译的job数量为12。

所有的编译命令都在envsetup.sh文件能找到相对应的function,比如上述的命令lunch,make,在文件一定能找到

function lunch(){
    ...
}

function make(){
    ...
}

source envsetup.sh,需要cd到envsetup.sh文件所在路径执行,路径可能在build/envsetup.sh,或者integrate/envsetup.sh,再或者不排除有些厂商会封装自己的.sh脚本,但核心思路是一致的。

1.1 代码编译

编译指令    #解释
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],
或者 mm -B [module_path]。

对于m、mm、mmm、mma、mmma这些命令的实现都是通过make方式来完成的。
mmm/mm编译的效率很高,而make/mma/mmma编译较缓慢;
make/mma/mmma编译时会把所有的依赖模块一同编译,但mmm/mm不会;

  • 首次编译时采用make/mma/mmma编译;
  • 当依赖模块已经编译过的情况,则使用mmm/mm编译。

1.2 代码搜索

搜索指令 解释
cgrep 所有C/C++文件执行搜索操作
jgrep 所有Java文件执行搜索操作
ggrep 所有Gradle文件执行搜索操作
mangrep [keyword] 所有AndroidManifest.xml文件执行搜索操作
mgrep [keyword] 所有Android.mk文件执行搜索操作
sepgrep [keyword] 所有sepolicy文件执行搜索操作
resgrep [keyword] 所有本地res/*.xml文件执行搜索操作
sgrep [keyword] 所有资源文件执行搜索操作
#上述指令用法最终实现方式都是基于grep指令,各个指令用法格式:
xgrep [keyword]  

#搜索所有AndroidManifest.xml文件中的launcher关键字所在文件的具体位置,指令
mangrep launcher

#搜索所有Java代码中包含zygote所在文件
jgrep zygote

#搜索所有system_app的selinux权限信息
sepgrep system_app

1.3 导航指令

导航指令    解释
croot   切换至Android根目录
cproj   切换至工程的根目录
godir [filename]    跳转到包含某个文件的目录
Tips: 当每次修改完某个文件后需要编译时,执行cproj后会跳转到当前模块的根目录,也就是Android.mk文件所在目录,然后再执行mm指令,即可编译目标模块;当进入源码层级很深后,需要返回到根目录,使用croot一条指令完成;另外cd - 指令可用于快速切换至上次目录。

1.4 信息查询

查询指令    解释
hmm 查询所有的指令help信息
findmakefile    查询当前目录所在工程的Android.mk文件路径
print_lunch_menu    查询lunch可选的product
printconfig 查询各项编译变量值
gettop  查询Android源码的根目录
gettargetarch   获取TARGET_ARCH值
2.5 其他指令
上述只是列举比较常用的指令,还有其他指令,而且不同的build编译系统,支持的指令可能会存在一些差异,当忘记这些编译指令,可以通过执行hmm,查询指令的帮助信息。

最后再列举两个比较常用的指令:

make clean:执行清理操作,等价于 rm -rf out/
make update-api:更新API,在framework API改动后需执行该指令,Api记录在目录frameworks/base/api;

二、编译系统

Android 编译系统是Android源码的一部分,用于编译Android系统,Android SDK以及相关文档。该编译系统是由Make文件、Shell以及Python脚本共同组成,其中最为重要的便是Make文件。

2.1 Makefile分类

整个Build系统的Make文件分为三大类:

  • 系统核心的Make文件:定义了Build系统的框架,文件全部位于路径/build/core,其他Make文件都是基于该框架编写的;

  • 针对产品的Make文件:定义了具体某个型号手机的Make文件,文件路径位于/device,该目录下往往又以公司名和产品名划分两个子级目录,比如/device/qcom/msm8916

  • 针对模块的Make文件:整个系统分为各个独立的模块,每个模块都一个专门的Make文件,名称统一为"Android.mk",该文件定义了当前模块的编译方式。Build系统会扫描整个源码树中名为Android.mk的文件,并执行相应模块的编译工作。

2.2 编译产物

经过make编译后的产物,都位于/out目录,该目录下主要关注下面几个目录:

/out/host:#Android开发工具的产物,包含SDK各种工具,比如adb,dex2oat,aapt等。
/out/target/common:#通用的一些编译产物,包含Java应用代码和Java库;
/out/target/product/[product_name]:#针对特定设备的编译产物以及平台相关C/C++代码和二进制文件;

在/out/target/product/[product_name]目录下,有几个重量级的镜像文件:

system.img:#挂载为根分区,主要包含Android OS的系统文件;
ramdisk.img:#主要包含init.rc文件和配置文件等;
userdata.img:#被挂载在/data,主要包含用户以及应用程序相关的数据;

当然还有boot.img,reocovery.img等镜像文件,这里就不介绍了。

你可能感兴趣的:(Android 编译命令)