Chapter7:使用Gradle创建任务
7.1了解Groovy
变量:
//字符串可用单引号/双引号;双引号可以插入表达式 def name = 'Andy' println(name) //包含一个单独变量的占位符表达式:$前缀 def greeting = "Hello, $name!" println(greeting) //包含一个方法或多个变量的占位符表达式:$前缀+花括号包裹 def name_size = "Your name is ${name.size()} characters long" println(name_size) //字符串差值允许动态执行代码: def method = 'toString' println new Date()."$method"()
类和成员变量:
class MyGroovyClass{ String greeting String getGreeting() { return greeting } void setGreeting(String greeting) { this.greeting = greeting } } def instance = new MyGroovyClass() instance.setGreeting("Hello") //也可以省略括号:println instance.getGreeting println instance.getGreeting()
方法:
//def 定义方法,隐含一个返回值,即方法体的最后一行 def square(def num){ num*num } println square(4) //一种更简短的定义方式,使用了Closures def square = {num -> num*num } println square(4)
匿名代码块(Closures):
//不指定参数,会自动添加默认参数 Closure square = { it*it } println square (4)
集合:(lists 和 maps)
//List List list = [1,2,3,4,5] list.each() {element-> println(element) } //使用it变量化简 list.each() { println(it) }
//Map Map price = [apple:10,banana:20] println price.get('apple') println price.banana
Gradle 中的 groovy:
apply plugin: 'com.android.application' //等价于 project.apply([plugin: 'com.android.application']) //apply()是Project类的一个方法;Project是每个Gradle构建的基础代码块; //apply()需要一个参数:一个Map(key为plugin,值为com.android.application)
dependencies{ implementation 'androidx.cardview:cardview:1.0.0' } //代码块是一个Closure,将dependencies()方法传递给Project对象 //closure被传递给一个包含add()方法的DependencyHandler //该方法接受三个参数:一个定义配置的字符串,一个定义依赖标志的对象,一个针对依赖特定属性的closure //等价于 project.dependencies({ add('implementation','androidx.cardview:cardview:1.0.0',{ //Configuration statements }) })
7.2 了解任务
任务属于一个 Project 对象,并且每个任务都可以执行 task 接口。
task hello{ //配置阶段 println('Configuration') //执行阶段 doLast{ println 'Execution' } }
doFirst/doLast:
doFirst()总是添加一个动作到task的最前面,doLast()总是添加一个动作到task的最后面。
task mindTheOrder{ doFirst{ println 'A' } doFirst{ println 'B' } doLast{ println 'C' } doLast{ println 'D' } }
taskAfter:(安排执行任务顺序)
task task1{ doLast{ println("task1") } } task task2{ doLast{ println("task2") } } task2.mustRunAfter task1
dependsOn:(任务依赖)
task task1{ doLast{ println("task1") } } task task2{ doLast{ println("task2") } } task2.dependsOn task1
7.3 操控构建 variants
Hook 到 Android 插件的方式之一是操控构建 variants。
android.applicationVariants.all{variant -> // Do something }
依赖库时使用 libraryVariants 替代 applicationVariants。
注意:通过All()遍历构建variant,而不是 each(),因为each()会在构建variant被Android插件构建之前的评测阶段被处罚。all()方法会在每次添加新项目到集合是被触发。
自动重命名APK:
android.applicationVariants.all{variant -> variant.outputs.all{output -> outputFileName = "app-${variant.versionName}.apk" } }
7.4 参考资料
- Gradle For Android