В плагине Android Gradle 4.0 добавлена поддержка использования Kotlin в конфигурации сборки Gradle в качестве замены Groovy, языка программирования, традиционно используемого в конфигурационных файлах Gradle.
Kotlin предпочтительнее Groovy для написания скриптов Gradle, потому что Kotlin более читабелен, предлагает лучшую проверку на этапе компиляции и поддержку в IDE.
Хотя в настоящее время Kotlin предлагает лучшую интеграцию в редактор кода Android Studio по сравнению с Groovy, сборка с использованием Kotlin, как правило, происходит медленнее, чем сборка с использованием Groovy, поэтому учитывайте производительность сборки при принятии решения о миграции.
На этой странице представлена основная информация о преобразовании файлов сборки Gradle вашего Android-приложения из Groovy в Kotlin. Более подробное руководство по миграции см. в официальной документации Gradle.
Хронология
Начиная с Android Studio Giraffe, новые проекты по умолчанию используют Kotlin DSL ( build.gradle.kts ) для конфигурации сборки. Это обеспечивает более удобный редактор, чем Groovy DSL ( build.gradle ), с подсветкой синтаксиса, автозавершением кода и навигацией к объявлениям. Для получения дополнительной информации см. руководство по Kotlin DSL в Gradle .
Общие термины
Kotlin DSL: В основном относится к плагину Android Gradle Kotlin DSL или, иногда, к базовому Kotlin DSL Gradle .
В данном руководстве по миграции термины "Kotlin" и "Kotlin DSL" используются взаимозаменяемо. Аналогично, термины "Groovy" и "Groovy DSL" также используются взаимозаменяемо.
Наименование файлов скриптов
Расширения файлов скриптов определяются языком, на котором написан файл сборки:
- Файлы сборки Gradle, написанные на Groovy, используют расширение имени файла
.gradle. - Файлы сборки Gradle, написанные на Kotlin, используют расширение имени файла
.gradle.kts.
Преобразовать синтаксис
Между Groovy и Kotlin существуют некоторые общие синтаксисные различия, поэтому вам необходимо внести эти изменения во все ваши скрипты сборки.
Добавьте скобки к вызовам методов.
В Groovy можно опускать скобки в вызовах методов, тогда как в Kotlin они обязательны. Чтобы адаптировать конфигурацию под эти условия, добавьте скобки к таким вызовам методов. Этот код показывает, как настроить параметр в 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"
Для получения более подробной информации см. раздел «Строковые шаблоны» в документации Kotlin.
Переименовать расширения файлов
Добавляйте расширение .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. Например, для логических элементов DSL ` buildTypes необходимо добавить префикс 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 списки и карты определяются с использованием разного синтаксиса. В Groovy используются квадратные скобки [] , тогда как в 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 неявно доступны только типы сборки debug и release. Все остальные пользовательские типы сборки необходимо создавать вручную.
В Groovy можно использовать типы сборки debug, release и некоторые другие, не создавая их предварительно. Следующий фрагмент кода демонстрирует конфигурацию с типами сборки 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, поскольку позволяет IDE Studio выполнять автодополнение кода и предоставлять другие полезные подсказки.
Найдите идентификаторы плагинов.
В то время как блок buildscript {} добавляет плагины в путь к классам сборки, используя координаты плагина в Maven , например, com.android.tools.build:gradle:7.4.0 :7.4.0`, блок plugins {} использует вместо этого идентификаторы плагинов.
Для большинства плагинов идентификатор плагина — это строка, используемая при их применении с помощью apply plugin . Например, следующие идентификаторы плагинов входят в состав Android Gradle Plugin :
-
com.android.application -
com.android.library -
com.android.lint -
com.android.test
Полный список плагинов можно найти в репозитории Google Maven .
На плагины Kotlin можно ссылаться по нескольким идентификаторам. Мы рекомендуем использовать идентификатор плагина с пространством имен и выполнить рефакторинг с сокращенной записи на идентификатор плагина с пространством имен, используя следующую таблицу:
| Сокращенные идентификаторы плагинов | Идентификаторы плагинов с использованием пространств имен |
|---|---|
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 и в репозитории Google Maven . Подробнее о том, как работают идентификаторы плагинов, читайте в статье «Разработка пользовательских плагинов Gradle» .
Выполните рефакторинг
После того, как вы узнаете идентификаторы используемых вами плагинов, выполните следующие действия:
Если у вас все еще есть репозитории для плагинов, объявленные в блоке
buildscript {}, переместите их в файлsettings.gradle.Добавьте плагины в блок
plugins {}в файлеbuild.gradleверхнего уровня. Здесь необходимо указать ID и версию плагина. Если плагин не нужно применять к корневому проекту, используйтеapply false.Удалите записи
classpathиз файлаbuild.gradle.ktsверхнего уровня.Для применения плагинов добавьте их в блок `
plugins {}в файле `build.gradleна уровне модуля. Здесь нужно указать только идентификатор плагина, поскольку версия наследуется от корневого проекта.Удалите вызов
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()
}
}
Преобразовать блок плагинов
Применение плагинов из блока 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 {} см. в разделе «Применение плагинов» в документации Gradle.
Разнообразный
Примеры кода на Kotlin, демонстрирующие другие функции, см. на следующих страницах документации:
- Если у вас установлена конфигурация ProGuard, обратитесь к разделу «Включение сжатия, обфускации и оптимизации» .
- Если у вас есть блок
signingConfig {}, обратитесь к разделу «Удаление информации о подписи из файлов сборки» . - Если вы используете свойства, применяемые ко всему проекту, обратитесь к разделу «Настройка свойств, применяемых ко всему проекту» .
Известные проблемы
В настоящее время известна проблема , заключающаяся в том, что скорость сборки может быть ниже при использовании Kotlin, чем при использовании Groovy.
Как сообщить о проблемах
Инструкции по предоставлению необходимой информации для рассмотрения вашей проблемы см. в разделе «Подробности об инструментах сборки и ошибках Gradle» . Затем сообщите об ошибке, используя общедоступную систему отслеживания ошибок Google.
Больше ресурсов
Рабочий пример файлов сборки Gradle, написанных на Kotlin, можно найти в демонстрационном приложении Now In Android на GitHub.