メインコンテンツまでスキップ

Kotlin 1.4.20の新機能

リリース: 2020年11月23日

Kotlin 1.4.20では、いくつかの新しい試験的な機能が提供され、1.4.0で追加されたものを含む既存の機能に対する修正と改善が行われています。

こちらのブログ記事では、より多くの例とともに新機能について学ぶことができます。

Kotlin/JVM

Kotlin/JVMの改善は、最新のJavaバージョンの機能に対応することを目的としています。

Java 15 target

Java 15がKotlin/JVMのtargetとして利用可能になりました。

invokedynamic string concatenation

注記

invokedynamic string concatenationはExperimentalです。予告なく削除または変更される可能性があります。オプトインが必要です(詳細は下記参照)。評価目的でのみ使用してください。YouTrackでフィードバックをお寄せください。

Kotlin 1.4.20では、文字列連結をJVM 9+ targets上のdynamic invocationsにコンパイルできるため、パフォーマンスが向上します。

現在、この機能は試験的であり、以下のケースを対象としています。

  • 演算子 (a + b)、明示的 (a.plus(b))、および参照 ((a::plus)(b)) 形式のString.plus
  • インラインクラスおよびデータクラスのtoString
  • 単一の非定数引数を持つものを除く、文字列テンプレート(KT-42457を参照)。

invokedynamic string concatenationを有効にするには、次のいずれかの値を持つ-Xstring-concatコンパイラオプションを追加します。

Kotlin/JS

Kotlin/JSは急速に進化しており、1.4.20では多くの試験的な機能と改善点が見られます。

Gradle DSL changes

Kotlin/JSのGradle DSLは、プロジェクトのセットアップとカスタマイズを簡素化する多くの更新を受けます。これには、webpack構成の調整、自動生成されたpackage.jsonファイルの変更、および推移的な依存関係の制御の改善が含まれます。

Single point for webpack configuration

ブラウザtargetには、新しい構成ブロックcommonWebpackConfigが用意されています。その中で、webpackTaskrunTask、およびtestTaskの構成を複製する代わりに、単一のポイントから共通設定を調整できます。

3つのタスクすべてに対してCSSサポートをデフォルトで有効にするには、プロジェクトのbuild.gradle(.kts)に次のスニペットを追加します。

browser {
commonWebpackConfig {
cssSupport.enabled = true
}
binaries.executable()
}

webpack bundlingの設定について詳しくはこちらをご覧ください。

package.json customization from Gradle

Kotlin/JSパッケージの管理と配布をより詳細に制御するために、Gradle DSLを介してプロジェクトファイルpackage.jsonにプロパティを追加できるようになりました。

package.jsonにカスタムフィールドを追加するには、コンパイルのpackageJsonブロックでcustomField関数を使用します。

kotlin {
js(BOTH) {
compilations["main"].packageJson {
customField("hello", mapOf("one" to 1, "two" to 2))
}
}
}

package.jsonのカスタマイズについて詳しくはこちらをご覧ください。

Selective yarn dependency resolutions

selective yarn dependency resolutionsのサポートはExperimentalです。予告なく削除または変更される可能性があります。評価目的でのみ使用してください。YouTrackでフィードバックをお寄せください。

Kotlin 1.4.20では、Yarnのselective dependency resolutions(依存するパッケージの依存関係をオーバーライドするメカニズム)を構成する方法が提供されています。

これは、GradleのYarnPlugin内のYarnRootExtensionを介して使用できます。プロジェクトの解決済みパッケージのバージョンに影響を与えるには、パッケージ名セレクター(Yarnで指定されているとおり)と解決先のバージョンを渡すresolution関数を使用します。

rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().apply {
resolution("react", "16.0.0")
resolution("processor/decamelize", "3.0.0")
}
}

ここで、reactを必要とする_すべての_ npm依存関係はバージョン16.0.0を受け取り、processorはその依存関係decamelizeをバージョン3.0.0として受け取ります。

Disabling granular workspaces

granular workspacesの無効化はExperimentalです。予告なく削除または変更される可能性があります。評価目的でのみ使用してください。YouTrackでフィードバックをお寄せください。

ビルド時間を短縮するために、Kotlin/JS Gradleプラグインは、特定のGradleタスクに必要な依存関係のみをインストールします。たとえば、webpack-dev-serverパッケージは、*Runタスクのいずれかを実行した場合にのみインストールされ、assembleタスクを実行した場合はインストールされません。このような動作は、複数のGradleプロセスを並行して実行する場合に問題を引き起こす可能性があります。依存関係の要件が競合すると、npmパッケージの2つのインストールがエラーを引き起こす可能性があります。

この問題を解決するために、Kotlin 1.4.20には、これらのいわゆる_granular workspaces_を無効にするオプションが含まれています。この機能は現在、GradleのYarnPlugin内のYarnRootExtensionを介して利用可能です。これを使用するには、次のスニペットをbuild.gradle.ktsファイルに追加します。

rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().disableGranularWorkspaces()
}

New Wizard templates

プロジェクトの作成時により便利なカスタマイズ方法を提供するために、Kotlinのプロジェクトウィザードには、Kotlin/JSアプリケーション用の新しいテンプレートが付属しています。

  • Browser Application - ブラウザで実行される最小限のKotlin/JS Gradleプロジェクト。
  • React Application - 適切なkotlin-wrappersを使用するReactアプリ。 スタイルシート、ナビゲーションコンポーネント、または状態コンテナの統合を有効にするオプションが用意されています。
  • Node.js Application - Node.jsランタイムで実行するための最小限のプロジェクト。実験的なkotlinx-nodejsパッケージを直接含めるオプションが付属しています。

Ignoring compilation errors with IR compiler

_Ignore compilation errors_モードはExperimentalです。予告なく削除または変更される可能性があります。オプトインが必要です(詳細は下記参照)。評価目的でのみ使用してください。YouTrackでフィードバックをお寄せください。

Kotlin/JSのIRコンパイラには、新しい実験的なモードである_compilation with errors_が付属しています。このモードでは、たとえば、アプリケーション全体がまだ準備できていない場合に特定のこと試したい場合に、エラーが含まれていてもコードを実行できます。

このモードには、次の2つのトレランスポリシーがあります。

  • SEMANTIC: コンパイラは構文的には正しいが、意味的に意味をなさないコード(val x: String = 3など)を受け入れます。

  • SYNTAX: コンパイラは、構文エラーが含まれていても、すべてのコードを受け入れます。

エラーのあるコンパイルを許可するには、上記のいずれかの値を持つ-Xerror-tolerance-policy=コンパイラオプションを追加します。

Kotlin/JS IRコンパイラについて詳しくはこちらをご覧ください。

Kotlin/Native

Kotlin/Nativeの1.4.20での優先事項は、パフォーマンスと既存の機能の改良です。注目すべき改善点は次のとおりです。

Escape analysis

escape analysisメカニズムはExperimentalです。予告なく削除または変更される可能性があります。評価目的でのみ使用してください。YouTrackでフィードバックをお寄せください。

Kotlin/Nativeは、新しいescape analysisメカニズムのプロトタイプを受け取ります。これにより、特定のオブジェクトをヒープではなくスタックに割り当てることで、ランタイムパフォーマンスが向上します。このメカニズムは、ベンチマークで平均10%のパフォーマンス向上を示しており、プログラムをさらに高速化できるように改善を続けています。

escape analysisは、リリースビルド(-optコンパイラオプション付き)の別のコンパイルフェーズで実行されます。

escape analysisフェーズを無効にする場合は、-Xdisable-phases=EscapeAnalysisコンパイラオプションを使用します。

Performance improvements and bug fixes

Kotlin/Nativeは、コード共有メカニズムなど、1.4.0で追加されたものを含む、さまざまなコンポーネントでパフォーマンスの改善とバグ修正を受けています。

Opt-in wrapping of Objective-C exceptions

Objective-C exception wrappingメカニズムはExperimentalです。予告なく削除または変更される可能性があります。オプトインが必要です(詳細は下記参照)。評価目的でのみ使用してください。YouTrackでフィードバックをお寄せください。

Kotlin/Nativeは、プログラムのクラッシュを回避するために、Objective-Cコードからスローされた例外を実行時に処理できるようになりました。

NSExceptionForeignException型のKotlin例外にラップすることを選択できます。これらは元のNSExceptionへの参照を保持します。これにより、根本原因に関する情報を取得し、適切に処理できます。

Objective-C例外のラッピングを有効にするには、cinterop呼び出しで-Xforeign-exception-mode objc-wrapオプションを指定するか、.defファイルにforeignExceptionMode = objc-wrapプロパティを追加します。CocoaPods integrationを使用している場合は、次のように依存関係のpod {}ビルドスクリプトブロックでオプションを指定します。

pod("foo") {
extraOpts = listOf("-Xforeign-exception-mode", "objc-wrap")
}

デフォルトの動作は変更されていません。Objective-Cコードから例外がスローされると、プログラムは終了します。

CocoaPods plugin improvements

Kotlin 1.4.20では、CocoaPods integrationの改善が引き続き行われています。具体的には、次の新機能を試すことができます。

Improved task execution

CocoaPodsプラグインは、タスク実行フローが改善されています。たとえば、新しいCocoaPods依存関係を追加した場合、既存の依存関係は再構築されません。追加のtargetを追加しても、既存のtargetの依存関係の再構築には影響しません。

Extended DSL

KotlinプロジェクトにCocoaPods依存関係を追加するためのDSLは、新しい機能を受け取ります。

ローカルのPodsおよびCocoaPodsリポジトリからのPodsに加えて、次の種類のライブラリへの依存関係を追加できます。

  • カスタムspecリポジトリからのライブラリ。
  • Gitリポジトリからのリモートライブラリ。
  • アーカイブからのライブラリ(任意のHTTPアドレスでも利用可能)。
  • 静的ライブラリ。
  • カスタムcinteropオプションを持つライブラリ。

KotlinプロジェクトでのCocoaPods依存関係の追加について詳しくはこちらをご覧ください。Kotlin with CocoaPods sampleで例を見つけてください。

Updated integration with Xcode

Xcodeで正しく動作させるには、KotlinにはいくつかのPodfileの変更が必要です。

  • Kotlin PodにGit、HTTP、またはspecRepo Pod依存関係がある場合は、Podfileにも指定する必要があります。
  • カスタムspecからライブラリを追加する場合は、Podfileの先頭でspecのlocationも指定する必要があります。

IDEAでintegrationエラーの詳細な説明が表示されるようになりました。Podfileに問題がある場合は、すぐに修正方法がわかります。

Kotlin podsの作成について詳しくはこちらをご覧ください。

Support for Xcode 12 libraries

Xcode 12で提供される新しいライブラリのサポートを追加しました。Kotlinコードから使用できるようになりました。

Kotlin Multiplatform

Updated structure of multiplatform library publications

Kotlin 1.4.20以降、個別のメタデータ公開はなくなりました。メタデータアーティファクトは、ライブラリ全体を表す_ルート_公開に含まれるようになりました。これは、共通ソースセットへの依存関係として追加されると、適切なプラットフォーム固有のアーティファクトに自動的に解決されます。

マルチプラットフォームライブラリの公開について詳しくはこちらをご覧ください。

Compatibility with earlier versions

この構造の変更により、階層型プロジェクト構造を持つプロジェクト間の互換性が損なわれます。マルチプラットフォームプロジェクトと依存するライブラリの両方が階層型プロジェクト構造を持っている場合は、Kotlin 1.4.20以降に同時に更新する必要があります。Kotlin 1.4.20で公開されたライブラリは、以前のバージョンで公開されたプロジェクトからは使用できません。

階層型プロジェクト構造を持たないプロジェクトおよびライブラリは、互換性が維持されます。

Standard library

Kotlin 1.4.20の標準ライブラリには、ファイル操作用の新しい拡張機能と、より優れたパフォーマンスが提供されています。

Extensions for java.nio.file.Path

java.nio.file.Pathの拡張機能はExperimentalです。予告なく削除または変更される可能性があります。オプトインが必要です(詳細は下記参照)。評価目的でのみ使用してください。YouTrackでフィードバックをお寄せください。

標準ライブラリは、java.nio.file.Pathの実験的な拡張機能を提供するようになりました。現代的なJVMファイルAPIをKotlinらしい方法で使用することは、kotlin.ioパッケージのjava.io.File拡張機能を使用することと似ています。

// div (/)演算子でパスを構築します
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory"

// ディレクトリ内のファイルを一覧表示します
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")

拡張機能は、kotlin-stdlib-jdk7モジュールのkotlin.io.pathパッケージで利用できます。拡張機能を使用するには、実験的なアノテーション@ExperimentalPathApiオプトインします。

Improved String.replace function performance

String.replace()の新しい実装により、関数の実行が高速化されます。大文字と小文字を区別するvariantはindexOfに基づく手動の置換ループを使用し、大文字と小文字を区別しないvariantは正規表現マッチングを使用します。

Kotlin Android Extensions

1.4.20では、Kotlin Android Extensionsプラグインは非推奨となり、Parcelable実装ジェネレーターは別のプラグインに移動します。

Deprecation of synthetic views

_Synthetic views_は、UI要素とのやり取りを簡素化し、ボイラープレートを削減するために、少し前にKotlin Android Extensionsプラグインで提示されました。現在、Googleは同じことを行うネイティブメカニズムを提供しています。Android Jetpackのview bindingsです。そのため、これらの支持のためにsynthetic viewsは非推奨になります。

kotlin-android-extensionsからParcelable実装ジェネレーターを抽出し、残りのsynthetic viewsに対して非推奨サイクルを開始します。今のところ、非推奨の警告が表示されますが、引き続き動作します。将来的には、プロジェクトを別のソリューションに切り替える必要があります。syntheticsからview bindingsにAndroidプロジェクトを移行するのに役立つガイドラインを次に示します。

New plugin for Parcelable implementation generator

Parcelable実装ジェネレーターは、新しいkotlin-parcelizeプラグインで利用できるようになりました。kotlin-android-extensionsの代わりにこのプラグインを適用します。

kotlin-parcelizekotlin-android-extensionsを1つのモジュールに同時に適用することはできません。

@Parcelizeアノテーションは、kotlinx.parcelizeパッケージに移動されました。

AndroidドキュメントParcelable実装ジェネレーターの詳細をご覧ください。