天下之事常成于困约,而败于奢靡。这篇文章主要讲述Android7.0 Ninja编译原理相关的知识,希望能为你提供帮助。
引言
使在android N的系统上,
初次使用了Ninja的编译系统。对于Ninja,
最初的印象是用在了Chromium open source code的编译中,
在chromium的编译环境中,
使用ninja -C out/Default chrome命令,
就可以利用源码编译出chrome的apk。对使用者而言,
抛开对原理的探究,
最直观的印象莫过于可以清楚的看到自己当前编译的进度。同时,
对android而言,
也可以感受到编译速度的提升带来的便捷。本文将深入分析Ninja的编译原理,
以及android上面的编译改变。
正因为这个改变,
所以在编译android N的code的时候需要使用OpenJDK8
编译系统的内存最少需要12G,
建议16G,
否则会出现JVM不足的错误。
8G内存的机器可以通过增大JVM默认值的方法来解决,
但是经过测试,
还是会偶尔出现JVM不足的错误
exportjava_OPTS=
'
-Xmx4096M'
概念简介
名词:
Ninja | Blueprint | Soong |
Ninja
Ninja是一个致力于速度的小型编译系统( 类似于Make) ;
如果把其他编译系统比做高级语言的话, Ninja就是汇编语言
主要有两个特点:
1、可以通过其他高级的编译系统生成其输入文件;
2、它的设计就是为了更快的编译;
使用Kati把makefile转换成Ninja files, 然后用Ninja编译
在不久的将来, 当不再用Makefile( Android.mk) 时, Kati将被去掉
ninja核心是由C/C+ + 编写的, 同时有一部分辅助功能由python和shell实现。由于其开源性, 所以可以利用ninja的开源代码进行各种个性化的编译定制。
Github地址: https://github.com/ninja-build/ninja
Blueprint, Soong
Blueprint和Soong是用于一起把Blueprint 文件转换为Ninja文件。 将来需要写Blueprint文件( Android.bp) , 转换为Android.soong.mk( 也可以直接写) , 然后转换为Ninja文件( build.ninja) 然后用Ninja编译。
如果Android.mk和Android.bp同时存在, Android.mk会被忽略。
如果Android.bp的同级目录下有Android.soong.mk也会被include
1.ckati可执行文件的生成
在android系统中, 目前还未完全切换到Ninja编译, 编译的入口仍然是make命令, 如下commands以nexus为例:
source build/envsetup.sh
choosecombo
make -j4
在这边可以看到, 最终编译使用的命令仍然是make.
既然是make, 那就在编译中首先include到的就是build/core/main.mk了, 在main.mk中, 我们可以清楚的看到对Ninja的调用:
relaunch_with_ninja :=
ifneq ($(USE_NINJA),false)
ifndef BUILDING_WITH_NINJA
relaunch_with_ninja := true
endif
endif
由于USE_NINJA默认没有定义, 所以一定会进入到这个选项中, 并且将relaunch_with_ninja置为true。这样的话, 就会进入到下面的重要操作语句, 去include ninja的makefile.并且在out目录下生成ninja_build的文件, 显示当前是使用了ninja的编译系统。
ifeq ($(relaunch_with_ninja),true)
# Mark this is a ninjabuild.
$(shell mkdir -p $(OUT_DIR)& & touch $(OUT_DIR)/ninja_build)
includebuild/core/ninja.mk
else # !relaunch_with_ninja
ifndef BUILDING_WITH_NINJA
# Remove ninja build mark ifit exists.
$(shell rm -f $(OUT_DIR)/ninja_build)
endif
在include build/core/ninja.mk的语句执行后, 我们就可以看到真正定义ninja的地方了。由于前面简介讲了ninjia是基于开源项目编译出来的轻便的编译工具, 所以这边google肯定也对ninjia进行了修改, 编译, 并且最终生成了一个可执行的应用程序。在simba6项目中, 我们可以在prebuilts/ninja/linux-x86下面找到这个可执行的应用程序ninja。我们可以简单的运行这个ninja的命令, 比如ninja –h, 就可以了解到这个command的基本用法, 也可以看到本版本的ninja使用的base version为1.6.0。
推荐阅读
- Android 热补丁实践之路
- 深入Android内存泄露
- Android输入事件从读取到分发五(事件分发前的拦截过程)
- 权限管理二
- 特殊权限
- 理解进程概念—3
- MYSQL随笔三 服务器停电重启,mysqlPID无法启动
- MYSQL随笔四 MySQL误删除ibd文件导致数据库无法启动
- MYSQL随笔五 截取指定字符串