在Gradle 插件中统计并打印 Task 任务耗时

2024-06-12 10:08

本文主要是介绍在Gradle 插件中统计并打印 Task 任务耗时,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Gradle 插件中统计并打印 Task 任务耗时


我们在使用 Gradle 构建任务时,有时想统计每个任务的耗时情况,以此发现每个任务的运行时间,以及是否存在可优化空间。

使用 Listener 进行监听

Gradle 提供了很多构建生命周期钩子函数。

1. 我们可以用 TaskExecutionListener 来监听整个构建过程中 task 的执行:
public interface TaskExecutionListener {void beforeExecute(Task task);void afterExecute(Task task, TaskState taskState);
}

我们可以在每个 task 执行前先收集信息,记录该 task 执行的开始时间等,在 task 执行完成后,记录其执行结束时间,这样就能统计出该 task 的执行时长。

2. 使用 BuildListener 来监听整个构建是否完成,在构建完成后,输出所有执行过的 task 信息,以及每个 task 的执行时长:
public interface BuildListener {void buildStarted(Gradle gradle);void settingsEvaluated(Settings settings);void projectsLoaded(Gradle gradle);void projectsEvaluated(Gradle gradle);void buildFinished(BuildResult buildResult);
}

在 buildFinished 方法中,监听构建完成以及成功与否,并打印我们采集的耗时信息。

代码实例

BuildTimeListener 是我自定义的一个监听任务耗时的工具类:

class BuildTimeListener implements TaskExecutionListener, BuildListener {//用来记录 task 的执行时长信息Map<String, TaskTimeInfo> taskTimeMap = new HashMap<>()@Overridevoid buildStarted(Gradle gradle) {}@Overridevoid settingsEvaluated(Settings settings) {}@Overridevoid projectsLoaded(Gradle gradle) {}@Overridevoid projectsEvaluated(Gradle gradle) {}@Overridevoid buildFinished(BuildResult buildResult) {println "-----------------GouAPM----------------------"println "---------------------------------------"println "build finished, now println all task execution time:"taskTimeMap.each{ k, v -> println "${k}:[${v.total}ms]" }println "---------------------------------------"println "---------------------------------------"}@Overridevoid beforeExecute(Task task) {//task开始执行之前搜集task的信息TaskTimeInfo timeInfo = new TaskTimeInfo()timeInfo.start = System.currentTimeMillis()timeInfo.path = task.getPath()taskTimeMap.put(task.getPath(), timeInfo)}@Overridevoid afterExecute(Task task, TaskState taskState) {//task执行完之后,记录结束时的时间TaskTimeInfo timeInfo = taskTimeMap.get(task.getPath())timeInfo.end = System.currentTimeMillis()//计算该 task 的执行时长timeInfo.total = timeInfo.end - timeInfo.start}class TaskTimeInfo {//task执行总时长long totalString pathlong startlong end}
}

我们在自定义插件中进行注册:

class MyPlugin implements Plugin<Project>{private Project mProject;@Overridevoid apply(Project project) {mProject = project;//注册监听,以统计任务的耗时project.gradle.addListener(new BuildTimeListener())}
}

**PS:更多性能优化相关文章,请查看 --> 《Android 性能优化》
**PS:更多性能优化相关文章,请查看 --> 《Android 性能优化》
**PS:更多性能优化相关文章,请查看 --> 《Android 性能优化》

这篇关于在Gradle 插件中统计并打印 Task 任务耗时的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053912

相关文章

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

maven中的maven-antrun-plugin插件示例详解

《maven中的maven-antrun-plugin插件示例详解》maven-antrun-plugin是Maven生态中一个强大的工具,尤其适合需要复用Ant脚本或实现复杂构建逻辑的场景... 目录1. 核心功能2. 典型使用场景3. 配置示例4. 关键配置项5. 优缺点分析6. 最佳实践7. 常见问题

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.