摘要:编译原理引言使在的系统上,初次使用了的编译系统。编译系统的内存最少需要,建议,否则会出现不足的错误。地址和是用于一起把文件转换为文件。如果和同时存在,会被忽略。
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不足的错误
export JAVA_OPTS="-Xmx4096M"概念简介
名词:
Ninja | Blueprint | Soong |
---|
Ninja是一个致力于速度的小型编译系统(类似于Make);
如果把其他编译系统比做高级语言的话,Ninja就是汇编语言
主要有两个特点:
可以通过其他高级的编译系统生成其输入文件;
它的设计就是为了更快的编译;
使用Kati把makefile转换成Ninja files,然后用Ninja编译
在不久的将来,当不再用Makefile(Android.mk)时,Kati将被去掉
ninja核心是由C/C++编写的,同时有一部分辅助功能由python和shell实现。由于其开源性,所以可以利用ninja的开源代码进行各种个性化的编译定制。
Github地址: https://github.com/ninja-build/ninja
Blueprint, SoongBlueprint和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
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。
之后的流程参考原链接;
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/3005.html
摘要:目前,的标准库可以被编译运行在环境下,这就意味着我们可以在一个承载着系统的移动设备上运行代码。本部分也就是说明如何在设备上运行熟知的。需要注意的是,虽然现在编译器能够直接在设备上运行代码,但是并不意味着你可以用来直接写一个了。 Quick Start Getting Started with Swift on Android 目前,Swift的标准库stdlib可以被编译运行在Andr...
摘要:本文使用清华大学镜像下载源码,具体步骤参考清华大学镜像提供的教程。 macOS High Sierra 版本 10.13.4 Xcode 9.3 aosp分支:android-8.1.0_r20 准备编译环境 具体参考官方文档 安装 jdk8u45 or newer 安装xcode命令行 xcode-select --install 安装编译需要用到的其他包 使用Homebr...
摘要:但苹果在中新加的组件能把这些步骤简化许多进入的世界吧的新纪元的设计得很完善,可扩展性也很好。如果你需要在苹果提供的时间函数之外自定义另一种时间曲线,只需传进一个实现协议的对象。为提供了详尽的文档。 《iOS 10 day by day》是 shinobicontrols 公司编写的系列博客,介绍开发者需要了解的 iOS 10 新特性,每周更新。本系列翻译(文集地址)已取得官方授权。目...
摘要:我们需要知道的是,对于而言,匿名函数是一个很重要且具有逻辑性的特性。通常,匿名函数的使用情况是创建一个供以后使用的函数。截图自忍者秘籍通过完善之前对匿名函数的粗略定义,我们可以修复解决这个问题。 从名字即可看书,此篇博客总结与《JavaScript忍者秘籍》。对于JavaScript来说,函数为第一类型对象。所以这里,我们主要是介绍JavaScript中函数的运用。 系列博客地址:h...
摘要:作为一个扫描框架,可不仅仅只有这样简单的功能,他是一个专门为大型网络扫描所设计的框架,兼顾效率的同时,支持插件的开发。这个扫描框架有着一个很萌的名字(企鹅忍者),同时它还有其他优秀的特性,开源,支持插件,高效。 NINJA-PingU作为一个扫描框架,可不仅仅只有ping这样简单的功能,他是一个专门为大型网络扫描所设计的框架,兼顾效率的同时,支持插件的开发。 showImg(http:/...
阅读 2554·2021-11-22 14:45
阅读 2300·2021-11-12 10:34
阅读 751·2021-10-15 09:41
阅读 875·2021-09-27 13:35
阅读 3337·2021-09-09 11:56
阅读 2513·2019-08-30 13:03
阅读 3063·2019-08-29 16:32
阅读 3086·2019-08-26 13:49