Переход на встроенный Kotlin

Плагин Android Gradle 9.0 представляет встроенную поддержку Kotlin и включает её по умолчанию. Это означает, что вам больше не нужно применять плагин org.jetbrains.kotlin.android (или kotlin-android ) в файлах сборки для компиляции исходных файлов Kotlin. Благодаря встроенному Kotlin файлы сборки становятся проще, и вы можете избежать проблем совместимости между AGP и плагином kotlin-android .

Включить встроенный Kotlin

Для встроенной поддержки Kotlin требуется AGP 9.0 или выше. AGP 9.0 уже включает встроенную поддержку Kotlin для всех ваших модулей, где применяется AGP, поэтому вам не нужно ничего делать для её включения. Однако, если вы ранее отказались от встроенной поддержки Kotlin , установив параметр android.builtInKotlin=false в файле gradle.properties , вам необходимо либо удалить эту настройку, либо установить android.builtInKotlin=true для её включения.

Встроенный Kotlin требует внесения некоторых изменений в ваш проект, поэтому после включения встроенного Kotlin выполните следующие шаги для миграции вашего проекта.

Этапы миграции

После обновления проекта со старой версии AGP до AGP 9.0 или после ручного включения встроенного Kotlin вы можете увидеть следующее сообщение об ошибке:

Failed to apply plugin 'org.jetbrains.kotlin.android'.
> Cannot add extension with name 'kotlin', as there is an extension already registered with that name.

...или

Failed to apply plugin 'com.jetbrains.kotlin.android'
> The 'org.jetbrains.kotlin.android' plugin is no longer required for Kotlin support since AGP 9.0.

Это связано с тем, что встроенный Kotlin требует внесения некоторых изменений в проект. Чтобы устранить эту ошибку, выполните следующие действия.

  1. Удалить плагин kotlin-android
  2. При необходимости перенесите плагин kotlin-kapt
  3. При необходимости перенесите блок kotlinOptions{} .

1. Удалите плагин kotlin-android

Удалите плагин org.jetbrains.kotlin.android (или kotlin-android ) из файлов сборки на уровне модуля, где вы его применяете. Точный код для удаления зависит от того, используете ли вы каталоги версий для объявления плагинов.

С каталогами версий

Котлин

// Module-level build file
plugins {
    alias(libs.plugins.kotlin.android)
}

Круто

// Module-level build file
plugins {
    alias(libs.plugins.kotlin.android)
}

Нет каталогов версий

Котлин

// Module-level build file
plugins {
    id("org.jetbrains.kotlin.android")
}

Круто

// Module-level build file
plugins {
    id 'org.jetbrains.kotlin.android'
}

Затем удалите плагин из файла сборки верхнего уровня:

С каталогами версий

Котлин

// Top-level build file
plugins {
    alias(libs.plugins.kotlin.android) apply false
}

Круто

// Top-level build file
plugins {
    alias(libs.plugins.kotlin.android) apply false
}

Нет каталогов версий

Котлин

// Top-level build file
plugins {
    id("org.jetbrains.kotlin.android") version "KOTLIN_VERSION" apply false
}

Круто

// Top-level build file
plugins {
    id 'org.jetbrains.kotlin.android' version 'KOTLIN_VERSION' apply false
}

Если вы используете каталоги версий, также удалите определение плагина из файла TOML каталога версий (обычно gradle/libs.versions.toml ):

[plugins]
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "KOTLIN_VERSION" }

2. При необходимости перенесите плагин kotlin-kapt

Если вы используете org.jetbrains.kotlin.kapt (или kotlin-kapt ) в файлах сборки, этот плагин несовместим со встроенным Kotlin. Вам необходимо заменить его на плагин com.android.legacy-kapt той же версии, что и ваш текущий плагин Android Gradle.

Например, с помощью каталогов версий обновите файл TOML каталога версий следующим образом:

[plugins]
android-application = { id = "com.android.application", version.ref = "AGP_VERSION" }

# Add the following plugin definition
legacy-kapt = { id = "com.android.legacy-kapt", version.ref = "AGP_VERSION" }

# Remove the following plugin definition
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "KOTLIN_VERSION" }

Затем обновите файлы сборки:

Котлин

// Top-level build file
plugins {
    alias(libs.plugins.legacy.kapt) apply false
    alias(libs.plugins.kotlin.kapt) apply false
}

Круто

// Top-level build file
plugins {
    alias(libs.plugins.legacy.kapt) apply false
    alias(libs.plugins.kotlin.kapt) apply false
}

Котлин

// Module-level build file
plugins {
    alias(libs.plugins.legacy.kapt)
    alias(libs.plugins.kotlin.kapt)
}

Круто

// Module-level build file
plugins {
    alias(libs.plugins.legacy.kapt)
    alias(libs.plugins.kotlin.kapt)
}

3. При необходимости перенесите блок kotlinOptions{}

Если вы используете android.kotlinOptions{} DSL, вам необходимо перенести его в kotlin.compilerOptions{} DSL.

Например, обновите этот код:

Котлин

android {
    kotlinOptions {
        languageVersion = "2.0"
        jvmTarget = "11"
    }
}

Круто

android {
    kotlinOptions {
        languageVersion = "2.0"
        jvmTarget = "11"
    }
}

...к новому DSL:

Котлин

kotlin {
    compilerOptions {
        languageVersion = org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0
        // Optional: Set jvmTarget
        // jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
    }
}

Круто

kotlin {
    compilerOptions {
        languageVersion = org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0
        // Optional: Set jvmTarget
        // jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
    }
}

Сообщить о проблемах

Если после выполнения предыдущих шагов у вас возникнут проблемы, ознакомьтесь с известными проблемами в описании проблемы № 438678642 и при необходимости отправьте нам отзыв.

Отказаться от встроенного Kotlin

Если вам не удаётся перевести свой проект на использование встроенного Kotlin, установите значение android.builtInKotlin = false в файле gradle.properties , чтобы временно отключить встроенный Kotlin. При этом сборка выдаст предупреждение с напоминанием о необходимости перейти на встроенный Kotlin, поскольку отключить встроенный Kotlin в будущих версиях AGP 9.x до AGP 10.0 будет невозможно.

Миграция по модулям

Свойство Gradle android.builtInKotlin позволяет включать или отключать встроенный Kotlin для всех ваших модулей, где вы применяете AGP.

Если перенос всех модулей одновременно вызывает затруднения, вы можете переносить модули по одному за раз:

  1. Установите android.builtInKotlin = false в файле gradle.properties , чтобы отключить встроенный Kotlin для всех модулей.

  2. Примените плагин com.android.experimental.built-in-kotlin к модулю, в котором вы хотите включить встроенный Kotlin, используя ту же версию, что и ваш текущий плагин Android Gradle.

  3. Выполните предыдущие шаги миграции , чтобы перенести этот модуль во встроенный Kotlin.

  4. После переноса всех модулей удалите настройку android.builtInKotlin = false в файле gradle.properties и плагин com.android.experimental.built-in-kotlin в файлах сборки.