安卓官方提供的三步编译方法如下:
引入安卓shell环境配置: . build/envsetup.sh
设置编译选项,以T1项目为例, lunch msm8974sfo_lte-userdebug 或 lunch msm8974sfo-userdebug
编译: make、mm、mma。其中:
make做安卓全局编译,它会扫描并读取所有Android.mk,确定所有依赖关系,最后编译出boot.img、system.img等安卓标准文件。
make可以加一些参数,比如-jN,以N个线程进行并行编译,以加快编译速度。你可以试试不同的N值,一般以你的CPU核数*1~2是比较合理的。取太 小的值会使编译变慢,取太大的值会使系统变得剧慢,并且也会使编译变慢(系统大部分时间用于进程切换,而不是真正的工作进展)。
还可以给make指定其它编译目标(make targets),比如bootimage,这样的话就可以只编译boot.img。
mm做当前目录编译,并且不读取所有Android.mk,所以其编译速度是非常快的。但前提是你已经做过完整编译(或者至少当前目录的所有依赖都已经编译过——见下一条mma命令)。
mma做当前目录编译,并读取所有Android.mk,并且编译当前目录下的make targets的所有依赖。
大部分时候,建议使用mm。第一次编译,推荐使用mma。实在没办法的情况下,才使用make做全局编译。因为安卓全局编译实在是太费时间了。
mma的工作原理是解析出当前目录下的make targets,然后调用make并传入相应的make targets。
mm的工作原理是解析出当前目录下的make targets,然后调用make并传入相应的make targets,并且设置 ONE_SHOT_MAKEFILE= M环境变量,其中 M 是当前目录下的 Android.mk 在代码树中的路径(就是因为这个变量的存在,使安卓编译系统不再查找并读取其他Android.mk)