Что нового в Kotlin 1.4.20
Дата релиза: 23 ноября 2020 года
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.
Узнайте, как создавать приложения Kotlin/JS из шаблонов.
Игнорирование ошибок компиляции с помощью компилятора IR
Компилятор IR для Kotlin/JS поставляется с новым экспериментальным режимом — компиляция с ошибками. В этом режиме вы можете запустить код, даже если он содержит ошибки, например, если хотите попробовать определённые вещи, когда всё приложение ещё не готово.
Существует две политики толерантности для этого режима:
SEMANTIC: компилятор будет принимать код, который синтаксически корректен, но не имеет смысла семантически, например,val x: String = 3.SYNTAX: компилятор будет принимать любой код, даже если он содержит синтаксические ошибки.
Для компиляции с ошибками добавьте опцию компилятора -Xerror-tolerance-policy= с одним из указанных значений.
Узнайте больше о игнорировании ошибок компиляции с помощью компилятора Kotlin/JS IR.
Kotlin/Native
Приоритетами Kotlin/Native в версии 1.4.20 являются производительность и доработка существующих функций. Вот заметные улучшения:
Анализ утечек
Kotlin/Native получает прототип нового механизма анализа утечек. Он улучшает производительность выполнения, размещая некоторые объекты в стеке вместо кучи. Этот механизм показывает среднее повышение производительности на 10% по нашим тестам, и мы продолжаем его улучшать, чтобы ускорить программу еще больше.
Анализ утечек выполняется в отдельной фазе компиляции для релизных сборок (с параметром компилятора -opt).
Если вы хотите отключить фазу анализа утечек, используйте параметр компилятора -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, Kotlin требует некоторых изменений в Podfile:
Если у вашего Kotlin Pod есть зависимость Git, HTTP или specRepo Pod, вы также должны указать ее в 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. Работа с современной JVM API файлов по-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's view bindings, и мы устареваем синтетические представления в пользу последних.
Мы выносим генератор реализаций Parcelable из kotlin-android-extensions и начинаем процесс устаревания остальной части — синтетических представлений. Пока что они будут продолжать работать с предупреждением об устаревании. В будущем вам нужно будет переключить свой проект на другое решение. Вот руководство, которое поможет вам мигрировать ваш проект Android с синтетических представлений на привязки представлений.
Новый плагин для генератора реализации Parcelable
Генератор реализации Parcelable теперь доступен в новом плагине kotlin-parcelize. Используйте этот плагин вместо kotlin-android-extensions.
Аннотация @Parcelize перемещена в пакет kotlinx.parcelize.
Узнайте больше о генераторе реализации Parcelable в документации Android.
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew1420.html