В 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 требует внесения изменений в ваш проект. Для устранения этой ошибки выполните следующие действия:
- Удалите плагин
kotlin-android - При необходимости перенесите плагин
kotlin-kapt - При необходимости перенесите DSL
android.kotlinOptions{} - При необходимости перенесите 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 definitionkotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "KOTLIN_VERSION" }
Затем обновите файлы сборки:
Котлин
// Top-level build file plugins { alias(libs.plugins.legacy.kapt) apply falsealias(libs.plugins.kotlin.kapt) apply false}
Классный
// Top-level build file plugins { alias(libs.plugins.legacy.kapt) apply falsealias(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 supportedkotlin.sourceSets.named("main") { kotlin.srcDir("additionalSourceDirectory/kotlin") }# Adding Kotlin source directories to AndroidSourceSet.java is also not supportedandroid.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 supportedkotlin.sourceSets.named("main") { kotlin.srcDir("additionalSourceDirectory/kotlin") }# Adding Kotlin source directories to AndroidSourceSet.java is also not supportedandroid.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.
Если одновременная миграция всех модулей представляет собой сложную задачу, вы можете переносить модули по одному:
Установите параметр
android.builtInKotlin=falseв файлеgradle.properties, чтобы отключить встроенный Kotlin для всех модулей.Примените плагин
com.android.built-in-kotlinк модулю, для которого вы хотите включить встроенный Kotlin, используя ту же версию, что и ваш плагин Android Gradle.Чтобы перевести этот модуль на встроенный Kotlin, выполните действия, описанные ранее.
После переноса всех модулей удалите параметр
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 }