Android Gradle学习(八) 统计Task执行时长
发布日期:2021-05-14 01:33:57 浏览次数:16 分类:精选文章

本文共 4199 字,大约阅读时间需要 13 分钟。

如何使用Gradle跟踪和分析构建任务执行时间

在Android开发中,优化构建过程尤为重要。长时间的构建时间不仅影响开发效率,也会降低用户体验。本文将教你如何创建一个Gradle插件,用于跟踪和分析每个任务的执行时间。

准备工作

  • 创建一个Gradle插件项目

    通过Gradle脚手架创建一个默认的插件项目。默认配置下,项目结构如下:

    project
    └── src
    └── main
    └── java
    └── com
    └── youetaku
    └── plugin
    └── BuildTimeCostPlugin.java
  • 安装Gradle插件开发工具

    安装最新版本的Gradle插件开发工具。如果你使用的是IntelliJ IDEA,可以在设置中启用“允许修改源代码”以便到达类path。

  • 插件开发步骤

    1. 创建TaskExecutionListener

    public class BuildTimeCostPlugin implements Plugin {
    @Override
    void apply(Project project) {
    project.getGradle().addListener(new TaskExecutionListener() {
    @Override
    void beforeExecute(Task task) {
    TaskExecTimeInfo timeInfo = new TaskExecTimeInfo();
    timeInfo.start = System.currentTimeMillis();
    timeInfo.path = task.getPath();
    timeCostMap.put(task.getPath(), timeInfo);
    taskPathList.add(task.getPath());
    }
    @Override
    void afterExecute(Task task, TaskState taskState) {
    TaskExecTimeInfo timeInfo = timeCostMap.get(task.getPath());
    timeInfo.end = System.currentTimeMillis();
    timeInfo.total = timeInfo.end - timeInfo.start;
    }
    });
    // 绝 musí Monitoring-checkbox进行监听构建完成
    project.getGradle().addBuildListener(new BuildListener() {
    @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) {
    // 第二部分,按配置输出时间过长的任务
    if (timeCostExt.sorted) {
    List
    list = new ArrayList<>();
    timeCostMap.forEach((path, timeInfo) -> list.add(timeInfo));
    list.sort((o1, o2) -> o2.total - o1.total);
    list.forEach(timeInfo -> {
    if (timeInfo.total >= timeCostExt.threshold) {
    System.out.println(timeInfo.path + " ["
    + String.format("%,d", timeInfo.total) + "ms]");
    }
    });
    } else {
    taskPathList.forEach(path -> {
    TaskExecTimeInfo timeInfo = timeCostMap.get(path);
    if (timeInfo.total >= timeCostExt.threshold) {
    System.out.println(path + " ["
    + String.format("%,d", timeInfo.total) + "ms]");
    }
    });
    }
    }
    });
    }
    @Override
    public boolean apply(Class
    type) {
    return false;
    }
    // 自定义的Extension类
    public static class BuildTimeCostExtension {
    int threshold;
    boolean sorted;
    void threshold(int threshold) {
    this.threshold = threshold;
    }
    void sorted(boolean sorted) {
    this.sorted = sorted;
    }
    }
    // 类中的字段,可选属性
    Map
    timeCostMap = new HashMap<>();
    List
    taskPathList = new ArrayList<>();
    // 伴随this的类
    class TaskExecTimeInfo {
    Long total;
    String path;
    long start;
    long end;
    }
    }

    2. 定义自定义Extension

    public class BuildTimeCostExtension {
    int threshold = 100;
    boolean sorted = true;
    void threshold(int threshold) {
    this.threshold = threshold;
    }
    void sorted(boolean sorted) {
    this.sorted = sorted;
    }
    }

    3. 在Gradle构造脚本中集成插件

    apply plugin: 'BuildTimeCostPlugin'
    buildTimeCost {
    threshold = 100
    sorted = true
    }

    使用和测试

  • 构建项目

    在项目根目录下执行以下命令:

    ./gradlew assembleDebug
  • 查看构建日志

    打开Gradle的日志查看器(File>Settings>Build, Execution, Deployment>Build Output),分析每个任务的执行时间。

  • 优化插件输出

    根据需要调整BuildTimeCostExtension中的thresholdsorted属性,查看输出结果是否符合预期。

  • 总结

    通过创建一个Gradle插件,你可以轻松跟踪和分析每个构建任务的执行时间。这不仅有助于识别性能瓶颈,还能帮助优化构建流程,提升开发效率。通过继续探索Gradle的更多功能,你可以开发出更加实用和功能丰富的构建工具。

    上一篇:Android 多语言应用
    下一篇:Android Gradle学习(七) Gradle构建生命周期

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月12日 22时12分59秒