Android中make命令的目标

make命令的Target,由Makefile决定。 一般情况下,make <TAB>可以通过Bash的补全,看到一个Makefile的所有Target。 而Android中的Makefile过于复杂,补全时会卡住,难以列出。

本文记录一些Android(8.0.0)平台项目中有用的make目标。

产物目标

Target Description
all 编译Android的一切(部分Target例外)。
droid Android项目的默认Target,make droid等价于make
droidcore Android核心的产物,如system.img、boot.img等。
snod 快速重新编译system.img。
vnod 快速重新编译vendor image。
libandroid_runtime 编译JNI framework。
framework 编译Java framework。
services 编译系统服务(Java)与相关。
apps_only Android平台自带的上层应用。
files 编译所有会真正安装到ROM中的Module。
sdk 编译生成Android SDK。
ndk 编译生成Android NDK。
docs out/target/common/docs生成文档。
notice_files 生成所有NOTICE文件。
javac-check 用javac(而非jack)编译java文件,需要在已经完整编译后使用。

Target之间,也是有复杂的相互关系的。 droid大概由droidcore(主要是中下层)和apps_only(主要是上层)两部分组成,而droidcore与apps_only也并非没有交集。

droidcore里还依赖了以下Target,其含义不做一一解释,但很容易猜出。

特殊目标

Target Description
help 显示几个常用的Target。
nothing 把所有Makefile都跑一遍,但什么也不干。
clean 清理产物,等价于rm -rf out
modules 打印所有参与编译的LOCAL_MODULE。
showcommands 打印所有编译过程中实际执行的命令。(在Ninja中无用,大概已废弃。)
package-stats 统计所有以BUILD_PACKAGE形式生成的产物信息,包括位置、大小、dex占比等。
installed-file-list 生成installed-file.txt文件,内含所有要安装到ROM的文件与大小。

单独模块

Target Description
<local_module> 单独编译某个模块
clean-<local_module> 单独清理某个模块

在已经成功编译过一次的情况下,可以通过指定LOCAL_MODULE,从项目根目录重新编译。 比如make netd,可以单独编译system/netd

此外,通过mmmmm等命令,也可以实现单独编译功能。 区别是,mm需要在当前目录下有Android.mk的位置执行,而mmm需要给定一个有Android.mk的路径。 比如,cd system/netd; mmmmm system/netd

其它

在AOSP(8.0)上,光是LOCAL_MODULE已经有了上万个,Target数目还在持续增长。 想查看其它的Target,可以从build/make/core/main.mk中,按图索骥。


相关笔记