美文网首页
在Gradle 插件中统计并打印 Task 任务耗时

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

作者: Bfmall | 来源:发表于2022-08-12 10:19 被阅读0次

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

    使用 Listener 进行监听
    Gradle 提供了很多构建生命周期钩子函数。

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

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

    1. 使用 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<>()
    
        @Override
        void buildStarted(Gradle gradle) {
    
        }
    
        @Override
        void settingsEvaluated(Settings settings) {
    
        }
    
        @Override
        void projectsLoaded(Gradle gradle) {
    
        }
    
        @Override
        void projectsEvaluated(Gradle gradle) {
    
        }
    
        @Override
        void 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 "---------------------------------------"
        }
    
        @Override
        void beforeExecute(Task task) {
            //task开始执行之前搜集task的信息
            TaskTimeInfo timeInfo = new TaskTimeInfo()
            timeInfo.start = System.currentTimeMillis()
            timeInfo.path = task.getPath()
            taskTimeMap.put(task.getPath(), timeInfo)
        }
    
        @Override
        void 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 total
            String path
            long start
            long end
        }
    }
    

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

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

    ————————————————
    版权声明:本文为CSDN博主「卜大爷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u011578734/article/details/114104426

    相关文章

      网友评论

          本文标题:在Gradle 插件中统计并打印 Task 任务耗时

          本文链接:https://www.haomeiwen.com/subject/ooyxgrtx.html