Ninja提升编译速度的方法-Android10.0编译系统(十)
摘要:如何通过Ninja来提升Android编译速度
阅读本文大约需要花费10分钟。
文章首发微信公众号:IngresGe
专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢!
欢迎关注我的公众号!
[Android取经之路] 的源码都基于Android-Q(10.0) 进行分析
[Android取经之路] 系列文章:
《系统启动篇》
- Android系统架构
- Android是怎么启动的
- Android 10.0系统启动之init进程
- Android10.0系统启动之Zygote进程
- Android 10.0 系统启动之SystemServer进程
- Android 10.0 系统服务之ActivityMnagerService
- Android10.0系统启动之Launcher(桌面)启动流程
- Android10.0应用进程创建过程以及Zygote的fork流程
- Android 10.0 PackageManagerService(一)工作原理及启动流程
- Android 10.0 PackageManagerService(二)权限扫描
- Android 10.0 PackageManagerService(三)APK扫描
- Android 10.0 PackageManagerService(四)APK安装流程
《日志系统篇》
- Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性
- Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化
- Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析
- Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现
《Binder通信原理》:
- Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要
- Android10.0 Binder通信原理(二)-Binder入门篇
- Android10.0 Binder通信原理(三)-ServiceManager篇
- Android10.0 Binder通信原理(四)-Native-C\C++实例分析
- Android10.0 Binder通信原理(五)-Binder驱动分析
- Android10.0 Binder通信原理(六)-Binder数据如何完成定向打击
- Android10.0 Binder通信原理(七)-Framework binder示例
- Android10.0 Binder通信原理(八)-Framework层分析
- Android10.0 Binder通信原理(九)-AIDL Binder示例
- Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式
- Android10.0 Binder通信原理(十一)-Binder总结
《HwBinder通信原理》
- HwBinder入门篇-Android10.0 HwBinder通信原理(一)
- HIDL详解-Android10.0 HwBinder通信原理(二)
- HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)
- HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)
- HwServiceManager篇-Android10.0 HwBinder通信原理(五)
- Native层HIDL服务的注册原理-Android10.0 HwBinder通信原理(六)
- Native层HIDL服务的获取原理-Android10.0 HwBinder通信原理(七)
- JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)
- JAVA层HIDL服务的获取原理-Android10.0 HwBinder通信原理(九)
- HwBinder驱动篇-Android10.0 HwBinder通信原理(十)
- HwBinder原理总结-Android10.0 HwBinder通信原理(十一)
《编译原理》
- 编译系统入门篇-Android10.0编译系统(一)
- 编译环境初始化-Android10.0编译系统(二)
- make编译过程-Android10.0编译系统(三)
- Image打包流程-Android10.0编译系统(四)
- Kati详解-Android10.0编译系统(五)
- Blueprint简介-Android10.0编译系统(六)
- Blueprint代码详细分析-Android10.0编译系统(七)
- Android.bp 语法浅析-Android10.0编译系统(八)
- 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编译系统(十)相关推荐
- 编译系统总结篇-Android10.0编译系统(十一)
摘要:Android10.0编译系统总结 阅读本文大约需要花费20分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关 ...
- 简单提升编译速度的一个方法
随着项目越来越大,编译速度越来越是一个问题.在编译我们的 Android App 的时候,印象里最快的时候也得一分半,当然这还是在关闭 Chrome 的时候.当你改几行代码时,仍然要花上几分钟来编译, ...
- Ninja简介-Android10.0编译系统(九)
摘要:Ninja具体干了什么? 阅读本文大约需要花费16分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关注我的公众 ...
- js 数组 实现 完全树_JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧
摘要: JS的"编译原理". 原文:JavaScript的工作原理:解析.抽象语法树(AST)+ 提升编译速度5个技巧 作者:前端小智 Fundebug经授权转载,版权归原作者所有 ...
- make编译过程-Android10.0编译系统(三)
摘要:本节主要来进行Android10.0 编译系统的make过程 阅读本文大约需要花费29分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计, ...
- JavaScript 是如何工作的:解析、抽象语法树(AST)+ 提升编译速度5个技巧
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
- make太慢了,加快编译速度的方法 make -j
make太慢了,加快编译速度的方法 make -j 2018-01-18 09:04:05 gonghuihuihui 阅读数 21957 收藏 更多 分类专栏: linux 版权声明:本文为博主原 ...
- VS2013 加快编译速度 的方法整理
VS2013 加快编译速度 的方法整理 1.更改项目设置 项目|属性|C/C++|代码生成|启用最小重新生成:Yes(/Gm) 项目|属性|C/C++|常规|调试信息格式:程序数据库(/Zi) 项目| ...
- win10计算机添加右键菜单,win10清理鼠标右键菜单提升电脑速度的方法
刚刚安装上win10系统后,发现运行速度非常快,安装软件多了,运行速度就变慢.还有右键菜单过多也会影响系统性能,所以定期清理鼠标右键菜单是非常有必要的.下面一起看下win10清理鼠标右键菜单提升电脑速 ...
最新文章
- POJ 3683 【2-sat+求一组可行解】.cpp
- SAP之成本中心类型与功能范围
- StackExchange.Redis性能调优
- python字符串长度_如何使用python获取字符串长度?哪些方法?
- ps命令与top命令参数意义详解
- win7系统出现0x0000001a蓝屏代码的解决教程
- Arduino文档阅读笔记-attachInterrupt()
- VC++动态链接库DLL编程深入浅出
- MySQL学习-group by和having
- python 学习之 PythonBasic2
- 使用U盘安装Windows操作系统教程
- 2021-09-06
- sql server 日期条件-上月、年初、同期
- 游戏王计算机兽,召唤兽(游戏王卡组系列)_百度百科
- UE 5_可交互的门
- android 打开qq临时会话,Electron 中打开 QQ 临时会话
- MySQL 主从幂等复制slave_exec_mode=IDEMPOTENT
- CnOpenData上市公司及子公司名称数据简介
- 什么是软链接、硬链接
- 汽车功能安全—HARA
热门文章
- python图片识别拉框_python目标检测给图画框,bbox画到图上并保存案例
- C++知识点29——使用C++标准库(迭代器适配器)
- gcc编译c文件_Linux下C语言程序的编译过程
- jQuery的选择器
- mySql比较并获取当前时间x分钟之前的数据(时间是字符串类型)
- jmeter名词解释之聚合报告
- SpringSecurity权限表达式
- Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet
- Android被忽略的tools
- zabbix监控haproxy