この記事は Ting-Yuan Huang、David Winer による Android Developers Blog の記事 "Announcing Kotlin Symbol Processing (KSP) Alpha" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
2021 年 2 月 10 日(日本時間 2 月 11 日)、Kotlin Symbol Processing(KSP)のアルファ版をリリースしました。このまったく新しいツールは、Kotlin で軽量コンパイラ プラグインを作成するためのものです。KSP は KAPT に似た機能を提供しますが、最大 2 倍高速に動作し、Kotlin コンパイラ機能に直接アクセスできます。さらに、マルチプラットフォームの互換性を考慮して開発されています。
KSP は、Kotlin 1.4.30 以降のリリースと互換性があります。オープンソースのコードとドキュメントは、KSP GitHub リポジトリでご確認ください。
Kotlin デベロッパーから最も多く寄せられるリクエストは、ビルド速度の高速化です。多くのデベロッパーは、毎日何十回もアプリのデプロイを繰り返しています。そのため、遅いビルドが終わるのをじっと待たなければならないのは、大きな時間の無駄になる可能性があります。Kotlin コードのコンパイルで特に難しい点は、Kotlin にネイティブのアノテーション処理システムがないことです。Android では Room などにアノテーション プロセッサが多用されていますが、これは Java のアノテーション処理との互換性に依存しており、Kotlin Annotation Processing Tool(KAPT)を通して行われます。しかし KAPT では、中間 Java スタブを生成し、それを Java アノテーション処理システムで処理しなければならないので、高速に実行できるとは限りません。
KSP を設計するにあたって、Kotlin のアノテーション処理を一から構築するとしたら、それはどのようなものになるかについて検討しました。KSP は、Kotlin コードを直接解析する強力でシンプルな API を提供します。そのため、KAPT のスタブ生成によって生じていたビルド速度の遅さを大幅に改善できます。実際に、Room ライブラリを使った初期のベンチマークでは、KSP は KAPT に比べてほぼ 2 倍高速であることが実証できています。
実際に動作する KSP がどのようなものかを確認するには、GitHub から KSP Playground プロジェクトをダウンロードしてください。以下の内容が含まれています。
test-processor
workload
ビルダーを実装するすべてのロジックは test-processor 内にあります。コンシューマー(workload)側で KAPT と KSP を使用する際の唯一の違いは、次のようにビルドファイルに 2 行分の差異があることだけです。
これが KSP の目指すところです。ほとんどの Android アプリのデベロッパーは、内部処理について心配する必要はありません。この 1 行を変更しさえすれば、KSP をサポートするライブラリは通常のアノテーション プロセッサのように見えます。違うのは、最大 2 倍高速になることだけです。ただし、KAPT と KSP を同じモジュールで利用すると、内部的にビルドが遅くなる可能性が高くなります。そのため、アルファ版の期間中は、KSP と KAPT は別々のモジュールで利用したほうがよいでしょう。
KSP に対応するアノテーション プロセッサが増えるにつれて、ほとんどのモジュールは KAPT の完全互換に近い形で KSP を利用できるようになるはずです。現在は、こちらの表でどのアノテーション プロセッサが KSP をサポートしているかを確認できます。KSP をサポートするライブラリや KSP のサポートを実装するライブラリがこの表にない場合は、提案と合わせてプルリクエストをお送りください。
現在アノテーション処理を利用しているライブラリ作成者の方は、ライブラリを KSP に対応させる方法がクイックスタートや README ガイドに掲載されていますので、ご覧ください。
KSP がアルファ版になったので、ライブラリ作成者にとっては、詳しい内容を確認して KSP Issue Tracker から API に関するフィードバックを送り始める絶好のタイミングです。リリースに関する最新情報は、Kotlin Slack の #ksp チャンネルに定期的に投稿しています。昨年 6 月のデベロッパー プレビュー以降、100 以上のバグや問題に対応してきました。その中には、Kotlin ライブラリ デベロッパーのすばらしいコミュニティの皆さんから報告いただいたものもたくさん含まれています。
Java は Oracle および/またはその関連会社の登録商標です。