前言
最近寫 Kotlin 寫的有些著魔了,正好看到 Gradle 4.10 版本支持使用 Kotlin DSL 構(gòu)建腳本慌植,然后心血來潮的嘗鮮了下甚牲,因為剛出來,相關(guān)的資料實在太少蝶柿,實際在遷移過程遇到不少問題丈钙,所以本文可能是第一篇非官方遷移指導(dǎo)文檔,希望可以 save your time !
好了交汤,話不多說雏赦,馬上開始遷移(踩坑)之旅
準(zhǔn)備工作
確認(rèn)你的 IDE 是否最新版本,如不是芙扎,請升級到最新版本星岗,本文是基于 Android Studio 3.1.4 版本進(jìn)行的遷移
遷移過程可能會出現(xiàn)一些意想不到的坑,建議找個空閑時間戒洼,買杯咖啡俏橘,然后做好......和丫死磕的準(zhǔn)備 :)
不建議在實際項目中直接遷移,畢竟對于 Kotlin 的支持剛出來圈浇,還不太穩(wěn)定寥掐,可以拉個分支或者弄個Demo工程體驗一下。
開始遷移
步驟一. 升級 Gradle 4.10磷蜀,建議通過以下命令進(jìn)行升級:
./gradlew wrapper --gradle-version=4.10
需要等待一段下載時間召耘,更新完成后,點擊 sync 按鈕褐隆,好了污它,不出意外,這里會遇到第一個問題庶弃,如下圖:
我們看下異常描述
Configuration on demand is not supported by the current version of the Android Gradle plugin since you are using Gradle version 4.6 or above. Suggestion: disable configuration on demand by setting org.gradle.configureondemand=false in your gradle.properties file or use a Gradle version less than 4.6.
簡單來講衫贬,Android Gradle 插件不支持基于新版本的 Gradle 的按需配置,異常描述里也提供兩個解決辦法:
- 在
gradle.properties
增加org.gradle.configureondemand=false
設(shè)置 - 使用低于 Gradle 4.6 以下的版本
ok歇攻,首先降版本的方案肯定被 pass 了固惯,那就在我們項目的 gradle.properties
加上一段配置貌似就可以了,大功告成掉伏,so easy ~
too navie缝呕,當(dāng)你加上這段配置后,你會發(fā)現(xiàn)仍舊無法通過編譯斧散,錯誤依舊供常,為此,我專門檢查了好幾遍是不是少了個字母之類的鸡捐,顯然和這個沒有一毛錢關(guān)系栈暇,這里不應(yīng)該質(zhì)疑自己作為一名 CV 戰(zhàn)士的專業(yè)性。
其實是被異常描述里給誤導(dǎo)了箍镜,至少我直覺上是直接去修改工程里的 gradle.properties
源祈,實際上,你需要修改的是 ${HOME}/.gradle/gradle.properties
色迂,當(dāng)然也有更簡單的方式香缺,如圖:
更多信息可以看這個回答:configuration-on-demand-is-not-supported
確認(rèn) sync 成功后,接下來就可以正式進(jìn)行 Kotlin DSL 遷移了
步驟二. 使用 Kotlin 重寫 Groovy
需要注意的地方是:
- Groovy DSL script files use the .gradle file name extension.
- Kotlin DSL script files use the .gradle.kts file name extension.
這里歇僧,我直接對原有的 build.gradle
腳本通過重命名的方式图张,修改為 build.gradle.kts
的后綴名,可能會提示有沖突诈悍,這里不用管祸轮,直接點擊 continu,然后你會發(fā)現(xiàn)腳本里一片飆紅侥钳,不用擔(dān)心适袜,之前的 Groovy 語法在 Kotlin 報錯了而已,推薦全部刪掉舷夺,然后對照著用 Kotlin 重新寫一遍苦酱,這樣,會印象深刻一些冕房。
這里以一個比較簡單的示例工程說明一下:
我們分別對根目錄的 settting.gradle
和 build.gradle
以及 app
目錄下的 build.gradle
進(jìn)行重寫躏啰,以我的操作路徑為例(不同操作路徑,可能遇到的問題不一樣):
app/build.gradle
-> setting.gradle
-> build.gradle
說下幾個需要注意的地方:
需要說明的一點耙册,目前 Gradle 官方是支持 Groovy 腳本和 Kotlin 并存的给僵,雖然我感覺支持的并不太好
1. android
配置項無法自動被識別出來,如圖所示:
解決辦法:不用管详拙,直接寫一個配置項出來帝际,然后 sync 同步一下就可以了,如圖:
2.
signconfig release
配置變更
signingConfigs {
create("release") {
storeFile = file("your keystore path")
storePassword = "your password"
keyAlias = "your alias"
keyPassword = "your password"
}
getByName("debug") {
storeFile = file("your keystore path")
storePassword = "your password"
keyAlias = "your alias"
keyPassword = "your password"
}
}
3. 重命名生成的 apk
文件名
大部分開發(fā)當(dāng)中應(yīng)該都會有對輸出的 apk
有重命名的需求饶辙,原來我在 Groovy 中是通過:
applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${flavors}@app_$versionName}.apk"
}
}
遷移到 Kotlin 發(fā)現(xiàn)無法直接使用 outputFileName
的屬性了
解決辦法:顯式轉(zhuǎn)為具體實現(xiàn)類
android.applicationVariants.all {
outputs.all {
if (this is ApkVariantOutputImpl) {
this.outputFileName = "$flavors@app_$versionName.apk"
}
}
}
4. setting.gradle
配置指定 build.gradle.kts
rootProject.buildFileName = "build.gradle.kts"
include("app")
好了蹲诀,如果你沒遇到其他問題的話,到這里基本就已經(jīng)大功告成了弃揽!
另外脯爪,本文的示例工程我已經(jīng)放到 GitHub 上了则北,各位感興趣的可以去看下~
總結(jié)
首先對于 Gradle 這么快就支持 Kotlin DSL,我還是感到很驚喜的痕慢,其實尚揣,費了不少時間這么折騰了一下,實際上掖举,如果一定要說作用的話快骗,可能確實沒有什么作用。
但是塔次,我覺得好處還是要說一說的方篮,對于使用 Kotlin 開發(fā)的小伙伴來說,首先開發(fā)語言和構(gòu)建語言統(tǒng)一了励负,之前想寫構(gòu)建腳本藕溅,還需要去學(xué)習(xí) Groovy。現(xiàn)在直接可以愉快的用 Kotlin 去寫 Gradle 構(gòu)建腳本了继榆。