0%

Gradle 用法

主要包含:

1
2
3
settings.gradle
build.gradle
app/build.gradle

以及gradle wrapper下的gradle jar包和配置文件

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
//settings.gradle
println("setting 开始配置")
include ':app'
rootProject.name='Hello'
println("setting 配置完成")


//project build.gradle
println("根build.gradle 开始配置")
buildscript {
repositories {
}
dependencies {
}
}
println("根build.gradle 配置完成")


//app build.gradle
println("app build.gradle 开始配置")

project.afterEvaluate {
println "所有模块都已配置完成"
}

android {
defaultConfig {
}
buildTypes {
}
}

dependencies {
}
println("app build.gradle 配置完成")

三个文件中:
settings.gradle 先执行
build.gradle 第二执行
app/build.gradle 第三执行,如果注册了 project.afterEvaluate ,则后执行
在不同文件中注册project.afterEvaluate,对于不同的project

1
2
3
4
5
6
7
8
9
10
11
12
setting 开始配置
setting 配置完成

> Configure project :
根build.gradle 开始配置
根build.gradle 配置完成
build.gradle 所有模块都已配置完成

> Configure project :app
app build.gradle 开始配置
app build.gradle 配置完成
app build.gradle 所有模块都已配置完成

在settings.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
gradle.addBuildListener(new BuildListener() {

@Override
void beforeSettings(Settings settings) {
super.beforeSettings(settings)
}

@Override
void settingsEvaluated(Settings settings) {
println("settingsEvaluated------------")
}

@Override
void projectsLoaded(Gradle gradle) {
println("projectsLoaded------------")
}

@Override
void projectsEvaluated(Gradle gradle) {
println("projectsEvaluated------------")
}

@Override
void buildFinished(BuildResult result) {
println("buildFinished------------")
}
})

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
setting 开始配置
setting 配置完成
settingsEvaluated------------
projectsLoaded------------

> Configure project :
根build.gradle 开始配置
根build.gradle 配置完成
build.gradle 所有模块都已配置完成

> Configure project :app
app build.gradle 开始配置
app build.gradle 配置完成
app build.gradle 所有模块都已配置完成
projectsEvaluated------------
buildFinished------------

如果是在build.gradle中添加则输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
setting 开始配置
setting 配置完成

> Configure project :
根build.gradle 开始配置
根build.gradle 配置完成
build.gradle 所有模块都已配置完成

> Configure project :app
app build.gradle 开始配置
app build.gradle 配置完成
app build.gradle 所有模块都已配置完成
projectsEvaluated------------
buildFinished------------

可以看到settingsEvaluated、projectsLoaded相关的没有打印,因为这个时候settingsEvaluated和projectsLoaded已经执行过了。

Gradle Task

在build.gradle文件中:

1
2
3
4
5
6
7
8
9
10
11
12
task hello() {
println "hello world"

//将给定的闭包 添加到此task操作链表的开头
doFirst {
println "hello task doFirst"
}

doLast {
println "hello task doLast"
}
}

settings.gradle是项目配置文件,无法添加task。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
setting 开始配置
setting 配置完成

> Configure project :
根build.gradle 开始配置
根build.gradle 配置完成
hello world
build.gradle 所有模块都已配置完成

> Configure project :app
app build.gradle 开始配置
app build.gradle 配置完成
app build.gradle 所有模块都已配置完成

> Task :hello
hello task doFirst
hello task doLast

可以看到,会先执行配置,然后才会执行task。
其中ext是内置变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ext.a="1222"

task hello() {
println "hello world"

//将给定的闭包 添加到此task操作链表的开头
doFirst {
println "hello task doFirst:$a"
}

doLast {
println "hello task doLast"
}
}
1
2
3
> Task :hello
hello task doFirst:1222
hello task doLast

Build监听

在settings.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
gradle.addBuildListener(new BuildListener() {

@Override
void beforeSettings(Settings settings) {
super.beforeSettings(settings)
println("beforeSettings------------")
}

@Override
void settingsEvaluated(Settings settings) {
println("settingsEvaluated------------")
}

@Override
void projectsLoaded(Gradle gradle) {
println("projectsLoaded------------")
}

@Override
void projectsEvaluated(Gradle gradle) {
println("projectsEvaluated------------")
}

@Override
void buildFinished(BuildResult result) {
println("buildFinished------------")
}
})

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
setting 开始配置
setting 配置完成
settingsEvaluated------------
projectsLoaded------------

> Configure project :
根build.gradle 开始配置
根build.gradle 配置完成
hello world
build.gradle 所有模块都已配置完成

> Configure project :app
app build.gradle 开始配置
app build.gradle 配置完成
app build.gradle 所有模块都已配置完成
projectsEvaluated------------
buildFinished------------

当执行assemble时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
setting 开始配置
setting 配置完成
settingsEvaluated------------
projectsLoaded------------

> Configure project :
根build.gradle 开始配置
根build.gradle 配置完成
hello world
build.gradle 所有模块都已配置完成

> Configure project :app
app build.gradle 开始配置
app build.gradle 配置完成
app build.gradle 所有模块都已配置完成
projectsEvaluated------------

> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
...
buildFinished------------

可以看到,先执行Evaluated settings,然后是Loaded projects,每个项目的配置设置完后,projectsEvaluated。之后执行各种Task。执行完最后完成buildFinished。

Task执行监听

1
2
3
4
5
6
7
8
9
10
11
gradle.addListener(new TaskExecutionListener() {
@Override
void beforeExecute(Task task) {
println "打印beforeExecute ${task} =="
}

@Override
void afterExecute(Task task, TaskState taskState) {
println "打印afterExecute ${task.getPath()} --- ${taskState} =="
}
})

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
setting 开始配置
setting 配置完成

> Configure project :
根build.gradle 开始配置
根build.gradle 配置完成
hello world
build.gradle 所有模块都已配置完成

> Configure project :app
app build.gradle 开始配置
app build.gradle 配置完成
app build.gradle 所有模块都已配置完成

> Task :app:preBuild UP-TO-DATE
打印beforeExecute task ':app:preBuild' ==
打印afterExecute :app:preBuild --- org.gradle.api.internal.tasks.TaskStateInternal@6bbf2d19 ==

> Task :app:preDebugBuild UP-TO-DATE
打印beforeExecute task ':app:preDebugBuild' ==
打印afterExecute :app:preDebugBuild --- org.gradle.api.internal.tasks.TaskStateInternal@62fecb05 ==
...

会在task执行前后打印日志

Gradle 插件

1
2
3
4
5
6
7
8
9
println("before apply plugin")
apply plugin: MyPlugin
println("after apply plugin")
class MyPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
println "apply MyPlugin: ${project.name}"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
setting 开始配置
setting 配置完成

> Configure project :
根build.gradle 开始配置
根build.gradle 配置完成
hello world
build.gradle 所有模块都已配置完成

> Configure project :app
app build.gradle 开始配置
app build.gradle 配置完成
before apply plugin
apply MyPlugin: app
after apply plugin
app build.gradle 所有模块都已配置完成

可以看到插件走的是配置。在配置时,会执行插件的apply。

1
2
3
4
5
6
7
8
9
10
11
println("before apply plugin")
apply plugin: MyPlugin
println("after apply plugin")
class MyPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
println "apply MyPlugin: ${project.name}"
project.extensions.add("testKey","helloWork")
}
}
println("$testKey")

通过 apply plugin: MyPlugin 后,将testKey 设置到project.extensions 中,后面直接使用。

Gradle Project

gradle project常用属性:

1
2
3
4
5
6
7
8
project.afterEvaluate{
}

project.plugins.hasPlugin("com.android.library")

project.configurations

project.gradle.addListener()

通过project中的字段来设置一些东西。

Gradle 依赖

1
2
3
4
5
6
7
8
9
10
11
project.gradle.addListener(new DependencyResolutionListener(){
@Override
void beforeResolve(ResolvableDependencies resolvableDependencies) {
// 此处可以改变或替换依赖
}

@Override
void afterResolve(ResolvableDependencies resolvableDependencies) {

}
})

Gradle 插件添加任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyTaskPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
project.task(...)
}
}

class MyProjectTask extends DefaultTask{
@Input
String xxx

@Input
String yyy

@TaskAction
void doPackage() {
// 执行任务
}
}

打印task耗时Demo

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
68
69
70
71
72
73
74
apply plugin: MyPlugin
class MyPlugin implements Plugin<Project>{
private Project mProject;
@Override
void apply(Project project) {
mProject = project;
//注册监听,以统计任务的耗时
project.gradle.addListener(new 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
}
}