Gradle指南之從Groovy遷移到Kotlin

前言

最近寫 Kotlin 寫的有些着魔了,正好看到 Gradle 4.10 版本支持使用 Kotlin DSL 構建腳本,而後心血來潮的嚐鮮了下,由於剛出來,相關的資料實在太少,實際在遷移過程遇到很多問題,因此本文多是第一篇非官方遷移指導文檔,但願能夠 save your time !android

好了,話很少說,立刻開始遷移(踩坑)之旅git

準備工做

  1. 確認你的 IDE 是否最新版本,如不是,請升級到最新版本,本文是基於 Android Studio 3.1.4 版本進行的遷移github

  2. 遷移過程可能會出現一些意想不到的坑,建議找個空閒時間,買杯咖啡,而後作好......和丫死磕的準備 :)app

不建議在實際項目中直接遷移,畢竟對於 Kotlin 的支持剛出來,還不太穩定,能夠拉個分支或者弄個Demo工程體驗一下。less

開始遷移

步驟一. 升級 Gradle 4.10,建議經過如下命令進行升級:ide

./gradlew wrapper --gradle-version=4.10學習

須要等待一段下載時間,更新完成後,點擊 sync 按鈕,好了,不出意外,這裏會遇到第一個問題,以下圖:gradle

咱們看下異常描述ui

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 的按需配置,異常描述裏也提供兩個解決辦法:this

  1. gradle.properties 增長 org.gradle.configureondemand=false 設置
  2. 使用低於 Gradle 4.6 如下的版本

ok,首先降版本的方案確定被 pass 了,那就在咱們項目的 gradle.properties 加上一段配置貌似就能夠了,大功告成,so easy ~

too navie,當你加上這段配置後,你會發現仍舊沒法經過編譯,錯誤依舊,爲此,我專門檢查了好幾遍是否是少了個字母之類的,顯然和這個沒有一毛錢關係,這裏不該該質疑本身做爲一名 CV 戰士的專業性。

實際上是被異常描述裏給誤導了,至少我直覺上是直接去修改工程裏的 gradle.properties ,實際上,你須要修改的是 ${HOME}/.gradle/gradle.properties,固然也有更簡單的方式,如圖:

更多信息能夠看這個回答:configuration-on-demand-is-not-supported

確認 sync 成功後,接下來就能夠正式進行 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,而後你會發現腳本里一片飆紅,不用擔憂,以前的 Groovy 語法在 Kotlin 報錯了而已,推薦所有刪掉,而後對照着用 Kotlin 從新寫一遍,這樣,會印象深入一些。

這裏以一個比較簡單的示例工程說明一下:

咱們分別對根目錄的 settting.gradlebuild.gradle 以及 app 目錄下的 build.gradle 進行重寫,以個人操做路徑爲例(不一樣操做路徑,可能遇到的問題不同):

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 文件名

大部分開發當中應該都會有對輸出的 apk 有重命名的需求,原來我在 Groovy 中是經過:

applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${flavors}@app_$versionName}.apk"
    }
}
複製代碼

遷移到 Kotlin 發現沒法直接使用 outputFileName 的屬性了

解決辦法:顯式轉爲具體實現類

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")
複製代碼

好了,若是你沒遇到其餘問題的話,到這裏基本就已經大功告成了!

另外,本文的示例工程我已經放到 GitHub 上了,各位感興趣的能夠去看下~

總結

首先對於 Gradle 這麼快就支持 Kotlin DSL,我仍是感到很驚喜的,其實,費了很多時間這麼折騰了一下,實際上,若是必定要說做用的話,可能確實沒有什麼做用。

可是,我以爲好處仍是要說一說的,對於使用 Kotlin 開發的小夥伴來講,首先開發語言和構建語言統一了,以前想寫構建腳本,還須要去學習 Groovy。如今直接能夠愉快的用 Kotlin 去寫 Gradle 構建腳本了。

示例 Demo

本文示例 Demo

參考資料:

官方遷移文檔

其餘參考一

其餘參考二

關於我

相關文章
相關標籤/搜索