一、Gradle 基础
二、Gradle 构建
三、Task 编写和使用
四、Plugin 编写和使用
Task 编写和使用
Task
我们可以看成⼀个个任务,这个任务可以是编译 java
代码、编译 C/C++
代码、编译资源⽂件⽣成对应的 R
⽂件、打包⽣成 jar
库⽂件、签名、图⽚压缩、打包⽣成 APK
⽂件、包/资源发布等。每⼀个 Task
任务都是为了实现某个⽬的,可以理解为⼀个步骤,最终⼀个个步骤按序执⾏就完成了整个项⽬构建。
// 1. 使用 Project.task 注册和配置 task
task("helloworld") {
println("Hello World Configuring")
doFirst {
println("Hello World Do First")
}
doLast {
println("Hello World Do Last")
}
}
// 2. 使用 TaskContainer register 和 named 注册和配置 task
tasks.register("DependedTask")
tasks.named("DependedTask") {
def taskName = it.name
doLast {
println("executing ${taskName}")
}
}
// 3. 使用 TaskContainer register 和 TaskProvider.configure 注册和配置 task
def mustRunAfterTask = tasks.register("MustRunAfterTask")
mustRunAfterTask.configure {
def taskName = it.name
doLast {
println("executing MustRunAfterTask")
}
}
(0..11).each { i ->
tasks.register("DynamicallyCreatedTask_" + i) { // 8. 动态创建 task
group = "DynamicallyCreatedTask" // 4. 设置 task group 属性
description = "dynamically created tasks" // // 5. 设置 task description 属性
def taskName = it.name
doLast { // 6. 执行阶段 task 运行代码
println("executing " + taskName)
}
doFirst { // 6. 执行阶段 task 运行代码
if (i % 2 == 1) {
def toThrowExceptionProvider = providers.gradleProperty("toThrowException")
def toThrowException = toThrowExceptionProvider.getOrNull()
if (toThrowException == 'true') { // 9. 跳过任务之抛出 StopExecutionException 异常
throw new StopExecutionException("to throw stop execution exception")
}
}
}
println("configuration ${taskName}") // 7. configuration 阶段 task 运行代码
if (i % 2 == 0) {
dependsOn("DependedTask") // 8. 任务之间依赖
mustRunAfter("MustRunAfterTask") // 8. 任务之间依赖
} else {
def toDisableProvider = providers.gradleProperty("toDisable")
if (toDisableProvider.getOrNull() == 'true') { // 9. 跳过任务之设置 enabled 为 false
enabled = false
}
def toSkipProvider = providers.gradleProperty("toSkip")
onlyIf("toSkip property equals true") { // 9. 跳过任务之使用 onlyIf
!(toSkipProvider.getOrNull() == 'true')
}
}
}
}
abstract class MyTask extends DefaultTask { // 10. 自定义 task 继承 DefaultTask
@Input // 12. 定义 task 输入
def fileText = getProject().providers.gradleProperty("fileText")
@Input
def fileName = "myfile.txt"
@OutputFile // 13. 定义 task 输出
def myFile = new File(fileName)
@TaskAction
def action() { // 11. 自定义 task action 按照定义顺序逆序执行
println("write myfile.txt")
myFile.createNewFile()
myFile.write(fileText.getOrElse("empty"))
}
@TaskAction
def doAction1() { // 11. 自定义 task action 按照定义顺序逆序执行
println("${this.class.name}: excuting Action1")
}
@TaskAction
def doAction2() { // 11. 自定义 task action 按照定义顺序逆序执行
println("${this.class.name}: excuting Action2")
}
}
tasks.register("createFileTask", MyTask.class) {
group = "custom"
description = "Create myfile.txt in the current directory"
}
tasks.named("createFileTask", MyTask.class) {
fileText.getOrElse("HELLO FROM THE NAMED METHOD")
}
1. task 注册和配置
-
注释1:使用
Project.task
注册和配置 task; -
注释2:使用
TaskContainer register
和named
注册和配置task
; -
注释3:使用
TaskContainer register
和TaskProvider.configure
注册和配置task
;C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew helloworld DependedTask MustRunAfterTask > Configure project :app Hello World Configuring > Task :app:helloworld Hello World Do First Hello World Do Last > Task :app:DependedTask executing DependedTask > Task :app:MustRunAfterTask executing MustRunAfterTask BUILD SUCCESSFUL in 783ms 3 actionable tasks: 3 executed
2. 动态创建 task
-
注释8:动态创建 task;
-
注释6:执行阶段 task 运行代码;
-
注释7:
configuration
阶段task
运行代码;C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew DynamicallyCreatedTask_1 > Configure project :app # 配置阶段 task 运行代码 Hello World Configuring configuration DynamicallyCreatedTask_1 > Task :app:DynamicallyCreatedTask_1 # 运行阶段 task 运行代码 executing DynamicallyCreatedTask_1 BUILD SUCCESSFUL in 717ms 1 actionable task: 1 executed
3. task 之间的依赖
-
注释8:任务之间依赖,任务之间可以依赖,常见的依赖:
dependsOn
、mustRunAfter
和shouldRunAfter
C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew DynamicallyCreatedTask_6 MustRunAfterTask > Configure project :app Hello World Configuring configuration DynamicallyCreatedTask_6 > Task :app:MustRunAfterTask executing MustRunAfterTask > Task :app:DependedTask # DependedTask 在 DynamicallyCreatedTask_6 之前运行,哪怕没有指定运行 executing DependedTask > Task :app:DynamicallyCreatedTask_6 # DynamicallyCreatedTask_6 在 MustRunAfterTask 后运行,哪怕 DynamicallyCreatedTask_6 定义运行顺序在 MustRunAfterTask 之前 executing DynamicallyCreatedTask_6 BUILD SUCCESSFUL in 744ms 3 actionable tasks: 3 executed
4. task 跳过
-
任务跳过有三种方式:抛出
StopExecutionException
异常;设置enabled
为false
;使用onlyIf
C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew DynamicallyCreatedTask_6 DynamicallyCreatedTask_5 -PtoSkip=true > Configure project :app Hello World Configuring configuration DynamicallyCreatedTask_6 configuration DynamicallyCreatedTask_5 # 执行阶段跳过执行 DynamicallyCreatedTask_5,只在配置阶段执行 > Task :app:DependedTask executing DependedTask > Task :app:DynamicallyCreatedTask_6 executing DynamicallyCreatedTask_6 BUILD SUCCESSFUL in 826ms 2 actionable tasks: 2 executed
5. 自定义task
-
注释10:自定义
task
继承DefaultTask
; -
注释11:自定义
task action
按照定义顺序逆序执行; -
注释12:
@input
定义task
输入; -
注释13:
@output
定义task
输入;C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew createFileTask -PfileText="file text hello gradle" > Configure project :app Hello World Configuring > Task :app:createFileTask MyTask_Decorated: excuting Action1 # 自定义 task action 按照定义顺序逆序执行 MyTask_Decorated: excuting Action2 write myfile.txt BUILD SUCCESSFUL in 791ms 1 actionable task: 1 executed