Spec-Zone.ru › Kotlin 2

Что нового в Kotlin 1.4.20

Выпущено: 23 ноября 2020 г.

В Kotlin 1.4.20 добавлено несколько новых экспериментальных функций, а также исправлены ошибки и улучшены существующие функции, в том числе добавленные в версии 1.4.0.

Подробнее о новых функциях и примерах их использования можно узнать в этой записи блога.

Информацию о цикле выпуска Kotlin см. в разделе Процесс выпуска Kotlin.

Kotlin/JVM

Улучшения Kotlin/JVM призваны обеспечить поддержку возможностей современных версий Java:

  • Целевая версия Java 15

  • Конкатенация строк с помощью invokedynamic

Целевая версия Java 15

Теперь Java 15 доступна в качестве целевой версии Kotlin/JVM.

Конкатенация строк с помощью invokedynamic

Конкатенация строк с помощью invokedynamic имеет статус экспериментальной функции. В любой момент её могут удалить или изменить. Требуется явное включение функции (подробности ниже). Используйте её только для оценки. Мы будем благодарны за ваши отзывы на YouTrack.

В 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

  • Новые шаблоны мастера

  • Игнорирование ошибок компиляции компилятором IR

Изменения в 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

Поддержка выборочного разрешения зависимостей Yarn имеет статус экспериментальной функции. В любой момент её могут удалить или изменить. Используйте её только для оценки. Мы будем благодарны за ваши отзывы на YouTrack.

В 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.

Отключение гранулярных рабочих пространств

Отключение гранулярных рабочих пространств имеет статус экспериментальной функции. В любой момент её могут удалить или изменить. Используйте её только для оценки. Мы будем благодарны за ваши отзывы на YouTrack.

Чтобы ускорить сборку, плагин 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

Режим игнорирования ошибок компиляции имеет статус экспериментальной функции. В любой момент его могут удалить или изменить. Требуется явное включение функции (подробности ниже). Используйте её только для оценки. Мы будем благодарны за ваши отзывы на YouTrack.

В компиляторе IR для Kotlin/JS появился новый экспериментальный режим — компиляция с ошибками. В этом режиме можно запускать код, даже если он содержит ошибки. Например, это полезно, если вы хотите опробовать отдельные возможности, пока приложение ещё не готово.

В этом режиме предусмотрены две политики допустимости ошибок:

  • SEMANTIC: компилятор принимает синтаксически корректный, но бессмысленный с точки зрения семантики код, например val x: String = 3.

  • SYNTAX: компилятор принимает любой код, даже если в нём есть синтаксические ошибки.

Чтобы разрешить компиляцию с ошибками, добавьте параметр компилятора -Xerror-tolerance-policy= с одним из перечисленных выше значений.

Подробнее о компиляторе Kotlin/JS IR.

Kotlin/Native

В Kotlin/Native версии 1.4.20 основное внимание уделено производительности и доработке существующих функций. К заметным улучшениям относятся:

  • Анализ escape-поведения

  • Повышение производительности и исправление ошибок

  • Обёртывание исключений Objective-C с явным включением

  • Улучшения плагина CocoaPods

  • Поддержка библиотек Xcode 12

Анализ escape-поведения

Механизм анализа escape-поведения имеет статус экспериментальной функции. В любой момент его могут удалить или изменить. Используйте его только для оценки. Мы будем благодарны за ваши отзывы на YouTrack.

В Kotlin/Native добавлен прототип нового механизма анализа escape-поведения. Он повышает производительность во время выполнения, размещая некоторые объекты в стеке, а не в куче. По результатам наших тестов этот механизм в среднем повышает производительность на 10%. Мы продолжаем его совершенствовать, чтобы ещё сильнее ускорить выполнение программ.

Анализ escape-поведения выполняется на отдельном этапе компиляции при сборке релизной версии (с параметром компилятора -opt).

Чтобы отключить этап анализа escape-поведения, используйте параметр компилятора -Xdisable-phases=EscapeAnalysis.

Повышение производительности и исправление ошибок

В Kotlin/Native повышена производительность и исправлены ошибки в различных компонентах, в том числе добавленных в версии 1.4.0, например в механизме совместного использования кода.

Обёртывание исключений Objective-C с явным включением

Механизм обёртывания исключений Objective-C имеет статус экспериментальной функции. В любой момент его могут удалить или изменить. Требуется явное включение функции (подробности ниже). Используйте её только для оценки. Мы будем благодарны за ваши отзывы на YouTrack.

Теперь 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. В частности, можно попробовать следующие новые функции:

  • Улучшенное выполнение задач

  • Расширенный DSL

  • Обновлённая интеграция с Xcode

Улучшенное выполнение задач

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

  • Повышение производительности функции String.replace

Расширения для java.nio.file.Path

Расширения для java.nio.file.Path имеют статус экспериментальных функций. В любой момент их могут удалить или изменить. Требуется явное включение (подробности ниже). Используйте их только для оценки. Мы будем благодарны за ваши отзывы на YouTrack.

Теперь стандартная библиотека предоставляет экспериментальные расширения для 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 перенесён в отдельный плагин.

  • Отказ от синтетических представлений

  • Новый плагин для генератора реализации Parcelable

Отказ от синтетических представлений

Синтетические представления появились в плагине Kotlin Android Extensions некоторое время назад, чтобы упростить взаимодействие с элементами интерфейса и сократить количество шаблонного кода. Теперь Google предлагает собственный механизм с той же функциональностью — привязку представлений Android Jetpack, — поэтому мы отказываемся от синтетических представлений в пользу этого механизма.

Мы выделяем генератор реализаций Parcelable из kotlin-android-extensions и начинаем процесс отказа от остальных его компонентов — синтетических представлений. Пока они продолжат работать с предупреждением об устаревании. В будущем вам потребуется перейти на другое решение. Ознакомьтесь с рекомендациями, которые помогут перенести Android-проект с синтетических представлений на привязку представлений.

Новый плагин для генератора реализации Parcelable

Теперь генератор реализации Parcelable доступен в новом плагине kotlin-parcelize. Применяйте этот плагин вместо kotlin-android-extensions.

Плагины kotlin-parcelize и kotlin-android-extensions нельзя применять одновременно в одном модуле.

Аннотация @Parcelize перенесена в пакет kotlinx.parcelize.

Подробнее о генераторе реализации Parcelable можно узнать в документации Android.

15 января 2026 г.
Что нового в Kotlin 1.4.30Что нового в Kotlin 1.4.0

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API