-
Notifications
You must be signed in to change notification settings - Fork 478
/
compileTimeCost.gradle
67 lines (64 loc) · 3.11 KB
/
compileTimeCost.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* wiki: https://juejin.cn/post/6844903607679057934
* 1、初始化阶段
*/
long beginOfSetting = System.currentTimeMillis()
gradle.projectsLoaded {
println '----------------------初始化阶段----------------------'
println '初始化阶段,耗时:' + (System.currentTimeMillis() - beginOfSetting) + 'ms'
println '----------------------初始化阶段----------------------'
}
/**
* 2、配置阶段
*/
def beginOfConfig
def configHasBegin = false
def beginOfProjectConfig = new HashMap()
def configList = new ArrayList()
gradle.beforeProject { project ->
if (!configHasBegin) {
configHasBegin = true
beginOfConfig = System.currentTimeMillis()
}
beginOfProjectConfig.put(project, System.currentTimeMillis())
}
gradle.afterProject { project ->
def begin = beginOfProjectConfig.get(project)
configList.add("$project 耗时:${System.currentTimeMillis() - begin} ms")
}
def beginOfProjectExecute = 0L
gradle.taskGraph.whenReady {
println '----------------------配置阶段----------------------'
configList.forEach { configStr ->
println(configStr)
}
println "配置阶段,总共耗时:${(System.currentTimeMillis() - beginOfConfig)} ms"
println '----------------------配置阶段----------------------'
beginOfProjectExecute = System.currentTimeMillis()
}
/**
* 3、执行阶段
*/
def taskList = new ArrayList()
gradle.taskGraph.beforeTask { task ->
task.doFirst {
task.ext.beginOfTask = System.currentTimeMillis()
}
task.doLast {
/**
* 1、在Gradle中,task实例是通过实现task的实现类来创建的。当在Gradle文件中定义一个task时,Gradle会根据定义的task的名称和类型来创建对应的task实例。
* 2、对于task实例,Gradle会为其生成一个代理类,这个代理类是task实例的包装类,它实现了所有task的接口,并包含了task的所有属性和方法。这个代理类的名称通常是task的实现类名称加上'_Decorated',例如,如果task的实现类名称为MyTask,那么代理类的名称就是MyTask_Decorated。
* 3、当在Gradle文件中引用task实例时,实际上是在引用这个代理类,而不是task实现类本身。代理类负责调用task实现类中的方法和属性,并将结果返回给Gradle。这样做的好处是,代理类可以提供一些附加功能,例如缓存task的输出结果或拦截task的方法调用。
* 因此,当在Gradle文件中使用task.class.name来引用task实现类时,实际上是引用了task的代理类名称,这个代理类包装了task实现类,并提供了额外的功能和接口。
*/
taskList.add("$task : ${task.class.name - '_Decorated'} :耗时${System.currentTimeMillis() - task.beginOfTask} ms")
}
}
gradle.buildFinished {
println '----------------------执行阶段----------------------'
taskList.forEach { taskStr ->
println(taskStr)
}
println "执行阶段,总耗时:${System.currentTimeMillis() - beginOfProjectExecute} ms"
println '----------------------执行阶段----------------------'
}