Gradle是基於Groovy語言的DSL,用於項目構建。與Ant和Maven相比的優勢在於本身是一門語言,可以做一些特定邏輯,靈活許多
Gradle生命週期
Gradle生命週期分爲三個階段:
1.初始化階段:生成project對象
2.配置階段:生成task對象,並完成task拓撲圖
3.執行階段:執行任務以及依賴的所有任務
生命週期相關API:
//配置階段開始前
this.beforeEvalute{
//doSomething
}
//配置階段完成後,即生成了task拓撲圖後
this.afterEvalute{
//doSomething
}
//gradle執行完成後,task執行完後
this.gradle.buildFinished{
//doSomething
}
//等同於this.beforeEvaluate
this.gradle.beforeProject{}
//等同於this.afterEvaluate
this.gradle.afterProject{}
//初始化階段
setting.gradle文件腳本內容即是在初始化階段執行的
Project
AndroidStudio中每個Module就是Project,每個Module都有相應的build.gradle文件
Project相關API
//獲取所有Project
this.getAllProjects()
//獲取所有子Project
this.getSubProjects()
//獲取根Project
this.getRootProject()
//獲取父Project
this.getParent()
根據路徑獲取Project
project('app') {
Project project ->
println project.name
apply plugin: 'com.android.application'
android{
//相關配置
}
}
//配置所有Project
allprojects {
//配置所有project
group 'com.breeze'
version '1.0.0'
}
subprojects {
apply from 'common.gradle'
}
//判斷是否是庫工程
project.plugins.hasPlugin('com.android.library')
Project屬性相關API
每個Project都有一個ext可以存放自己定義的屬性
寫法
ext {
Version = '1.0.0'
compileVersion = 28
}
腳本中使用ext.Version即可
注意點:根Project的屬性默認子Project是繼承的,於是當要給所有的project配置屬性時,只需要在根Project配置即可
項目中使用,可以將配置抽取到一個文件中,再在根Project中引進該文件
如android中將配置抽取到common.gradle
ext {
android = [
compileSdkVersion : 28,
applicationId : "com.sq.sqpackartifact",
minSdkVersion : 19,
targetSdkVersion: 28,
versionCode: 1,
versionName: "1.0"
]
libs = [
kotlinStdLib : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version",
supportAppCompatLib : "com.android.support:appcompat-v7:28.0.0",
okhttpLib : "com.squareup.okhttp3:okhttp:3.12.0",
okhttpLogLib: 'com.squareup.okhttp3:logging-interceptor:3.8.1',
gsonLib : "com.google.code.gson:gson:2.8.5",
retrofitLib : "com.squareup.retrofit2:retrofit:2.5.0",
retrofitRxJavaLib : "com.squareup.retrofit2:adapter-rxjava:2.5.0",
retrofitGsonLib : "com.squareup.retrofit2:converter-gson:2.5.0",
rxAndroidLib : "io.reactivex:rxandroid:1.2.1",
rxKotlinLib : "io.reactivex:rxkotlin:1.0.0"
]
}
根project中引入該文件
apply from: 'common.gradle'
子project中使用:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation rootProject.ext.libs.kotlinStdLib
implementation rootProject.ext.libs.supportAppCompatLib
//okhttp
implementation rootProject.ext.libs.okhttpLib
implementation rootProject.ext.libs.okhttpLogLib
//gson
implementation rootProject.ext.libs.gsonLib
//retrofit
implementation rootProject.ext.libs.retrofitLib
implementation rootProject.ext.libs.retrofitRxJavaLib
implementation rootProject.ext.libs.retrofitGsonLib
//rx
implementation rootProject.ext.libs.rxAndroidLib
implementation rootProject.ext.libs.rxKotlinLib
//download
implementation project(path: ':download')
}
Task
定義Task
方法一:
task helloTask(group:'breeze', description:'task study') {
println 'hello'
}
上述實際上是調用了task(‘taskName’, closure)創建task
方法二:
tasks是TaskContainer,是task的管理類,上面定義task的方式實際上也是由TaskContainer管理的
this.tasks.create(name: 'helloTask2') {
setGroup('breeze')
setDescription('task study'')
println 'i am task'
}
Task生命週期
task A {
println 'task a config'
doFirst {
println 'task a doFirst'
}
doLast {
println 'task a doLast'
}
}
上述代碼中的執行順序是 config->doFirst->doLast這樣,並且config是在project的生命週期的第二個步驟配置task時執行的
Task依賴
圖中是執行build命令時gradle執行的一系列task
達到該效果,需要使用task的DependsOn方法
使用dependsOn方法給A任務添加依賴task B,在執行A時就會先執行B
task A(dependsOn:'B') {
doLast {
println 'task a execute'
}
}
task B {
doLast{
println 'task b execute'
}
}
//也可以寫成
task A {
doLast {
println 'task a execute'
}
}
task B {
doLast{
println 'task b execute'
}
}
project.afterEvaluate {
tasks.getByName('A').dependsOn('B')
}
另外和依賴相關的還有兩個方法,mustDoAfter, ShouldDoAfter,和DependsOn不同的是這兩個只是影響執行順序
task A {
doLast {
println 'task a execute'
}
}
task B {
shouldRunAfter 'A'
doLast {
println 'task b execute'
}
}
任務A,B仍然可以單獨執行,並不會因爲shouldRunAfter而在執行B時先去執行A
但當任務都進行時,執行順序就會變化了,無論是執行gradlew A B還是執行gradlew B A都是先執行A再執行B的
mustRunAfter和shouldRunAfter作用基本一致,唯一的不同點是,當任務循環時,shouldRunAfter要求沒那麼嚴格,可以忽略