Что нового в Kotlin 1.4.20
В Kotlin 1.4.20 добавлено несколько новых экспериментальных функций, а также исправлены ошибки и улучшены существующие функции, в том числе добавленные в версии 1.4.0.
Подробнее о новых функциях и примерах их использования можно узнать в этой записи блога.
Kotlin/JVM
Улучшения Kotlin/JVM призваны обеспечить поддержку возможностей современных версий Java:
Целевая версия Java 15
Теперь Java 15 доступна в качестве целевой версии Kotlin/JVM.
Конкатенация строк с помощью invokedynamic
В Kotlin 1.4.20 конкатенацию строк можно компилировать в динамические вызовы для целевых версий JVM 9 и выше, что повышает производительность.
Сейчас эта функция является экспериментальной и поддерживает следующие случаи:
String.plusв операторной (a + b), явной (a.plus(b)) и ссылочной ((a::plus)(b)) формах.toStringдля встроенных классов и классов данных.шаблоны строк, кроме шаблонов с одним неконстантным аргументом (см. KT-42457).
Чтобы включить конкатенацию строк с помощью invokedynamic, добавьте параметр компилятора -Xstring-concat со значением из списка ниже:
indy-with-constants— выполнять конкатенациюinvokedynamicстрок с помощью StringConcatFactory.makeConcatWithConstants().indy— выполнять конкатенациюinvokedynamicстрок с помощью StringConcatFactory.makeConcat().inline— вернуться к классической конкатенации с помощьюStringBuilder.append().
Kotlin/JS
Kotlin/JS продолжает быстро развиваться, и в версии 1.4.20 доступны несколько экспериментальных функций и улучшений:
Изменения в Gradle DSL
В Gradle DSL для Kotlin/JS внесено несколько обновлений, упрощающих настройку и адаптацию проекта. К ним относятся изменения конфигурации webpack, изменения автоматически создаваемого файла package.json и улучшенный контроль транзитивных зависимостей.
Единая точка настройки webpack
Для браузерной цели доступен новый блок конфигурации commonWebpackConfig. В нём можно задать общие настройки в одном месте, вместо того чтобы дублировать конфигурацию для webpackTask, runTask и testTask.
Чтобы включить поддержку CSS по умолчанию для всех трёх задач, добавьте следующий фрагмент в build.gradle(.kts) вашего проекта:
browser {
commonWebpackConfig {
cssSupport.enabled = true
}
binaries.executable()
}
Подробнее о настройке сборки с помощью webpack.
Настройка package.json из Gradle
Теперь для более гибкого управления пакетами Kotlin/JS и их распространением можно добавлять свойства в файл проекта package.json с помощью Gradle DSL.
Чтобы добавить пользовательские поля в package.json, используйте функцию customField в блоке packageJson компиляции:
kotlin {
js(BOTH) {
compilations["main"].packageJson {
customField("hello", mapOf("one" to 1, "two" to 2))
}
}
}
Подробнее о настройке package.json.
Выборочное разрешение зависимостей Yarn
В Kotlin 1.4.20 появилась возможность настраивать выборочное разрешение зависимостей Yarn — механизм переопределения зависимостей используемых вами пакетов.
Настроить его можно с помощью YarnRootExtension внутри YarnPlugin в Gradle. Чтобы изменить разрешаемую версию пакета для проекта, используйте функцию resolution, передав селектор имени пакета (в формате Yarn) и версию, в которую нужно его разрешить.
rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().apply {
resolution("react", "16.0.0")
resolution("processor/decamelize", "3.0.0")
}
}
Здесь все зависимости npm, которым требуется react, получат версию 16.0.0, а processor получит зависимость decamelize версии 3.0.0.
Отключение гранулярных рабочих пространств
Чтобы ускорить сборку, плагин Kotlin/JS для Gradle устанавливает только те зависимости, которые нужны для конкретной задачи Gradle. Например, пакет webpack-dev-server устанавливается только при выполнении одной из задач *Run, но не при выполнении задачи assemble. Такое поведение может вызывать проблемы при параллельном запуске нескольких процессов Gradle. Если требования к зависимостям конфликтуют, две установки пакетов npm могут привести к ошибкам.
Чтобы решить эту проблему, в Kotlin 1.4.20 добавлен параметр отключения так называемых гранулярных рабочих пространств. Сейчас эту функцию можно настроить с помощью YarnRootExtension внутри YarnPlugin в Gradle. Чтобы воспользоваться ею, добавьте следующий фрагмент в файл build.gradle.kts:
rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().disableGranularWorkspaces()
}
Новые шаблоны мастера
Чтобы упростить настройку проекта при его создании, в мастере проектов Kotlin появились новые шаблоны для приложений Kotlin/JS:
Браузерное приложение — минимальный проект Kotlin/JS на Gradle, работающий в браузере.
Приложение React — приложение React с подходящим
kotlin-wrappers. В нём можно включить интеграцию с таблицами стилей, навигационными компонентами или контейнерами состояния.Приложение Node.js — минимальный проект для запуска в среде выполнения Node.js. В нём можно напрямую подключить экспериментальный пакет
kotlinx-nodejs.
Игнорирование ошибок компиляции компилятором IR
В компиляторе IR для Kotlin/JS появился новый экспериментальный режим — компиляция с ошибками. В этом режиме можно запускать код, даже если он содержит ошибки. Например, это полезно, если вы хотите опробовать отдельные возможности, пока приложение ещё не готово.
В этом режиме предусмотрены две политики допустимости ошибок:
SEMANTIC: компилятор принимает синтаксически корректный, но бессмысленный с точки зрения семантики код, напримерval x: String = 3.SYNTAX: компилятор принимает любой код, даже если в нём есть синтаксические ошибки.
Чтобы разрешить компиляцию с ошибками, добавьте параметр компилятора -Xerror-tolerance-policy= с одним из перечисленных выше значений.
Kotlin/Native
В Kotlin/Native версии 1.4.20 основное внимание уделено производительности и доработке существующих функций. К заметным улучшениям относятся:
Анализ escape-поведения
В Kotlin/Native добавлен прототип нового механизма анализа escape-поведения. Он повышает производительность во время выполнения, размещая некоторые объекты в стеке, а не в куче. По результатам наших тестов этот механизм в среднем повышает производительность на 10%. Мы продолжаем его совершенствовать, чтобы ещё сильнее ускорить выполнение программ.
Анализ escape-поведения выполняется на отдельном этапе компиляции при сборке релизной версии (с параметром компилятора -opt).
Чтобы отключить этап анализа escape-поведения, используйте параметр компилятора -Xdisable-phases=EscapeAnalysis.
Повышение производительности и исправление ошибок
В Kotlin/Native повышена производительность и исправлены ошибки в различных компонентах, в том числе добавленных в версии 1.4.0, например в механизме совместного использования кода.
Обёртывание исключений Objective-C с явным включением
Теперь Kotlin/Native может обрабатывать исключения, возникающие во время выполнения кода Objective-C, чтобы избежать сбоев программы.
Можно включить обёртывание NSException в исключения Kotlin типа ForeignException. Они содержат ссылки на исходные NSException. Это позволяет получить информацию о первопричине и правильно обработать её.
Чтобы включить обёртывание исключений Objective-C, укажите параметр -Xforeign-exception-mode objc-wrap в вызове cinterop или добавьте свойство foreignExceptionMode = objc-wrap в файл .def. Если вы используете интеграцию с CocoaPods, укажите параметр в блоке скрипта сборки pod {} зависимости, например:
pod("foo") {
extraOpts = listOf("-Xforeign-exception-mode", "objc-wrap")
}
Поведение по умолчанию не меняется: программа завершает работу, если в коде Objective-C возникает исключение.
Улучшения плагина CocoaPods
В Kotlin 1.4.20 продолжена работа над улучшением интеграции с CocoaPods. В частности, можно попробовать следующие новые функции:
Улучшенное выполнение задач
В плагине CocoaPods улучшен порядок выполнения задач. Например, при добавлении новой зависимости CocoaPods существующие зависимости не пересобираются. Добавление дополнительной цели также не приводит к пересборке зависимостей для уже существующих целей.
Расширенный DSL
DSL для добавления зависимостей CocoaPods в проект Kotlin получил новые возможности.
Помимо локальных Pods и Pods из репозитория CocoaPods, можно добавлять зависимости от следующих типов библиотек:
Библиотека из пользовательского репозитория спецификаций.
Удалённая библиотека из репозитория Git.
Библиотека из архива (доступна также по произвольному HTTP-адресу).
Статическая библиотека.
Библиотека с пользовательскими параметрами cinterop.
Подробнее о добавлении зависимостей CocoaPods в проекты Kotlin. Примеры можно найти в примере Kotlin с CocoaPods.
Обновлённая интеграция с Xcode
Для корректной работы с Xcode необходимо внести некоторые изменения в Podfile:
Если ваш Kotlin Pod зависит от Pod из Git, HTTP или specRepo, необходимо также указать эту зависимость в Podfile.
При добавлении библиотеки из пользовательской спецификации также необходимо указать расположение спецификаций в начале Podfile.
Теперь ошибки интеграции подробно описаны в IDEA. Поэтому, если у вас возникнут проблемы с Podfile, вы сразу узнаете, как их исправить.
Подробнее о создании Kotlin Pods.
Поддержка библиотек Xcode 12
Добавлена поддержка новых библиотек, поставляемых с Xcode 12. Теперь их можно использовать в коде Kotlin.
Kotlin Multiplatform
Обновлённая структура публикаций многоплатформенных библиотек
Начиная с Kotlin 1.4.20, отдельная публикация метаданных больше не создаётся. Артефакты метаданных теперь включены в публикацию корневой библиотеки, которая представляет библиотеку целиком. При добавлении её в качестве зависимости общего исходного набора автоматически выбираются соответствующие артефакты для конкретной платформы.
Подробнее о публикации многоплатформенной библиотеки.
Совместимость с предыдущими версиями
Это изменение структуры нарушает совместимость между проектами с иерархической структурой проекта. Если и многоплатформенный проект, и используемая им библиотека имеют иерархическую структуру, их необходимо одновременно обновить до Kotlin 1.4.20 или более поздней версии. Библиотеки, опубликованные с Kotlin 1.4.20, нельзя использовать в проектах, опубликованных с более ранними версиями.
Проекты и библиотеки без иерархической структуры проекта остаются совместимыми.
Стандартная библиотека
В стандартной библиотеке Kotlin 1.4.20 появились новые расширения для работы с файлами и повышена производительность.
Расширения для java.nio.file.Path
Теперь стандартная библиотека предоставляет экспериментальные расширения для java.nio.file.Path. Работа с современным файловым API JVM в идиоматичном стиле Kotlin стала такой же удобной, как работа с расширениями java.io.File из пакета kotlin.io.
// construct path with the div (/) operator
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory"
// list files in a directory
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")
Расширения доступны в пакете kotlin.io.path модуля kotlin-stdlib-jdk7. Чтобы использовать их, необходимо явно включить экспериментальную аннотацию @ExperimentalPathApi.
Повышение производительности функции String.replace
Новая реализация String.replace() ускоряет выполнение функции. В варианте с учётом регистра используется ручной цикл замены на основе indexOf, а в варианте без учёта регистра — сопоставление с регулярным выражением.
Kotlin Android Extensions
В версии 1.4.20 плагин Kotlin Android Extensions объявлен устаревшим, а генератор реализации Parcelable перенесён в отдельный плагин.
Отказ от синтетических представлений
Синтетические представления появились в плагине Kotlin Android Extensions некоторое время назад, чтобы упростить взаимодействие с элементами интерфейса и сократить количество шаблонного кода. Теперь Google предлагает собственный механизм с той же функциональностью — привязку представлений Android Jetpack, — поэтому мы отказываемся от синтетических представлений в пользу этого механизма.
Мы выделяем генератор реализаций Parcelable из kotlin-android-extensions и начинаем процесс отказа от остальных его компонентов — синтетических представлений. Пока они продолжат работать с предупреждением об устаревании. В будущем вам потребуется перейти на другое решение. Ознакомьтесь с рекомендациями, которые помогут перенести Android-проект с синтетических представлений на привязку представлений.
Новый плагин для генератора реализации Parcelable
Теперь генератор реализации Parcelable доступен в новом плагине kotlin-parcelize. Применяйте этот плагин вместо kotlin-android-extensions.
Аннотация @Parcelize перенесена в пакет kotlinx.parcelize.
Подробнее о генераторе реализации Parcelable можно узнать в документации Android.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew1420.html