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