0%

Gradle替换task

背景

Gradle替换Task本身对Gradle侵入性很大,可能因为替换Task导致Gradle版本升级带来兼容问题,但TaskContainer中又存在一个replace方法,其实也体现了Gradle是允许我们去替换Task的。 事实上替换Task有时也是很有必要的,当我们需要定制一些Task的输入输出时,原生的task满足不了我们的需求,我们就得去替换Task来实现我们的一些需求。

下面代码中实现了替换GenerateBuildConfig,需要我们重新去实现这个Task,示例中并没有实现task,而是进行了替换,所有BuildConfig.java并不会生成。

实现

ReplaceTask

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
public abstract class ReplaceTask<T extends Task, R extends Task> {
public ReplaceTask() {
}

public abstract Class<R> getReplaceTaskClass();

public abstract Class<T> getCustomTaskClass();


public void replace(Project project) {
List<Task> replaceTasks = new ArrayList<>();
for (Task task : project.getTasks()) {
if (task.getClass().getName().startsWith(getReplaceTaskClass().getName())) {
replaceTasks.add(task);
}
}

for (Task replaceTask : replaceTasks) {
project.getTasks().remove(replaceTask);
}

for (Task replaceTask : replaceTasks) {
Task task = project.getTasks().create(replaceTask.getName(), getCustomTaskClass());
task.dependsOn(replaceTask.getDependsOn());
}

}


public void replace2(Project project) {
List<Task> replaceTasks = new ArrayList<>();
for (Task task : project.getTasks()) {
if (task.getClass().getName().startsWith(getReplaceTaskClass().getName())) {
replaceTasks.add(task);
}
}

for (Task replaceTask : replaceTasks) {
Task task = project.getTasks().replace(replaceTask.getName(), getCustomTaskClass());
task.dependsOn(replaceTask.getDependsOn());
}
}
}

GenerateBuildConfigReplace

1
2
3
4
5
6
7
8
9
10
11
public class GenerateBuildConfigReplace extends ReplaceTask<GenerateBuildConfigExt, GenerateBuildConfig>{
@Override
public Class<GenerateBuildConfig> getReplaceTaskClass() {
return GenerateBuildConfig.class;
}

@Override
public Class<GenerateBuildConfigExt> getCustomTaskClass() {
return GenerateBuildConfigExt.class;
}
}

GenerateBuildConfigExt

1
2
3
4
5
6
7
8
9
10
11
public class GenerateBuildConfigExt extends BaseTask {

public void action(){
setVariantName("debug");
}

@TaskAction
public void process(){
getLogger().debug("我被替换了");
}
}

build.gradle

1
2
3
4
afterEvaluate {
GenerateBuildConfigReplace replace = new GenerateBuildConfigReplace()
replace.replace(project) // replace.replace2(project)
}

运行

替换结果

运行结果