Skip to content

Commit

Permalink
统计Task时间学习
Browse files Browse the repository at this point in the history
  • Loading branch information
yangchong211 committed Mar 31, 2022
1 parent a5ec0e5 commit d132394
Show file tree
Hide file tree
Showing 10 changed files with 278 additions and 2 deletions.
1 change: 1 addition & 0 deletions AptHelper/BuildTimeCostPlugin/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
24 changes: 24 additions & 0 deletions AptHelper/BuildTimeCostPlugin/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'com.github.dcendents.android-maven'


sourceCompatibility = "1.8"
targetCompatibility = "1.8"

repositories {
mavenLocal()
mavenCentral()
jcenter()
}

dependencies {
implementation gradleApi()
implementation localGroovy()
implementation 'org.javassist:javassist:3.18.2-GA'
implementation 'com.squareup:javapoet:1.7.0'
implementation 'com.android.tools.build:gradle:3.0.0'
implementation project(path: ':ServiceLoaderApi')
implementation project(':ServiceLoaderAnnotations')
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package com.yc.time.loader.gradle;


import com.yc.time.loader.gradle.task.AppBuildListener;
import com.yc.time.loader.gradle.task.AppTaskExecutionListener;
import com.yc.time.loader.gradle.task.BuildTimeCostExtension;
import com.yc.time.loader.gradle.task.TaskExecTimeInfo;
import org.gradle.BuildResult;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.tasks.TaskState;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;


public class BuildTimeCostPlugin implements Plugin<Project> {

//用来记录 task 的执行时长等信息
Map<String, TaskExecTimeInfo> timeCostMap = new HashMap<>();
//用来按顺序记录执行的 task 名称
List<String> taskPathList = new ArrayList<>();

@Override
@SuppressWarnings("deprecation")
public void apply(final Project project) {
// 监听每个task的执行
// 在每个 task 执行前先搜集其相关信息,记录该 task 执行的开始时间等,
// 在 task 执行完成后,记录其执行结束时间,这样就能统计出该 task 的执行时长。
project.getGradle().addListener(new AppTaskExecutionListener() {
@Override
public void beforeExecute(Task task) {
//task开始执行之前搜集task的信息
TaskExecTimeInfo timeInfo = new TaskExecTimeInfo();
//记录开始时间
timeInfo.setStart(System.currentTimeMillis());
timeInfo.setPath(task.getPath());
timeCostMap.put(task.getPath(), timeInfo);
taskPathList.add(task.getPath());
}

@Override
public void afterExecute(Task task, TaskState taskState) {
//task执行完之后,记录结束时的时间
TaskExecTimeInfo timeInfo = timeCostMap.get(task.getPath());
//记录结束时间
timeInfo.setEnd(System.currentTimeMillis());
//计算该 task 的执行时长
timeInfo.setTotal(timeInfo.getEnd() - timeInfo.getStart());
}
});

//创建一个 Extension,配置输出结果
final BuildTimeCostExtension timeCostExt = project.getExtensions().create(
"taskExecTime", BuildTimeCostExtension.class);
//编译结束之后:
project.getGradle().addBuildListener(new AppBuildListener() {
@Override
public void buildFinished(@NotNull BuildResult buildResult) {
log("build finished, now println all task execution time:");
//按 task 执行顺序打印出执行时长信息
if (timeCostExt.isSorted()){
//进行排序
List<TaskExecTimeInfo> list = new ArrayList<>();
Set<String> keySet = timeCostMap.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()){
String key = iterator.next();
TaskExecTimeInfo taskExecTimeInfo = timeCostMap.get(key);
list.add(taskExecTimeInfo);
}
Collections.sort(list, new Comparator<TaskExecTimeInfo>() {
@Override
public int compare(TaskExecTimeInfo t1, TaskExecTimeInfo t2) {
return (int) (t2.getTotal() - t1.getTotal());
}
});
for (TaskExecTimeInfo timeInfo : list) {
long t = timeInfo.getTotal();
if (t >= timeCostExt.getThreshold()) {
log(timeInfo.getPath() + " " + t + "ms");
}
}
} else {
for (String path : taskPathList) {
long t = timeCostMap.get(path).getTotal();
if (t >= timeCostExt.getThreshold()) {
log(path + " " + t + "ms");
}
}
}
log("build finished, time all print , yc");
}
});
}

public static void log(String string){
System.out.print("task time log : " + string);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.yc.time.loader.gradle.task;

import org.gradle.BuildListener;
import org.gradle.BuildResult;
import org.gradle.api.initialization.Settings;
import org.gradle.api.invocation.Gradle;
import org.jetbrains.annotations.NotNull;

/**
* 可以用 BuildListener 来监听整个构建是否完成,在构建完成后,输出所有执行过的 task 信息,以及每个 task 的执行时长
*/
public class AppBuildListener implements BuildListener {
@Override
public void buildStarted(@NotNull Gradle gradle) {

}

@Override
public void settingsEvaluated(@NotNull Settings settings) {

}

@Override
public void projectsLoaded(@NotNull Gradle gradle) {

}

@Override
public void projectsEvaluated(@NotNull Gradle gradle) {

}

@Override
public void buildFinished(@NotNull BuildResult buildResult) {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.yc.time.loader.gradle.task;

import org.gradle.api.Task;
import org.gradle.api.execution.TaskExecutionListener;
import org.gradle.api.tasks.TaskState;
import org.jetbrains.annotations.NotNull;


/**
* Gradle 提供了很多构建生命周期钩子函数,我们可以用 TaskExecutionListener 来监听整个构建过程中 task 的执行
*/
public class AppTaskExecutionListener implements TaskExecutionListener {
@Override
public void beforeExecute(@NotNull Task task) {

}

@Override
public void afterExecute(@NotNull Task task, @NotNull TaskState taskState) {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.yc.time.loader.gradle.task;

public class BuildTimeCostExtension {

//task执行时间超过该值才会统计
private int threshold;

//是否按照task执行时长进行排序,true-表示从大到小进行排序,false-表示不排序
private boolean sorted;

public void threshold(int threshold) {
this.threshold = threshold;
}

public void sorted(boolean sorted) {
this.sorted = sorted;
}

public int getThreshold() {
return threshold;
}

public boolean isSorted() {
return sorted;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.yc.time.loader.gradle.task;

public final class TaskExecTimeInfo {
/**
* task执行总时长
*/
private long total;
/**
* task 路径
*/
private String path;
/**
* task 执行开始时间
*/
private long start;
/**
* task 结束时间
*/
private long end;

public long getTotal() {
return total;
}

public void setTotal(long total) {
this.total = total;
}

public String getPath() {
return path;
}

public void setPath(String path) {
this.path = path;
}

public long getStart() {
return start;
}

public void setStart(long start) {
this.start = start;
}

public long getEnd() {
return end;
}

public void setEnd(long end) {
this.end = end;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# resources目录会被自动识别为资源文件夹
# resources目录下新建文件夹META-INF,META-INF文件夹下新建gradle-plugins文件夹
# plugin的全路径地址,注意该文件的命名就是你之后使用插件的名字
implementation-class=com.yc.time.loader.gradle.BuildTimeCostPlugin
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# resources目录会被自动识别为资源文件夹
# resources目录下新建文件夹META-INF,META-INF文件夹下新建gradle-plugins文件夹
# plugin的全路径地址,注意该文件的命名就是你之后使用插件的名字
implementation-class=com.yc.spi.loader.gradle.ServiceLoaderPlugin
implementation-class=com.yc.spi.loader.gradle.BuildTimeCostPlugin
3 changes: 2 additions & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,13 @@ project(':AutoCloserLib').projectDir = new File('ToolLib/AutoCloserLib')


/* +++++++++ Apt框架基础工具库 +++++++++ */
include ':RouteCompiler', ':RouteManager', ':RouteAnnotations',
include ':RouteCompiler', ':RouteManager', ':RouteAnnotations',':BuildTimeCostPlugin',
':ServiceLoaderApi', ':ServiceLoaderAnnotations', ':ServiceLoaderRegistry',
':ServiceLoaderPlugin', ':ServiceLoaderProcessor'
project(':RouteCompiler').projectDir = new File('AptHelper/RouteCompiler')
project(':RouteManager').projectDir = new File('AptHelper/RouteManager')
project(':RouteAnnotations').projectDir = new File('AptHelper/RouteAnnotations')
project(':BuildTimeCostPlugin').projectDir = new File('AptHelper/BuildTimeCostPlugin')
project(':ServiceLoaderApi').projectDir = new File('AptHelper/ServiceLoaderApi')
project(':ServiceLoaderAnnotations').projectDir = new File('AptHelper/ServiceLoaderAnnotations')
project(':ServiceLoaderRegistry').projectDir = new File('AptHelper/ServiceLoaderRegistry')
Expand Down

0 comments on commit d132394

Please sign in to comment.