Плагин Android Gradle 4.0 добавил поддержку использования Kotlin в конфигурации сборки Gradle в качестве замены Groovy, языка программирования, традиционно используемого в файлах конфигурации Gradle.
Для написания скриптов Gradle предпочтительнее использовать Kotlin, а не Groovy, поскольку 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 ), благодаря подсветке синтаксиса, автодополнению кода и навигации по объявлениям. Подробнее см. в руководстве Gradle Kotlin DSL Primer .
Общие термины
Kotlin DSL: в первую очередь относится к плагину Android Gradle Kotlin DSL или, иногда, к базовому Gradle Kotlin DSL .
В этом руководстве по миграции термины «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 на блок плагинов
Если ваша сборка использует блок buildscript {} для добавления плагинов в проект, вам следует выполнить рефакторинг, чтобы вместо него использовать блок plugins {} . Блок plugins {} упрощает установку плагинов и хорошо работает с каталогами версий .
Кроме того, при использовании блока plugins {} в файлах сборки Android Studio учитывает контекст, даже если сборка завершается сбоем. Этот контекст помогает вносить исправления в файлы Kotlin DSL, поскольку позволяет среде разработки Studio выполнять автодополнение кода и предоставлять другие полезные рекомендации.
Найдите идентификаторы плагинов
В то время как блок buildscript {} добавляет плагины в путь к классам сборки, используя координаты плагина Maven , например com.android.tools.build:gradle: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 Plugin Portal , в центральном репозитории Maven Central Repository и в репозитории Google Maven . Подробнее о работе идентификаторов плагинов читайте в статье «Разработка пользовательских плагинов Gradle» .
Выполнить рефакторинг
Узнав идентификаторы используемых вами плагинов, выполните следующие действия:
Если у вас все еще есть репозитории для плагинов, объявленных в блоке
buildscript {}, переместите их в файлsettings.gradle.Добавьте плагины в блок
plugins {}в файлеbuild.gradleверхнего уровня. Здесь необходимо указать идентификатор и версию плагина. Если плагин не нужно применять к корневому проекту, используйте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.