【Gradle-10】不可忽视的构建分析
1、前言
构建性能对于生产力至关重要。
随着项目越来越复杂,花费在构建上的时间就越长,开发效率就越低。

通过分析构建过程,可以了解项目构建的时间都花在哪,以及项目存在哪些潜在的问题,找到构建瓶颈,解决问题,提升构建性能和开发幸福感。
所以,本文先从准确找到问题开始,介绍几个构建分析的工具:
- Build Analyzer
- Profile
- Build Scan
2、Build Analyzer
Build Analyzer,是Android Studio提供的构建分析器,可以在build窗口中打开查看。
2.1、Overview
构建后首次打开,会展示本次构建的概览数据

包括构建总时长、建议等。
为确保数据准确有效,建议先执行clean。
2.2、Tasks

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

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

切到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等基本信息。

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

3.3、Dependency Resolution
这个顾名思义,就是依赖解析耗时。

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

3.5、Task Execution
这里就是各个Task的执行时长。

有同学看这里就觉得奇怪了,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,还需要输入邮箱激活一下。

然后在邮箱打开Gradle的邮件。

点击链接,即可查看我们的构建分析报告了。激活后就可以直接在控制台点开链接查看报告了。
链接贴这里,大家也可以查看。
4.1、Summary

这个概览信息就比Profile详细多了,其中包括你的Gradle版本、total build time、projects、构建配置的开关、编译的环境等等。
所谓信息越多,决策就越正确,对你分析构建也就越有帮助。
4.2、Performance
我们可以点击左边菜单查看更多的具体信息,比如查看性能Performance。

这里可以看到,Performance的二级菜单要比Profile更丰富一些,除了Build、Configuration、Dependency resolution、Task execution这四项外,还有Build Cache、Daemon、Network activity。
4.3、Task execution
编译的主要耗时是Task,所以我们先来看看Task execetion。

这里除了展示所有Task的执行时间之外,还展示了有多少个Task是命中缓存的,有多少个Task是增量编译的等等。
在下面,我们还可以点击某个具体的Task去看。
4.4、Timeline

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

switches里面会展示一些Gradle配置的开关状态,可以很好的帮助你查漏补缺。
比如我这里Cache都没开,并行编译也没开,离线也没开,如果这些都开了,构建性能又会有大大的提升。
5、最后
本文依次介绍了Build Analyzer、Profile、Build Scan,通过这些构建分析工具,我们可以更好的去分析项目的构建过程,从而提升构建性能。
- Build Analyzer:开发工具提供,不割裂,但是分析能力相对基础,不过一般也够用了,推荐;
- Profile:本地分析报告,分析能力相对基础;
- Build Scan:在线分析报告,分析能力较强,可以进行深入的分析,推荐;
其实Gradle还提供了Enterprice,比Build Scan的分析能力还要强,但是属于付费的,不是很符合现在降本增效的主题。

以上是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…...
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) 数据文件-存…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
