Перенесите конфигурацию сборки из Groovy в Kotlin.

В плагине 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» .

Выполните рефакторинг

После того, как вы узнаете идентификаторы используемых вами плагинов, выполните следующие действия:

  1. Если у вас все еще есть репозитории для плагинов, объявленные в блоке buildscript {} , переместите их в файл settings.gradle .

  2. Добавьте плагины в блок plugins {} в файле build.gradle верхнего уровня. Здесь необходимо указать ID и версию плагина. Если плагин не нужно применять к корневому проекту, используйте apply false .

  3. Удалите записи classpath из файла build.gradle.kts верхнего уровня.

  4. Для применения плагинов добавьте их в блок ` plugins {} в файле ` build.gradle на уровне модуля. Здесь нужно указать только идентификатор плагина, поскольку версия наследуется от корневого проекта.

  5. Удалите вызов 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, демонстрирующие другие функции, см. на следующих страницах документации:

Известные проблемы

В настоящее время известна проблема , заключающаяся в том, что скорость сборки может быть ниже при использовании Kotlin, чем при использовании Groovy.

Как сообщить о проблемах

Инструкции по предоставлению необходимой информации для рассмотрения вашей проблемы см. в разделе «Подробности об инструментах сборки и ошибках Gradle» . Затем сообщите об ошибке, используя общедоступную систему отслеживания ошибок Google.

Больше ресурсов

Рабочий пример файлов сборки Gradle, написанных на Kotlin, можно найти в демонстрационном приложении Now In Android на GitHub.