將建構設定從 Groovy 遷移至 Kotlin

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 替換為 valvar

def 替換為 valvar,也就是 在 Kotlin 中定義變數的方式。 以下是 Groovy 中宣告變數的方式:

def building64Bit = false

這與使用 Kotlin 編寫的程式碼相同:

val building64Bit = false

在布林屬性前方加上 is

Groovy 採用屬性推算邏輯 匯聚出類神經網路若是布林屬性 foo,則其「推算方法」 可以是 getFoosetFooisFoo。因此一旦轉換為 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 會明確使用 listOfmapOf。使用時,請務必將 [] 替換為 listOfmapOf。 以及進行遷移

以下對比 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 中,您不需要使用偵錯、發布和其他特定建構類型, 建立聊天室下列程式碼片段顯示採用 debugreleasebenchmark 版本 輸入 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 RepositoryGoogle Maven 存放區。 已讀 開發自訂 Gradle 外掛程式 ,進一步瞭解外掛程式 ID 的運作方式。

執行重構

知道所用外掛程式的 ID 後,請按照下列步驟操作:

  1. 如果 buildscript {} 中仍宣告了外掛程式的存放區 封鎖,請移至「settings.gradle」 檔案。

  2. 將外掛程式新增至頂層的 plugins {} 區塊 build.gradle 檔案。您必須指定 ID 和 外掛程式版本如果外掛程式不需要 套用至根專案,請使用 apply false

  3. 從頂層 build.gradle.kts 檔案移除 classpath 項目。

  4. 如要套用外掛程式,請將外掛程式新增至以下項目的 plugins {} 區塊: 模組層級的 build.gradle 檔案。您只需指定外掛程式的 ID,因為版本是沿用自根專案。

  5. 從模組層級移除外掛程式的 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 程式碼範例,請參閱以下資源 說明文件頁面:

,瞭解如何調查及移除這項存取權。

已知問題

目前,我們有已知問題 就是 Kotlin 的建構速度可能比 Groovy 慢。

如何回報問題

如要瞭解如何提供問題分類所需的資訊,請參閱 建構工具和 Gradle 錯誤的詳細資料。接著: 使用 Google Cloud 控制台 公開 Issue Tracker

其他資源

如需使用 Kotlin 編寫的 Gradle 建構檔案實例,請參閱 Now In Android 範例應用程式