摘要:如何通过Ninja来提升Android编译速度

阅读本文大约需要花费10分钟。

文章首发微信公众号:IngresGe

专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢!

欢迎关注我的公众号!

[Android取经之路] 的源码都基于Android-Q(10.0) 进行分析

[Android取经之路] 系列文章:

《系统启动篇》

  1. Android系统架构
  2. Android是怎么启动的
  3. Android 10.0系统启动之init进程
  4. Android10.0系统启动之Zygote进程
  5. Android 10.0 系统启动之SystemServer进程
  6. Android 10.0 系统服务之ActivityMnagerService
  7. Android10.0系统启动之Launcher(桌面)启动流程
  8. Android10.0应用进程创建过程以及Zygote的fork流程
  9. Android 10.0 PackageManagerService(一)工作原理及启动流程
  10. Android 10.0 PackageManagerService(二)权限扫描
  11. Android 10.0 PackageManagerService(三)APK扫描
  12. Android 10.0 PackageManagerService(四)APK安装流程

《日志系统篇》

  1. Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性
  2. Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化
  3. Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析
  4. Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现​

《Binder通信原理》

  1. Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要
  2. Android10.0 Binder通信原理(二)-Binder入门篇
  3. Android10.0 Binder通信原理(三)-ServiceManager篇
  4. Android10.0 Binder通信原理(四)-Native-C\C++实例分析
  5. Android10.0 Binder通信原理(五)-Binder驱动分析
  6. Android10.0 Binder通信原理(六)-Binder数据如何完成定向打击
  7. Android10.0 Binder通信原理(七)-Framework binder示例
  8. Android10.0 Binder通信原理(八)-Framework层分析
  9. Android10.0 Binder通信原理(九)-AIDL Binder示例
  10. Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式
  11. Android10.0 Binder通信原理(十一)-Binder总结

  《HwBinder通信原理》

  1. HwBinder入门篇-Android10.0 HwBinder通信原理(一)
  2. HIDL详解-Android10.0 HwBinder通信原理(二)
  3. HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)
  4. HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)
  5. HwServiceManager篇-Android10.0 HwBinder通信原理(五)
  6. Native层HIDL服务的注册原理-Android10.0 HwBinder通信原理(六)
  7. Native层HIDL服务的获取原理-Android10.0 HwBinder通信原理(七)
  8. JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)
  9. JAVA层HIDL服务的获取原理-Android10.0 HwBinder通信原理(九)
  10. HwBinder驱动篇-Android10.0 HwBinder通信原理(十)
  11. HwBinder原理总结-Android10.0 HwBinder通信原理(十一)

《编译原理》

  1. 编译系统入门篇-Android10.0编译系统(一)
  2. 编译环境初始化-Android10.0编译系统(二)
  3. make编译过程-Android10.0编译系统(三)
  4. Image打包流程-Android10.0编译系统(四)
  5. Kati详解-Android10.0编译系统(五)
  6. Blueprint简介-Android10.0编译系统(六)
  7. Blueprint代码详细分析-Android10.0编译系统(七)
  8. Android.bp 语法浅析-Android10.0编译系统(八)
  9. Ninja简介-Android10.0编译系统(九)

1.概述

上一节我们了解了Ninja的作用,虽然ninja相比make来说,提升了编译时间,但是当我们需要增量一个修改时,依旧需要花费不少时间,从log中,经常能看到前期花了很长时间,才走到“Starting ninja”这个字段,在这之前一直在做准备,那么我们要想办法提升一下ninja增量的编译速度。

2.编译分析

从Android O开始,soong已经是google的入口。从soong入口后,会经soong_ui,soong,kati,blueprint几个阶段,把mk,bp转换成ninja文件后,然后执行ninja命令解析ninja文件进行编译。

如下图所示整个编译过程,准备过程非常冗长。

每次编译都要重新收集所有的文件、.mk、.bp的修改,然后重新生成build.ninja,在合并成combined-aosp_arm.ninja。

大部分情况下,研发的工作是不断的修改.c .h .cpp .java 然后增量,此时真正的编译工作是非常少的,这样相对而言,准备工作往往是占大头的,所以我们可以考虑舍弃combined-aosp_arm.ninja之前的准备过程。

这里以增量编译init_system为例,之前我们已经编好了init_system,然后如果我们继续用m命令单编init_system,需要2分钟。

ingresge:~/AP/AOSP_Q$ time m init_system
[100% 6336/6336] Install: out/target/product/generic/fake_packages/init_system-timestamp#### build completed successfully (02:37 (mm:ss)) ####real    2m36.672s
user    43m51.510s
sys     2m51.991s

为了对比编译时间,我们直接抛弃了编译的环境和ninja文件生成的逐步过程,我们使用下面的命令直接跑ninja,结果只花了5秒。

命令:

time prebuilts/build-tools/linux-x86/bin/ninja -v -d keepdepfile init_system -f out/combined-aosp_arm.ninja -w dupbuild=err

编译结果:

ingresge:~/AP/AOSP_Q$ time prebuilts/build-tools/linux-x86/bin/ninja -v -d keepdepfile init_system -f out/combined-aosp_arm.ninja -w dupbuild=err
[7/7] /bin/bash -c "(rm -f out/target/product/generic/system/bin/init ) && (cp out/target/product/generic/obj/EXECUTABLES/init_second_stage_intermediates/init out/target/product/generic/system/bin/init )"real    0m5.351s
user    0m14.752s
sys     0m3.201s

3.qninja提升编译速度

根据上一节分析到,舍弃combined-aosp_arm.ninja的准备过程,直接指向ninja可以提升速率,因此我们可以开发一个快速的编译命令,来提升研发的编译效率。

我们可以在修改build/make/envsetup.sh,新增一个qninja函数。

function qninja()
{local cmdline="time prebuilts/build-tools/linux-x86/bin/ninja -v -d keepdepfile $@ -f out/combined-aosp_arm.ninja -w dupbuild=warn"echo $cmdline$cmdline
}

只是修改了某个模块中的.c .h .cpp .java后,进行增量,编译命令如下:

source build/envsetup.sh
qninja init_system

最终的编译时间仅仅花费了5秒:

real    0m5.351s
user    0m14.752s
sys     0m3.201s

4.总结

其实本节是提高了增量编译的速率,但是如果我们新增了.c .c++或者修改了.mk\.bp 的文件化,需要重新指向kati、soong的过程,用于手机新增文件或者新增编译参数的变化,最终重新生成combined-aosp_arm.ninja来参与编译,这个编译的速率还是会慢一些。需要在开发过程中注意这一点,以免引起qninja编译模块不生效的问题。

Ninja提升编译速度的方法-Android10.0编译系统(十)相关推荐

  1. 编译系统总结篇-Android10.0编译系统(十一)

    摘要:Android10.0编译系统总结 阅读本文大约需要花费20分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关 ...

  2. 简单提升编译速度的一个方法

    随着项目越来越大,编译速度越来越是一个问题.在编译我们的 Android App 的时候,印象里最快的时候也得一分半,当然这还是在关闭 Chrome 的时候.当你改几行代码时,仍然要花上几分钟来编译, ...

  3. Ninja简介-Android10.0编译系统(九)

    摘要:Ninja具体干了什么? 阅读本文大约需要花费16分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关注我的公众 ...

  4. js 数组 实现 完全树_JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    摘要: JS的"编译原理". 原文:JavaScript的工作原理:解析.抽象语法树(AST)+ 提升编译速度5个技巧 作者:前端小智 Fundebug经授权转载,版权归原作者所有 ...

  5. make编译过程-Android10.0编译系统(三)

    摘要:本节主要来进行Android10.0 编译系统的make过程 阅读本文大约需要花费29分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计, ...

  6. JavaScript 是如何工作的:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...

  7. make太慢了,加快编译速度的方法 make -j

    make太慢了,加快编译速度的方法 make -j 2018-01-18 09:04:05 gonghuihuihui 阅读数 21957  收藏 更多 分类专栏: linux 版权声明:本文为博主原 ...

  8. VS2013 加快编译速度 的方法整理

    VS2013 加快编译速度 的方法整理 1.更改项目设置 项目|属性|C/C++|代码生成|启用最小重新生成:Yes(/Gm) 项目|属性|C/C++|常规|调试信息格式:程序数据库(/Zi) 项目| ...

  9. win10计算机添加右键菜单,win10清理鼠标右键菜单提升电脑速度的方法

    刚刚安装上win10系统后,发现运行速度非常快,安装软件多了,运行速度就变慢.还有右键菜单过多也会影响系统性能,所以定期清理鼠标右键菜单是非常有必要的.下面一起看下win10清理鼠标右键菜单提升电脑速 ...

最新文章

  1. POJ 3683 【2-sat+求一组可行解】.cpp
  2. SAP之成本中心类型与功能范围
  3. StackExchange.Redis性能调优
  4. python字符串长度_如何使用python获取字符串长度?哪些方法?
  5. ps命令与top命令参数意义详解
  6. win7系统出现0x0000001a蓝屏代码的解决教程
  7. Arduino文档阅读笔记-attachInterrupt()
  8. VC++动态链接库DLL编程深入浅出
  9. MySQL学习-group by和having
  10. python 学习之 PythonBasic2
  11. 使用U盘安装Windows操作系统教程
  12. 2021-09-06
  13. sql server 日期条件-上月、年初、同期
  14. 游戏王计算机兽,召唤兽(游戏王卡组系列)_百度百科
  15. UE 5_可交互的门
  16. android 打开qq临时会话,Electron 中打开 QQ 临时会话
  17. MySQL 主从幂等复制slave_exec_mode=IDEMPOTENT
  18. CnOpenData上市公司及子公司名称数据简介
  19. 什么是软链接、硬链接
  20. 汽车功能安全—HARA

热门文章

  1. python图片识别拉框_python目标检测给图画框,bbox画到图上并保存案例
  2. C++知识点29——使用C++标准库(迭代器适配器)
  3. gcc编译c文件_Linux下C语言程序的编译过程
  4. jQuery的选择器
  5. mySql比较并获取当前时间x分钟之前的数据(时间是字符串类型)
  6. jmeter名词解释之聚合报告
  7. SpringSecurity权限表达式
  8. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet
  9. Android被忽略的tools
  10. zabbix监控haproxy