再見,Groovy! 教你如何使用Kotlin SDL 編寫Gradle腳本!

做者:shusheng007, 地址:https://blog.csdn.net/ShuSheng0007/article/details/106763989android

概述

經過秒懂Gradle之從徹底懵逼到是懂非懂熟悉了gradle,達到了是懂非懂的境地,今天讓咱們實戰演練一下,此演練具備實際意義,若是你願意徹底能夠將其用在實際項目中。git

Gradle從5.0就已經支持Kotlin DSL1.0了,說明Gadle從5.0開始已經準備好在生產上使用了,況且如今已經發展到6.5了,時機已經很成熟。程序員

Android Studio 4.0 對應的gradle 插件爲4.0,對應的Gradle爲6.1.1了,因此是時候嘗試一下使用kotlin DSL寫gradle腳本了。github

爲何要用Kotlin DSL寫gradle腳本

撇開其餘方面,就單從提升程序員生產效率方面就有不少優勢:web

  • 腳本代碼自動補全
  • 跳轉查看源碼
  • 動態顯示註釋
  • 支持重構(Refactoring)

怎麼樣,要是你經歷過groovy那使人蛋疼的體驗,kotlin會讓你爽的起飛,接下來讓咱們開始吧。微信

從Groovy到Kotlin

讓咱們使用Android Studio 新建一個Android項目,AS默認會爲咱們生成3個gradle腳本文件。架構

  • settings.gradle (屬於 project)
  • build.gradle (屬於 project)
  • build.gradle (屬於 module)

咱們的目的就是轉換這3個文件app

第一步: 修改groovy語法到嚴格格式

groovy既支持雙引號""也支持單引號'',而kotlin只支持雙引號,因此首先將全部的單引號改成雙引號編輯器

例如 include ':app' -> include ":app"ide

groovy方法調用能夠不使用() 可是kotlin方法調用必須使用(),因此將全部方法調用改成()方式。

例如

implementation "androidx.appcompat:appcompat:1.0.2"

改成

 implementation ("androidx.appcompat:appcompat:1.0.2")

groovy 屬性賦值能夠不使用=,可是kotlin屬性賦值須要使用=,因此將全部屬性賦值添加=

例如

applicationId "com.ss007.gradlewithkotlin"

改成

applicationId = "com.ss007.gradlewithkotlin"

完成以上幾步,準備工做就完成了。

第二步:修改文件名並轉換

因爲gradle支持groovykotlin腳本混編,因此咱們每轉換完一個文件就同步一下,確保沒有錯誤。

  • 一、轉換 setting.gradle文件

將文件名加上kts後綴爲setting.gradle.kts

而後將內容修改成以下所示(其實完成第一步後就不用作修改了,和groovy一毛同樣,)

include(":app")
rootProject.name = "GradleWithKotlinDsl"
  • 二、轉換project的 build.gradle文件

將文件名加kts後綴爲build.gradle.kts

而後將內容修改成以下所示:

buildscript {
    var kotlinVersion: String by extra
    kotlinVersion="1.3.72"
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath ("com.android.tools.build:gradle:4.0.0")
        classpath ("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

tasks.register<Delete>("clean") {
    delete(rootProject.buildDir)
}

這個文件轉換有兩個地方須要注意:

第一: buildscript{} 裏的ext.kotlin_version'改成 var kotlinVersion: String by extra,關於extension object 這塊,kotlin表現的不如groovy優秀,比較囉嗦。第二: task 的申明方式變了

  • 三、轉換 modulebuild.gradle文件

這個是咱們的重點要轉換的了,也最爲複雜。首先將文件名加kts後綴爲build.gradle.kts

而後修改內容以下:

plugins {
    id("com.android.application")
    kotlin("android")
    kotlin("android.extensions")
}

android {
    compileSdkVersion (29)
    buildToolsVersion ("30.0.0")

    defaultConfig {
        applicationId = "top.ss007.gradlewithkotlindsl"
        minSdkVersion (21)
        targetSdkVersion (29)
        versionCode= 1
        versionName= "1.0"

        testInstrumentationRunner="androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
            proguardFiles (getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
}

dependencies {
    implementation (fileTree(mapOf("dir" to "libs""include" to listOf("*.jar"))))
    implementation ("org.jetbrains.kotlin:kotlin-stdlib:1.3.72")
    implementation ("androidx.core:core-ktx:1.3.0")
    implementation ("androidx.appcompat:appcompat:1.1.0")
    implementation ("androidx.constraintlayout:constraintlayout:1.1.3")
    testImplementation ("junit:junit:4.12")
    androidTestImplementation ("androidx.test.ext:junit:1.1.1")
    androidTestImplementation ("androidx.test.espresso:espresso-core:3.2.0")
}

有3處須要特殊處理

  • 第一:插件的引入方式從 apply plugin到聲明式
plugins{
 id(xxx)
  ...
}
  • 第二: buildTypes{} 塊裏面獲取 buildType的方式有變化。

由於buildTypes塊裏面的類型爲NamedDomainObjectCollection<BuildType>``,其不存在名爲release的方法。而是經過release這個name可獲取到一個BuildType類型的對象。而這個對象裏面有一個方法叫setMinifyEnabled(false),寫成屬性調用方式爲isMinifyEnabled = false`。

  • 第三: dependencies{} 塊裏面編譯lib 文件夾中 jar文件的內容有變化
dependencies {
    implementation (fileTree(mapOf("dir" to "libs""include" to listOf("*.jar"))))
 }

咱們看一下fileTree那個方法的簽名

ConfigurableFileTree fileTree(Map<String, ?> args);

可見其須要一個Map的入參

完成以上幾步後同步一下gradle腳本就ok了。

到目前爲止一切都工做正常,可是在實際項目中咱們常用project下的gradle腳本的一個extension object來統一維護版本號,以下所示:

ext{
 // Android config
    androidBuildToolsVersion = "30.0.0"
    ...
}

可是在kotlin裏面從其餘模塊下訪問不到project下的extra,因此須要使用buildSrc的方式

使用buildSrc改進維護性

在根目錄下建立一個buildSrc目錄,當構建時gradle會自動包括此目錄下的文件,在全部gradle文件中都是能夠訪問到這裏面的類,咱們能夠將版本號統一維護在這裏。

其文件結構以下:

Config 文件內容以下

object Config {
    object Android {
        const val buildToolsVersion = "30.0.0"
        const val minSdkVersion = 21
        const val targetSdkVersion = 29
        const val compileSdkVersion = 29
        const val applicationId = "top.ss007.gradlewithkotlindsl"
        const val versionCode = 1
        const val versionName = "1.0"
    }

    object AndroidLib{
        const val appcompatVersion= "1.1.0"
        const val constraintLayoutVersion="1.1.3"
    }
    ...
}

而後就能夠在gradle文件中引用裏面的值了,例如:

defaultConfig {
        applicationId = Config.Android.applicationId
        minSdkVersion (Config.Android.minSdkVersion)
        ...
    }
    
dependencies {
    ...
    implementation ("androidx.appcompat:appcompat:${Config.AndroidLib.appcompatVersion}")
    implementation ("androidx.constraintlayout:constraintlayout:${Config.AndroidLib.constraintLayoutVersion}")

總結

整體來講,Gradle團隊已經擁抱Kotlin了,教程也是groovykotlin共存的,相信kotlingradle的使用中會愈來愈多的,說不定哪天android studio的模板項目就會使用kotlin做爲默認gradle腳本的,畢竟kotlin已是Android開發的首推語言了。

若是要深刻了解,能夠參考官網相關部分 Gradle Kotlin DSL Primer

本文源碼:https://github.com/shusheng007/GradleWithKotlinDsl


---END---


推薦閱讀:
強大!ASM插樁實現Android端無埋點性能監控!
10分鐘完全理解Redis的持久化機制:RDB和AOF
這15個Android開源庫,只有常常逛Github的才知道!
牛逼!騰訊十大開源項目出爐!
Flutter 混合開發高仿大廠App
支付寶架構到底有多牛逼?看完這篇你就明白了!
Glide實現共享元素無縫轉場效果,只需四步!
學會這些 IDEA  Debug調試技巧!提高開發效率10倍!
程序員的重複勞動陷阱
談談Android AOP技術方案


更文不易,點個「在看」支持一下👇

本文分享自微信公衆號 - 技術最TOP(Tech-Android)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索