资讯专栏INFORMATION COLUMN

android ninja【转】

int64 / 3121人阅读

摘要:编译原理引言使在的系统上,初次使用了的编译系统。编译系统的内存最少需要,建议,否则会出现不足的错误。地址和是用于一起把文件转换为文件。如果和同时存在,会被忽略。

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

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

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

相关文章

  • Android设备上运行Swift代码

    摘要:目前,的标准库可以被编译运行在环境下,这就意味着我们可以在一个承载着系统的移动设备上运行代码。本部分也就是说明如何在设备上运行熟知的。需要注意的是,虽然现在编译器能够直接在设备上运行代码,但是并不意味着你可以用来直接写一个了。 Quick Start Getting Started with Swift on Android 目前,Swift的标准库stdlib可以被编译运行在Andr...

    muddyway 评论0 收藏0
  • Mac下编译Android源码,并导入IntelliJ IDEA进行源码阅读

    摘要:本文使用清华大学镜像下载源码,具体步骤参考清华大学镜像提供的教程。 macOS High Sierra 版本 10.13.4 Xcode 9.3 aosp分支:android-8.1.0_r20 准备编译环境 具体参考官方文档 安装 jdk8u45 or newer 安装xcode命令行 xcode-select --install 安装编译需要用到的其他包 使用Homebr...

    lingdududu 评论0 收藏0
  • [iOS 10 day by day] Day 4:新的动画 API UIViewPropertyA

    摘要:但苹果在中新加的组件能把这些步骤简化许多进入的世界吧的新纪元的设计得很完善,可扩展性也很好。如果你需要在苹果提供的时间函数之外自定义另一种时间曲线,只需传进一个实现协议的对象。为提供了详尽的文档。 《iOS 10 day by day》是 shinobicontrols 公司编写的系列博客,介绍开发者需要了解的 iOS 10 新特性,每周更新。本系列翻译(文集地址)已取得官方授权。目...

    Yuqi 评论0 收藏0
  • 忍者级别的JavaScript函数操作

    摘要:我们需要知道的是,对于而言,匿名函数是一个很重要且具有逻辑性的特性。通常,匿名函数的使用情况是创建一个供以后使用的函数。截图自忍者秘籍通过完善之前对匿名函数的粗略定义,我们可以修复解决这个问题。 从名字即可看书,此篇博客总结与《JavaScript忍者秘籍》。对于JavaScript来说,函数为第一类型对象。所以这里,我们主要是介绍JavaScript中函数的运用。 系列博客地址:h...

    suemi 评论0 收藏0
  • 高效开源的网络扫描框架 —— NINJA-PingU

    摘要:作为一个扫描框架,可不仅仅只有这样简单的功能,他是一个专门为大型网络扫描所设计的框架,兼顾效率的同时,支持插件的开发。这个扫描框架有着一个很萌的名字(企鹅忍者),同时它还有其他优秀的特性,开源,支持插件,高效。 NINJA-PingU作为一个扫描框架,可不仅仅只有ping这样简单的功能,他是一个专门为大型网络扫描所设计的框架,兼顾效率的同时,支持插件的开发。 showImg(http:/...

    BingqiChen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<