背景
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) }
|
运行
替换结果
运行结果