Android Gradle 外掛程式 4.0 已新增在 Gradle 版本中使用 Kotlin 的支援功能 取代 Groovy, 通常用於 Gradle 設定檔中。
編寫 Gradle 指令碼時,建議使用 Kotlin 而非 Groovy,因為 Kotlin ,並提供更優異的編譯時間檢查和 IDE 支援。
雖然 Kotlin 目前可在 Android Studio 的程式碼中提供更優質的整合功能 與 Groovy 相比,使用 Kotlin 建構的速度通常比 Groovy 慢 所以在決定是否採用 Groovy 時 請考慮建構效能 遷移。
本頁提供關於轉換 Android 應用程式的基本資訊 Gradle 建構檔案從 Groovy 到 Kotlin。為了進行更全面的遷移 請參閱 Gradle 的 官方文件。
時間軸
從 Android Studio Giraffe 開始,新專案會使用 Kotlin DSL
(build.gradle.kts
) 用於建構設定。這麼做
比 Groovy DSL (build.gradle
) 具備語法的編輯體驗
醒目顯示、程式碼完成,以及導覽至宣告。如要瞭解詳情
請參閱
Gradle Kotlin DSL 入門。
常見詞彙
Kotlin DSL:主要參照 Android Gradle 外掛程式 Kotlin DSL,有時也被稱為潛在的 Gradle Kotlin DSL。
本遷移指南中的「Kotlin」和「Kotlin DSL」可以交替使用 同樣地,「Groovy」以及「Groovy DSL」可以交替使用
指令碼檔案命名
指令碼副檔名的名稱取決於建構檔案撰寫的語言 於:
- 使用 Groovy 編寫的 Gradle 建構檔案會使用
.gradle
副檔名。 - 使用 Kotlin 編寫的 Gradle 建構檔案會使用
.gradle.kts
檔案名稱 。
轉換語法
Groovy 和 Kotlin 的語法存在一般差異 因此您需要在整個建構指令碼中套用這些變更
在方法呼叫中加入括號
在 Groovy 中,方法呼叫可以省略括號,在 Kotlin 中則需 具體做法是指示 Kubernetes 建立並維護 一或多個代表這些 Pod 的物件如要遷移設定,請在以下類型中加上括號: 方法呼叫。以下程式碼顯示如何在 Groovy 中調整設定:
compileSdkVersion 30
這與使用 Kotlin 編寫的程式碼相同:
compileSdkVersion(30)
在指派呼叫中加入 =
Groovy DSL 可讓您省略指定運算子 =
在
而在 Kotlin 中則需要如此。這段程式碼顯示如何
在 Groovy 中指派屬性:
java {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
以下程式碼顯示如何使用 Kotlin 指派屬性:
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
轉換字串
以下是 Groovy 和 Kotlin 之間的字串差異:
- 字串的雙引號: 雖然 Groovy 允許使用單引號定義字串,但在 Kotlin 中, 雙引號。
-
虛線運算式上的字串內插類型:在 Groovy 中,您可以使用 只有
$
前置字元 字串內插類型 但是 Kotlin 需要用大括號包住虛線運算式。舉例來說,在 Groovy 中$project.rootDir
,如以下程式碼片段所示:myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro"
但在 Kotlin 中,上述程式碼會呼叫
toString()
上的project
,不在project.rootDir
上。取得值 ,請包裝${project.rootDir}
運算式 大括號:myRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro"
詳情請參閱: 字串範本 。
重新命名副檔名
遷移建構檔案時,請將 .kts
附加至每個建構檔案。例如:
選取建構檔案,例如 settings.gradle
檔案。將檔案重新命名為
settings.gradle.kts
,然後將檔案內容轉換為 Kotlin。請確認
專案仍會編譯。
請先遷移最小的檔案,獲得經驗後再遷移其他檔案。你可以 專案中包含 Kotlin 和 Groovy 建構檔案,因此您可以花點時間 逐步移動。
將 def
替換為 val
或 var
將 def
替換為 val
或 var
,也就是
在 Kotlin 中定義變數的方式。
以下是 Groovy 中宣告變數的方式:
def building64Bit = false
這與使用 Kotlin 編寫的程式碼相同:
val building64Bit = false
在布林屬性前方加上 is
Groovy 採用屬性推算邏輯
匯聚出類神經網路若是布林屬性 foo
,則其「推算方法」
可以是 getFoo
、setFoo
或 isFoo
。因此一旦轉換為 Kotlin
您需要將屬性名稱變更為推演的方法
目前尚無法支援 Kotlin 的所有元件舉例來說,
buildTypes
DSL 布林元素,就需要在元素前方加上 is
。這組代碼
顯示如何在 Groovy 中設定布林屬性:
android {
buildTypes {
release {
minifyEnabled true
shrinkResources true
...
}
debug {
debuggable true
...
}
...
以下是 Kotlin 中的相同程式碼。請注意,屬性會加上前置字元
上傳者:is
。
android {
buildTypes {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
...
}
getByName("debug") {
isDebuggable = true
...
}
...
轉換清單和對應
Groovy 和 Kotlin 用來定義清單和對照表的語法並不相同。時髦
使用 []
,而 Kotlin 會明確使用
listOf
或 mapOf
。使用時,請務必將 []
替換為 listOf
或 mapOf
。
以及進行遷移
以下對比 Groovy 和 Kotlin 中定義清單的方法:
jvmOptions += ["-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError</code>"]
這與使用 Kotlin 編寫的程式碼相同:
jvmOptions += listOf("-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError")
以下對比 Groovy 和 Kotlin 中定義對照表的方法:
def myMap = [key1: 'value1', key2: 'value2']
這與使用 Kotlin 編寫的程式碼相同:
val myMap = mapOf("key1" to "value1", "key2" to "value2")
設定建構類型
在 Kotlin DSL 中,只能使用偵錯和發布建構類型 隱含所有其他自訂建構類型都必須手動建立。
在 Groovy 中,您不需要使用偵錯、發布和其他特定建構類型,
建立聊天室下列程式碼片段顯示採用
debug
、release
和
benchmark
版本
輸入 Groovy 的型別
buildTypes {
debug {
...
}
release {
...
}
benchmark {
...
}
}
如要在 Kotlin 中建立對等的設定,您必須明確建立
benchmark
建構類型。
buildTypes {
debug {
...
}
release {
...
}
register("benchmark") {
...
}
}
從 buildscript 遷移至 plugins 區塊
如果您的建構使用
buildscript {}
敬上
區塊,將外掛程式新增至專案,您必須重構才能使用
plugins {}
。
改為封鎖plugins {}
區塊可讓您更輕鬆地套用外掛程式
搭配
版本目錄。
此外,在建構檔案中使用 plugins {}
區塊時,
即使建構作業失敗,Android Studio 仍能知道結構定義。這個情境
可協助您修正 Kotlin DSL 檔案,因為這項功能可讓 Studio IDE 執行下列操作:
完成程式碼補全並提供其他實用建議
找出外掛程式 ID
當 buildscript {}
區塊使用
這個
Maven 座標
所有外掛程式,例如 com.android.tools.build:gradle:7.4.0
plugins {}
區塊會改用外掛程式 ID。
對大多數外掛程式而言,外掛程式 ID 是您使用
apply plugin
。舉例來說,下列外掛程式 ID 屬於
Android Gradle 外掛程式:
com.android.application
com.android.library
com.android.lint
com.android.test
如需完整的外掛程式清單,請前往 Google Maven 存放區。
多個外掛程式 ID 可以參照 Kotlin 外掛程式。建議您使用 命名空間外掛程式 ID,以及 資料表:
簡短外掛程式 ID | 命名空間的外掛程式 ID |
---|---|
kotlin |
org.jetbrains.kotlin.jvm |
kotlin-android |
org.jetbrains.kotlin.android |
kotlin-kapt |
org.jetbrains.kotlin.kapt |
kotlin-parcelize |
org.jetbrains.kotlin.plugin.parcelize |
您也可以在 Gradle 外掛程式入口網站 Maven Central Repository 和 Google Maven 存放區。 已讀 開發自訂 Gradle 外掛程式 ,進一步瞭解外掛程式 ID 的運作方式。
執行重構
知道所用外掛程式的 ID 後,請按照下列步驟操作:
如果
buildscript {}
中仍宣告了外掛程式的存放區 封鎖,請移至「settings.gradle
」 檔案。將外掛程式新增至頂層的
plugins {}
區塊build.gradle
檔案。您必須指定 ID 和 外掛程式版本如果外掛程式不需要 套用至根專案,請使用apply false
。從頂層
build.gradle.kts
檔案移除classpath
項目。如要套用外掛程式,請將外掛程式新增至以下項目的
plugins {}
區塊: 模組層級的build.gradle
檔案。您只需指定外掛程式的 ID,因為版本是沿用自根專案。從模組層級移除外掛程式的
apply plugin
呼叫build.gradle
檔案。
例如,這項設定會使用 buildscript {}
區塊:
// Top-level build.gradle file
buildscript {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
dependencies {
classpath("com.android.tools.build:gradle:7.4.0")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0")
...
}
}
// Module-level build.gradle file
apply(plugin: "com.android.application")
apply(plugin: "kotlin-android")
這等同於使用 plugins {}
區塊的相同設定:
// Top-level build.gradle file
plugins {
id 'com.android.application' version '7.4.0' apply false
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
...
}
// Module-level build.gradle file
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
...
}
// settings.gradle
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
轉換外掛程式區塊
在 Groovy 和 Kotlin 中,從 plugins {}
區塊套用外掛程式的做法與 Groovy 和 Kotlin 類似。
以下程式碼顯示如何在使用 Groovy 時套用外掛程式
版本目錄:
// Top-level build.gradle file
plugins {
alias libs.plugins.android.application apply false
...
}
// Module-level build.gradle file
plugins {
alias libs.plugins.android.application
...
}
以下程式碼顯示如何在 Kotlin 中執行相同操作:
// Top-level build.gradle.kts file
plugins {
alias(libs.plugins.android.application) apply false
...
}
// Module-level build.gradle.kts file
plugins {
alias(libs.plugins.android.application)
...
}
以下程式碼顯示如何在不的情況下,在 Groovy 中套用外掛程式 分別是:
// Top-level build.gradle file
plugins {
id 'com.android.application' version '7.3.0' apply false
...
}
// Module-level build.gradle file
plugins {
id 'com.android.application'
...
}
以下程式碼顯示如何在 Kotlin 中執行相同操作:
// Top-level build.gradle.kts file
plugins {
id("com.android.application") version "7.3.0" apply false
...
}
// Module-level build.gradle.kts file
plugins {
id("com.android.application")
...
}
如要進一步瞭解 plugins {}
區塊,請參閱套用中
外掛程式
。
其他
如要瞭解其他功能的 Kotlin 程式碼範例,請參閱以下資源 說明文件頁面:
- 如有 ProGuard 設定,請參閱 啟用縮減、模糊處理和最佳化功能。
- 如有
signingConfig {}
區塊,請參閱「移除簽署資訊 建構檔案 - 如果使用專案層級的屬性,請參閱「設定專案層級屬性」 資源
已知問題
目前,我們有已知問題 就是 Kotlin 的建構速度可能比 Groovy 慢。
如何回報問題
如要瞭解如何提供問題分類所需的資訊,請參閱 建構工具和 Gradle 錯誤的詳細資料。接著: 使用 Google Cloud 控制台 公開 Issue Tracker。
其他資源
如需使用 Kotlin 編寫的 Gradle 建構檔案實例,請參閱 Now In Android 範例應用程式 。