做者:
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支持groovy
與kotlin
腳本混編,因此咱們每轉換完一個文件就同步一下,確保沒有錯誤。
-
一、轉換 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 的申明方式變了
-
三、轉換 module
的build.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了,教程也是groovy
和kotlin
共存的,相信kotlin
在gradle
的使用中會愈來愈多的,說不定哪天android studio的模板項目就會使用kotlin
做爲默認gradle
腳本的,畢竟kotlin
已是Android開發的首推語言了。
若是要深刻了解,能夠參考官網相關部分 Gradle Kotlin DSL Primer
本文源碼:https://github.com/shusheng007/GradleWithKotlinDsl
---END---
更文不易,點個「在看」支持一下👇
本文分享自微信公衆號 - 技術最TOP(Tech-Android)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。