
說(shuō)明
在Android應(yīng)用開(kāi)發(fā)中,離不開(kāi)Gradle腳本的構(gòu)建,它的重要性不言而喻,它是使用一種基于Groovy的特定領(lǐng)域語(yǔ)言(DSL)來(lái)聲明項(xiàng)目設(shè)置,拋棄了基于XML的各種繁瑣配置。很多人可能知道Gradle腳本使用Groovy語(yǔ)言來(lái)編寫(xiě),但是可能并不會(huì)Groovy語(yǔ)言,只是記住固定的配置,比如:我們要依賴(lài)三方庫(kù),只需要這樣配置即可:implementation 'androidx.appcompat:appcompat:1.0.2'。
不懂Groovy語(yǔ)言不影響正常的使用,但是有時(shí)候我們想通過(guò)Gradle腳本來(lái)實(shí)現(xiàn)一些特殊的功能,比如:打包后自動(dòng)上傳到蒲公英,方便測(cè)試團(tuán)隊(duì)測(cè)試,以及使用Gradle來(lái)記錄每個(gè)版本的更新信息并上傳到服務(wù)器等等,這時(shí)候需要我們自己來(lái)實(shí)現(xiàn)了,這就需要我們了解Groovy語(yǔ)言。當(dāng)然因?yàn)?strong>Groovy語(yǔ)言它是對(duì)Java代碼進(jìn)行了擴(kuò)展,我們完全可以使用Java代碼來(lái)編寫(xiě),但是語(yǔ)法就顯得有些啰嗦。而學(xué)習(xí)Groovy語(yǔ)言是需要一定成本的,并且在Android Studio是沒(méi)有語(yǔ)法提示的。
Kotlin Meets Gradle
Gradle團(tuán)隊(duì)為Gradle開(kāi)發(fā)了一種新的基于Kotlin的構(gòu)建語(yǔ)言,稱(chēng)之為Gradle Script Kotlin,從Gradle 3.0開(kāi)始支持。也就是說(shuō)我們可以使用Kotlin來(lái)編寫(xiě)Gradle腳本了,當(dāng)使用Kotlin來(lái)編寫(xiě)Gradle腳本的時(shí)候一切都變得美好了:
- 腳本代碼可以自動(dòng)補(bǔ)全了
- 源碼之間可以互相跳轉(zhuǎn)了
- 插件源碼更容易看懂了
- 支持重構(gòu)了
使用Kotlin編寫(xiě)Gradle
下面我們就用kotlin來(lái)改造項(xiàng)目中的Gradle腳本。Gradle Script Kotlin腳本以.gradle.kts后綴結(jié)尾。所以,我們需要將工程根目錄gradle文件更名.gradle.kts。
1.更改settings.gradle
將工程根目錄settings.gradle更名為settings.gradle.kts。

更改后文件報(bào)錯(cuò)了,我們需要改成Kotlin語(yǔ)法,這里就是一個(gè)方法調(diào)用。修改后如下所示:

可以看到,參數(shù)含義自動(dòng)提示了。
2.更改根目錄下的build.gradle
同理,先修改擴(kuò)展名,再改成Kotlin語(yǔ)法,修改后的文件如下所示:

由于我們修改了build.gradle的文件名,為了保證工程可以使用這個(gè)腳本,需要在settings.gradle.kts中添加一行代碼,讓Gradle知道使用build.gradle.kts腳本構(gòu)建。
include(":app")
rootProject.buildFileName = "build.gradle.kts"
3.修改app模塊中的build.gradle
操作跟上面的步驟一樣,修改后的文件內(nèi)容如下所示:

從上面的示例中我們可以看到修改成gradle.kts后,語(yǔ)法有了提示,并且點(diǎn)擊可以直接跳轉(zhuǎn)到源碼。并且更加容易理解每一步的配置。

使用Gradle Script Kotlin后,我們可以用Kotlin來(lái)開(kāi)發(fā)插件或者編寫(xiě)腳本,如果開(kāi)發(fā)插件,可以改成下面的寫(xiě)法了:
class MyPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.run {
tasks {
register("myCopyTask", Copy::class) {
group = "sample"
from("build.gradle.kts")
into("build/copy")
}
}
}
}
}
有沒(méi)有感覺(jué)很親切。更多示例請(qǐng)查看官方Demo。