当前位置: 首页 > news >正文

【Gradle-10】不可忽视的构建分析

1、前言

构建性能对于生产力至关重要。
随着项目越来越复杂,花费在构建上的时间就越长,开发效率就越低。

通过分析构建过程,可以了解项目构建的时间都花在哪,以及项目存在哪些潜在的问题,找到构建瓶颈,解决问题,提升构建性能和开发幸福感。
所以,本文先从准确找到问题开始,介绍几个构建分析的工具:

  • Build Analyzer
  • Profile
  • Build Scan

2、Build Analyzer

Build Analyzer,是Android Studio提供的构建分析器,可以在build窗口中打开查看。

2.1、Overview

构建后首次打开,会展示本次构建的概览数据
build analyzer.png
包括构建总时长、建议等。

为确保数据准确有效,建议先执行clean。

2.2、Tasks

task.png
我们切到Tasks选项,可以看到每个Task的执行时间和占比,单击某个Task可以看到更多具体信息。

2.3、Warnings

warnings.png
切到Warnings选项可以查看警告,比如这里提示没有使用「配置缓存」。
除此之外,还会检查你有没有开启「增量构建」「增量注解」,是否有必要开启「android.enableJetifier=true」等。

2.4、Downloads

image.png
切到Downloads选项可以查看下载信息,有些下载很慢的话可以添加一下镜像啊,或者调整一下仓库地址顺序啊,还有就是动态版本每次都要下载是不是可以考虑优化一下啊等等,非常有帮助。

3、Profile

Profile是Gradle提供的构建检测工具,通过命令行执行--profile可以在本地生产一份HTML报告。
比如:

./gradlew assembleDebug --profile

输出:

➜  GradleX git:(master)./gradlew assembleDebug --profileBUILD SUCCESSFUL in 3s
34 actionable tasks: 34 executedSee the profiling report at: file:///Users/yechao/AndroidStudioProjects/GradleX/build/reports/profile/profile-2023-09-24-15-50-21.html

可以直接在控制台打开这个file链接,也可以在root > build > reports > profile文件夹中找到。

3.1、Summary

默认是概览界面,包括Total Build Time、Configuring Projects、Task Execution等基本信息。
summary.png

3.2、Configuaration

Configuaration就是配置阶段耗时,包括All projects、app以及其它模块的配置时间。
configuration.png

3.3、Dependency Resolution

这个顾名思义,就是依赖解析耗时。
dependency resolution.png

3.4、Artifact Transforms

Gradle在新版本报告中还加入了Transform耗时,比如做些产物转换啊啥的,我暂时没有这种操作,所以是0s。
artifact transforms.png

3.5、Task Execution

这里就是各个Task的执行时长。
Task Execution.png
有同学看这里就觉得奇怪了,Total Build Time才3s呢,这个Task Execution怎么就4s了?
这是因为这里统计的是Task执行的总时长,实际编译过程中Task是并行在跑的,所以会出现大于总时长的情况。

4、Build Scan

Build Scan也是Gradle提供的构建分析工具,相比于Profile方式,Build Scan提供的信息更加丰富,且是在线报告,而且还可以用来排查编译错误。
使用非常简单,命令加上--scan即可:

./gradlew build --scan

如果你是首次构建,报告上传Gradle服务器需要同意相关条款,yes即可

Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. 
Do you accept these terms? [yes, no]       

执行完毕,会随机生成一个链接:

Gradle Terms of Service accepted.Publishing build scan...
https://gradle.com/s/bv5a4lsy47vni

用浏览器打开这个链接。

如果你是首次使用Build Scan,还需要输入邮箱激活一下。
邮箱验证.png
然后在邮箱打开Gradle的邮件。
邮箱.png
点击链接,即可查看我们的构建分析报告了。激活后就可以直接在控制台点开链接查看报告了。
链接贴这里,大家也可以查看。

4.1、Summary

scan-summary.png
这个概览信息就比Profile详细多了,其中包括你的Gradle版本、total build time、projects、构建配置的开关、编译的环境等等。
所谓信息越多,决策就越正确,对你分析构建也就越有帮助。

4.2、Performance

我们可以点击左边菜单查看更多的具体信息,比如查看性能Performance。
performance.png
这里可以看到,Performance的二级菜单要比Profile更丰富一些,除了Build、Configuration、Dependency resolution、Task execution这四项外,还有Build Cache、Daemon、Network activity。

4.3、Task execution

编译的主要耗时是Task,所以我们先来看看Task execetion。
scan-task.png
这里除了展示所有Task的执行时间之外,还展示了有多少个Task是命中缓存的,有多少个Task是增量编译的等等。
在下面,我们还可以点击某个具体的Task去看。

4.4、Timeline

Timeline.png
在Timeline里我们可以看到所有Task执行的时间线。
点击具体的Task可以看到执行的具体信息,点击「Focus on task in timeline」可以看到该Task在整个时间线的具体位置。

4.5、switches

switches.png
switches里面会展示一些Gradle配置的开关状态,可以很好的帮助你查漏补缺。
比如我这里Cache都没开,并行编译也没开,离线也没开,如果这些都开了,构建性能又会有大大的提升。

5、最后

本文依次介绍了Build AnalyzerProfileBuild Scan,通过这些构建分析工具,我们可以更好的去分析项目的构建过程,从而提升构建性能。

  • Build Analyzer:开发工具提供,不割裂,但是分析能力相对基础,不过一般也够用了,推荐;
  • Profile:本地分析报告,分析能力相对基础;
  • Build Scan:在线分析报告,分析能力较强,可以进行深入的分析,推荐;

其实Gradle还提供了Enterprice,比Build Scan的分析能力还要强,但是属于付费的,不是很符合现在降本增效的主题。
compare.png
以上是Build Scan免费版和付费版的对比,大家感兴趣的话可以自行去官网了解。

写作不易,感谢支持~

6、GitHub

https://github.com/yechaoa/GradleX

7、相关文档

  • Profile your build
  • Inspecting Gradle Builds
  • Build Analyzer
  • https://scans.gradle.com/

相关文章:

【Gradle-10】不可忽视的构建分析

1、前言 构建性能对于生产力至关重要。 随着项目越来越复杂,花费在构建上的时间就越长,开发效率就越低。 通过分析构建过程,可以了解项目构建的时间都花在哪,以及项目存在哪些潜在的问题,找到构建瓶颈,解…...

2034. 股票价格波动

给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格 。 不巧的是,由于股票市场内在的波动性,股票价格记录可能不是按时间顺序到来的。某些情况下,有的记录可能是错的。如果两个有相同时间戳的记录出现…...

JavaScript 事件详解细节

JavaScript 事件详解细节 JavaScript 中的事件是前端开发中非常重要的一个概念。通过事件,我们可以捕捉和响应用户与网页的交互,比如点击按钮、输入文字等。这篇博客文章将详细介绍 JavaScript 中的事件,希望能帮助你更好地理解和使用这一功…...

【MySQL】事务管理

目录 MySQL事务管理 事务的概念 事务的版本支持 事务的提交方式 事务的相关演示 事务的隔离级别 查看与设置隔离级别 读未提交(Read Uncommitted) 读提交(Read Committed) 可重复读(Repeatable Read&#xf…...

Git 学习笔记 | Git 基本操作命令

Git 学习笔记 | Git 基本操作命令 Git 学习笔记 | Git 基本操作命令文件的四种状态查看文件状态忽略文件 Git 学习笔记 | Git 基本操作命令 文件的四种状态 版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态&…...

第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第七节 - Python 中的字符串模板类)

在字符串模块中,模板类允许我们为输出规范创建简化的语法。该格式使用由 $ 和有效 Python 标识符(字母数字字符和下划线)组成的占位符名称。用大括号将占位符括起来,使其后面可以跟更多的字母数字字母,且中间不留空格。写入 $$ 会创建一个转义的 $。 Python 字符串模板:…...

第八章 排序 十四、最佳归并树

目录 一、定义 二、多路最佳归并树 三、多路最佳归并树少了一个归并段 四、总结 一、定义 最佳归并树是指将若干个有序序列合并成一个有序序列的一种方式,使得所有合并操作的总代价最小的一棵二叉树。其中,代价通常指合并两个有序序列的操作次数或比…...

Python 中,类的方法的标准注释模板

在 Python 中,类的标准注释通常遵循以下格式: class 类名:"""类的简要描述属性:- 属性1 (类型): 属性1的描述- 属性2 (类型): 属性2的描述方法:- 方法1(): 方法1的描述- 方法2(): 方法2的描述示例:>>> 对象 类名()>>>…...

IPSG技术和IP组播

1,IPSG技术概述 实验: DHCP snooping IPSG 拓扑: 需求: 1,实现PC1 和PC2 动态获取IP地址 2, 在SW2 配置DHCP snooping 实现DHCP 服务器的安全 3, 在 连接PC 1 和 PC2 的 接口上 做IPSG ,防止终端…...

【大数据】Apache NiFi 助力数据处理及分发

Apache NiFi 助力数据处理及分发 1.什么是 NiFi ?2.NiFi 的核心概念3.NiFi 的架构4.NiFi 的性能预期和特点5.NiFi 关键特性的高级概览 1.什么是 NiFi ? 简单的说,NiFi 就是为了解决不同系统间数据自动流通问题而建立的。虽然 dataflow 这个术…...

什么是 SRE?一文详解 SRE 运维体系

目录 可观测性系统 故障响应 故障复盘 测试与发布 容量规划 自动化工具开发 用户体验 可观测性系统 在任何有一定规模的企业内部,一旦推行起来整个SRE的运维模式,那么对于可观测性系统的建设将变得尤为重要,而在整个可观测性系统中&a…...

【Docker】初识 Docker,Docker 基本命令的使用,Dockerfile 自定义镜像的创建

文章目录 前言:项目部署的挑战一、初识 Docker1.1 什么是 Docker1.2 Docker 与 虚拟机的区别1.3 镜像和容器以及镜像托管平台1.4 Docker的架构解析1.5 Docker 在 CentOS 中的安装 二、Docker 的基本操作2.1 操作 Docker 镜像命令2.1.1 镜像操作相关命令2.1.2 示例一…...

【Docker】简易版harbor部署

文章目录 依赖于docker-compose下载添加执行权限测试 安装harbor下载解压修改配置文件部署配置开机自启动登录验证 使用harbor登录打标签上传下载 常见问题 依赖于docker-compose 下载 curl -L “https://github.com/docker/compose/releases/download/2.22.0/docker-compose-…...

Zookeeper经典应用场景实战(一)

文章目录 1、Zookeeper Java客户端实战1.1、 Zookeeper 原生Java客户端使用1.2、 Curator开源客户端使用 2、 Zookeeper在分布式命名服务中的实战2.1、 分布式API目录2.2、 分布式节点的命名2.3、 分布式的ID生成器 3、Zookeeper实现分布式队列3.1、 设计思路3.2、 使用Apache …...

Chrome报错:Unchecked runtime.lastError

项目背景、安装了 Express 框架,目的是为了快速创建一个web服务器。创建成功后,控制台出现了报错,而在这之前没有出现过这个错误,所以一直在纠结是不是框架本身的问题。 错误原因:这个错误一般是浏览器与扩展或者插件…...

【算法】算法设计与分析 课程笔记 第三章 动态规划

1.1 动态规划简介 1.1.1 引例 动态规划算法和分治法类似,基本思想也是将待求解问题分解成若干个子问题,子问题可以以继续拆分,直到问题规模达到临界条件即可。多说无益,举个例子来解释一下: 这其实是一个多阶段图求最…...

贪心找性质+dp表示+矩阵表示+线段树维护:CF573D

比较套路的题目 首先肯定贪心一波,两个都排序后尽量相连。我一开始猜最多跨1,但其实最多跨2,考虑3个人的情况: 我们发现第3个人没了,所以可以出现跨2的情况 然后直接上dp,由 i − 1 , i − 2 , i − 3 i…...

小谈设计模式(17)—状态模式

小谈设计模式(17)—状态模式 专栏介绍专栏地址专栏介绍 状态模式关键角色上下文(Context)抽象状态(State)具体状态(Concrete State) 核心思想Java程序实现首先,我们定义一个抽象状态类 State,其中包含一个处理请求的方法 handleRe…...

Arm64体系架构-MPIDR_EL1寄存器

背景 在Arm64多核处理器中, 各核间的关系可能不同. 比如1个16 core的cpu, 每4个core划分为1个cluster,共享L2 cache. 当我们需要从core 0将任务调度出来时,如果优先选择core 1~3, 那么性能明显时优于其他core的. 那么操作系统怎么知道core之间这样的拓扑信息呢? Arm提供了MPID…...

MySQL支持哪些存储引擎

mysql支持九大存储引擎: 1)MYISAM存储引擎(优点:可被转换为压缩、只读表来节省空间。) 它管理的表具有以下特征: 使用三个文件表示每个表 格式文件-存储表结构的定义(mytable.frm) 数据文件-存…...

ElementUI结合Vue完成主页的CUD(增删改)表单验证

目录 一、CUD ( 1 ) CU讲述 ( 2 ) 编写 1. CU 2. 删除 二、验证 前端整合代码 : 一、CUD 以下的代码基于我博客中的代码进行续写 : 使用ElementUI结合Vue导航菜单和后台数据分页查询 ( 1 ) CU讲述 在CRUD操作中,CU代表创建(Create&#xff09…...

Flutter开发笔记 —— 语音消息功能实现

前言 最近在开发一款即时通讯(IM)的聊天App,在实现语音消息功能模块后,写下该文章以做记录。 注:本文不提供相关图片资源以及IM聊天中具体实现代码,单论语音功能实现思路 需求分析 比起上来直接贴代码,我们先来逐步…...

冒泡排序和选择排序

目录 一、冒泡排序 1.冒泡排序的原理 2.实现冒泡排序 1.交换函数 2.单躺排序 3.冒泡排序实现 4.测试 5.升级冒泡排序 6.升级版代码 7.升级版测试 二、选择排序 1.选择排序的原理 2.实现选择排序 1.单躺排序 2.选择排序实现 3.测试 ​4.修改 5.测试 一、冒泡排序…...

【深度学习】UNIT-DDPM核心讲解

文章目录 大致介绍:扩散损失:转换损失:循环一致性损失:推理过程:优缺点: 参考文章: https://blog.csdn.net/ssshyeong/article/details/127210086 这篇文章对整个文章 UNIT-DDPM: UNpaired Imag…...

Java 线程的优先级

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…...

金融数学方法:牛顿法

目录 1.牛顿法1.1 牛顿法介绍1.2 算法步骤 2. 具体算例3.总结 1.牛顿法 1.1 牛顿法介绍 牛顿法(Newton’s method),也被称为牛顿-拉夫森方法(Newton-Raphson method),是一种用于数值逼近根的迭代方法。它是…...

MongoTemplate | 多条件查询

MongoTemplate查询 Resource private MongoTemplate mongoTemplate;public <T> List<T> getDataList(String param1, Long param2, Class<T> clazz) {// 构建queryQuery query constructQuery(param1, param2);// 查询return mongoTemplate.find(query, cl…...

优秀程序员是怎么思考的?

首发日更公 Z 号&#xff1a;十二又十三 作为一名优秀的程序员&#xff0c;思考是我们工作中最重要的一部分。它不仅能够帮助我们解决问题&#xff0c;还能够提升我们的技术水平和职业发展。那么&#xff0c;优秀程序员是如何思考的呢&#xff1f;本文将为您介绍一个思考框架和…...

【juc】countdownlatch实现游戏进度

目录 一、截图示例二、代码示例 一、截图示例 二、代码示例 package com.learning.countdownlatch;import java.util.Arrays; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurr…...

Spring Webflux HttpHandler源码整理

HttpHandler的构造 自动启动配置类&#xff1a;HttpHandlerAutoConfigurationBean public HttpHandler httpHandler(ObjectProvider<WebFluxProperties> propsProvider) {HttpHandler httpHandler WebHttpHandlerBuilder.applicationContext(this.applicationContext).…...

网站建设横条/网站页面关键词优化

概述首先同步下项目概况&#xff1a;上篇文章分享了&#xff0c;路由中间件 - Jaeger 链路追踪&#xff08;理论篇&#xff09;。这篇文章咱们分享&#xff1a;路由中间件 - Jaeger 链路追踪&#xff08;实战篇&#xff09;。说实话&#xff0c;这篇文章确实让大家久等了&#…...

电商网站管理系统模板下载/整站seo技术搜索引擎优化

本片文章是算法排序系列的第一章&#xff0c;也是我在平台上的第一篇文章&#xff0c;希望自己能够坚持下去&#xff0c;同时本部分算法学习中一定会给出Java或者scala的实现方式(心情好的话也可能是两种语言都有)&#xff0c;好了废话不多说&#xff0c;我们切入正题&#xff…...

电子商务网站建设规划书/全球搜

1、模块 模块尽量使用小写命名&#xff0c;首字母保持小写&#xff0c;尽量不要用下划线(除非多个单词&#xff0c;且数量不多的情况) # 正确的模块名 import decoder import html_parser# 不推荐的模块名 import Decoder 2、类名 类名使用驼峰(CamelCase)命名风格&#xff0c…...

外发加工网线是真的吗/seo优化工具哪个好

yum (yellow dog)网络yum ftp http nfs以ftp为例&#xff1a;#mount /dev/cdrom /mnt/cdrom (如果这目录没建需要自己建)#cd /mnt/cdrom/Server/#rpm -ivh vsftpd-2.0.5-16.el5.i386.rpm (安装ftp服务器)#service vsftpd start &#xff08;启动ftp服务&…...

网站制作基础教程/专业代写软文

使用场景 跳表&#xff08;Skiplist&#xff09;是一个特殊的链表&#xff0c;相比一般的链表&#xff0c;有更高的查找效率&#xff0c;可比拟二叉查找树&#xff0c;平均期望的查找、插入、删除时间复杂度都是O(logn)&#xff0c;许多知名的开源软件&#xff08;库&#xff…...

郑州专业做淘宝直播网站/广州灰色优化网络公司

用rpm方式装的mysql&#xff0c;配置了下&#xff0c;mysqld_multi 启动什么都没问题。但是编译安装的mysql5.5.20,启动mysqld_multi 报错 。datadir 什么都是正确创建了的&#xff0c;但就是找不到。./mysqld_multi --defaults-file/etc/my.cnf start 3307 --no-log --user…...