从Gradle生命周期到自定义Task挂接到Build构建流程全解 - 掘金
我们知道,Gradle 的构建流程是通过执行一系列的 Task 任务来完成的,每一个Task完成自己独特的工作之后,就根据Task的依赖关系,执行下一个 Task 任务。如:preBuild(开始构建之前执行的Task任务)->mergeDebugResources(合并资源文件的Task任务)->assembleDebug(生成debug包的任务)。
如果想把自己写的Task也插入到构建流程中,在运行的时候自动执行我们的Task任务,又该如何做呢?这个时候就可以通过指定Task的执行顺序,把我们的 Task 加入到构建流程中,具体来说就是:明确自己的任务需要插入到哪个任务之后或者之前,接着找到这个任务,并把自己的任务插入到这个任务的前面或者后面。
可以通过如下方式,把自定义的 Task 插入到指定的任务
- afterEvaluate {
- // 1. 找到需要依赖自己 Task的构建流程的Task
- def mergeResourcesTask = tasks.findByName("mergeDebugResources")
- println "mergeResourcesTask=$mergeResourcesTask"
- // 2. 通过dependsOn 方法,插入到指定Task之前
- mergeResourcesTask.dependsOn(checkBigImage)
- }
- 复制代码
插入自定义 Task 之前的 Task 依赖关系图:

插入自定义 Task 之后的 Task 依赖关系图:

从Task的依赖关系图可以看出,mergeDebugResources 任务确实是依赖于checkBigImage任务了,这样在运行编译app的时候,就会在执行 mergeDebugResources 任务的时候,先去执行 checkBigImage 任务了。
- afterEvaluate {
- // 1. 找到需要依赖自己 Task的构建流程的Task
- def mergeResourcesTask = tasks.findByName("mergeDebugResources")
- println "mergeResourcesTask=$mergeResourcesTask"
- // 2. 通过 finalizedBy 方法,插入到指定Task之后
- mergeResourcesTask.finalizedBy(checkBigImage)
- }
- 复制代码
- afterEvaluate {
-
- // 1. 找到需要挂接的Task
- def mergeResourcesTask = tasks.findByName("mergeDebugResources")
- def processDebugResourcesTask = tasks.findByName("processDebugResources")
-
- // 2.让自定义的 Task 在 mergeDebugResources 任务之后且在 processDebugResources 之前执行
- checkBigImage.mustRunAfter(mergeResourcesTask)
- processDebugResourcesTask.dependsOn(checkBigImage)
- }
- 复制代码
