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

В Android Gradle Plugin 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 , вам необходимо удалить этот параметр или установить его значение в 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. При необходимости перенесите DSL android.kotlinOptions{}
  4. При необходимости перенесите DSL kotlin.sourceSets{}

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. Если вы используете kapt , мы рекомендуем перевести ваш проект на KSP .

Если вы пока не можете перейти на KSP, замените плагин kotlin-kapt на плагин 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. При необходимости перенесите DSL android.kotlinOptions{}

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

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

Котлин

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
    }
}

4. При необходимости перенесите DSL kotlin.sourceSets{}

При использовании плагина kotlin-android , AGP позволяет добавлять дополнительные каталоги исходного кода Kotlin, используя либо DSL android.sourceSets{} , либо DSL kotlin.sourceSets{} . С помощью DSL android.sourceSets{} вы можете добавить каталоги либо в набор AndroidSourceSet.kotlin , либо в набор AndroidSourceSet.java .

Встроенный Kotlin позволяет добавить каталоги в набор AndroidSourceSet.kotlin , используя DSL android.sourceSets{} . Если вы используете неподдерживаемые варианты, выполните миграцию следующим образом:

Котлин

# Adding Kotlin source directories to kotlin.sourceSets is not supported
kotlin.sourceSets.named("main") {
    kotlin.srcDir("additionalSourceDirectory/kotlin")
}

# Adding Kotlin source directories to AndroidSourceSet.java is also not supported
android.sourceSets.named("main") {
    java.directories += "additionalSourceDirectory/kotlin"
}

# Add Kotlin source directories to AndroidSourceSet.kotlin
android.sourceSets.named("main") {
    kotlin.directories += "additionalSourceDirectory/kotlin"
}

Классный

# Adding Kotlin source directories to kotlin.sourceSets is not supported
kotlin.sourceSets.named("main") {
    kotlin.srcDir("additionalSourceDirectory/kotlin")
}

# Adding Kotlin source directories to AndroidSourceSet.java is also not supported
android.sourceSets.named("main") {
    java.directories.add("additionalSourceDirectory/kotlin")
}

# Add Kotlin source directories to AndroidSourceSet.kotlin
android.sourceSets.named("main") {
    kotlin.directories.add("additionalSourceDirectory/kotlin")
}

Если вы хотите добавить каталог исходного кода Kotlin к определенному варианту или если каталог генерируется задачей, вы можете использовать методы addStaticSourceDirectory или addGeneratedSourceDirectory из API вариантов :

Котлин

androidComponents.onVariants { variant ->
    variant.sources.kotlin!!.addStaticSourceDirectory("additionalSourceDirectory/kotlin")
    variant.sources.kotlin!!.addGeneratedSourceDirectory(TASK_PROVIDER, TASK_OUTPUT)
}

Классный

androidComponents.onVariants { variant ->
    variant.sources.kotlin!!.addStaticSourceDirectory("additionalSourceDirectory/kotlin")
    variant.sources.kotlin!!.addGeneratedSourceDirectory(TASK_PROVIDER, TASK_OUTPUT)
}

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

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

Отказаться от встроенных функций Kotlin

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

Когда вы будете готовы к миграции проекта, включите встроенный Kotlin и следуйте инструкциям по миграции .

Помодульная миграция

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

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

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

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

  3. Чтобы перевести этот модуль на встроенный Kotlin, выполните действия, описанные ранее.

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

Возможность выборочного отключения встроенных функций Kotlin.

Плагин Android Gradle 9.0 включает встроенный Kotlin для всех модулей, к которым он применяется. Мы рекомендуем выборочно отключать встроенный Kotlin для модулей, в которых отсутствуют исходные коды Kotlin, в больших проектах. Это устраняет как задачу компиляции Kotlin, которая немного снижает производительность сборки, так и автоматическую зависимость от стандартной библиотеки Kotlin.

Чтобы отключить встроенный Kotlin для модуля, установите enableKotlin = false в файле сборки этого модуля:

Котлин

android {
    enableKotlin = false
}

Классный

android {
    enableKotlin = false
}