zoukankan      html  css  js  c++  java
  • android ninja【转】

    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。

    之后的流程参考原链接;

  • 相关阅读:
    练习四十:数组逆向输出
    练习三十九:数组插入排序
    Java awt组件间的继承关系
    java ArrayList
    java Scanner中的hasNext()方法
    java中String对象的存储位置
    java初始化块执行顺序
    java二维数组
    java数组变量
    Java数组初始
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/9191725.html
Copyright © 2011-2022 走看看