Gradle中的依賴方式有以下幾種:
- implementation
- api (相當于Gradle3.0之前compile)
- compileOnly (相當于Gradle3.0之前provided )
- runtimeOnly(相當于Gradle3.0之前apk)
其中implementation和api在前面可以加上debug瞬浓,release或者test聲明僻爽,例如debugApi
詳細說明:
- 使用implementation依賴可以減少構(gòu)建時間,例如Module A implementation Module B,Module B implementation Module C敲董,此時A無法引用中的內(nèi)容惠猿。當C發(fā)生改變時颓鲜,A不需要重新編譯孽水。
- 使用api的依賴,還是上面的例子匣屡,A可以引用C中的內(nèi)容封救。
- compileOnly的依賴只有編譯時可以用,不會打包到apk(注釋處理器等)
- runtimeOnly的依賴編譯時不可用捣作,會打包到apk
基本語法
第一手資料 Groovy API誉结,Gradle Doc
下面列出幾個常用的和Java區(qū)別比較大的:
- with,給對象賦值
obj.with {
name = "android"
phone= "145555555"
}
- 和python相似的判斷true或false
if (str) { }
- kotlin相似的判空
obj?.setData()
- 使用each遍歷Map或List
map.each {
println "map:[${it.key} : ${it.value}]"
}
- XmlParser解析Xml
def xml = new XmlParser().parse(new File("test.xml"))
// 訪問view節(jié)點的name屬性
println xml['view'].@name[0]
- 在android studio中直接運行Groovy券躁,使用命令gradlew test
task(test).doLast {
println "start execute yuangshuo"
getString()
}
def getString() {
}
更多基礎(chǔ)語法:
Groovy快速入門指南
Gradle腳本基礎(chǔ)全攻略
Gradle生命周期和執(zhí)行順序
Gradle的生命周期分為3個階段:Initialization惩坑、Configuration和Execution
- 首先解析settings.gradle來獲取模塊信息(Initialization階段)
- configure項目中top-level的build.gradle,然后configure每個module的build.gradle也拜,配置的時候并不會執(zhí)行task旭贬,一個module執(zhí)行configure結(jié)束會執(zhí)行project.afterEvaluate(Configuration階段)
- 按configure順序執(zhí)行(Execution階段)
// 打印日志順序
setting##init
top-level##init
app##init
app##afterEvaluate
common##init
app##task
詳細學習:Gradle基礎(chǔ) - 構(gòu)建生命周期和Hook技術(shù)
常用Api
定義Task
- 第一種方式
task myTask {
println "config myTask"
}
myTask.doLast {
println "after execute myTask"
}
myTask.doFirst {
println "before execute myTask"
}
執(zhí)行一個task時,都會先執(zhí)行task的配置搪泳,doFirst是在task開始執(zhí)行之前,而doLast則是在執(zhí)行后扼脐,兩者都是在task配置之后執(zhí)行的岸军,因為執(zhí)行任意一個task奋刽,都需要先配置一遍。每個task執(zhí)行之前都需要進行一遍完整的配置艰赞。
- 第二種方式
class MyTask extends DefaultTask {
@TaskAction
def hello() {
println "Hello world."
}
}
task taskname(type : MyTask)
@TaskAction表示task要執(zhí)行的動作
- 第三種方式
project.task('myTask').doLast {
println "after execute myTask"
}
Task依賴
task taskA(dependsOn: 'taskB') {
doLast {
println 'taskA'
}
}
task taskB {
doLast {
println 'taskB#1'
}
}
taskB.doLast {
println 'taskB#2'
}
執(zhí)行g(shù)radlew taskA佣谐,打印結(jié)果
> Task :app:taskB
taskB#1
taskB#2
> Task :app:taskA
taskA
一個Task執(zhí)行前先執(zhí)行其依賴的Task,doFirst和doLast可以被執(zhí)行多次
Gradle命令:
- gradlew project:列出項目module名稱
- gradlew build:執(zhí)行build操作
- gradlew taskname:執(zhí)行某個task
- gradlew -x taskname:執(zhí)行build操作但排除某個task
- gradlew tasks:列出項目中所有任務
- gradlew help –task taskname:顯示某個task的詳細信息
Gradle日志級別
- Error 錯誤級別
- Quiet 重要級別
- Warning 警告級別
- LifeCycle 進度信息
- Info 信息性信息
- Debug 調(diào)試信息
gradlew -q taskname 可以控制日志輸出級別