KSP に関するよくある質問
KSP はなぜ必要なのか?
KSP には、kapt に比べていくつかの利点があります。
- 高速です。
- API が Kotlin ユーザーにとってより直感的です。
- 生成された Kotlin ソースに対する複数ラウンド処理をサポートします。
- マルチプラットフォーム互換性を考慮して設計されています。
KSP はなぜ kapt よりも高速なのですか?
kapt は Java スタブを生成するために、すべての型参照をパースして解決する必要がありますが、KSP は参照をオンデマンドで解決します。 また、javac への委譲にも時間がかかります。
さらに、KSP のインクリメンタル処理モデルは、単に分離・集約するよりもきめ細かくなっています。これにより、すべてを再処理するのを避ける機会が増えます。また、KSP はシンボル解決を動的に追跡するため、ファイルの変更が他のファイルを汚染する可能性が低くなり、結果として再処理されるファイルのセットが小さくなります。これは、kapt が処理を javac に委譲するため不可能です。
KSP は Kotlin 固有のものですか?
KSP は Java ソースも処理できます。API は統一されており、Java クラスと Kotlin クラスをパースすると、KSP で統一されたデータ構造が得られます。
KSP をアップグレードするには?
KSP には API と実装があります。API はめったに変わらず、後方互換性があります。新しいインターフェースは登場しますが、古いインターフェースが変わることはありません。実装は特定のコンパイラバージョンに紐付けられています。新しいリリースでは、サポートされるコンパイラバージョンが変更される可能性があります。
プロセッサは API にのみ依存するため、コンパイラバージョンに紐付けられません。 ただし、プロセッサのユーザーは、プロジェクトのコンパイラバージョンを上げる際に KSP バージョンを上げる必要があります。 そうしないと、次のエラーが発生します。
ksp-a.b.c is too old for kotlin-x.y.z. Please upgrade ksp or downgrade kotlin-gradle-plugin
プロセッサは API にのみ依存するため、プロセッサのユーザーはプロセッサのバージョンを上げる必要はありません。
例えば、あるプロセッサが KSP 1.0.1 (Kotlin 1.6.0 に厳密に依存) でリリースされテストされたとします。 これを Kotlin 1.6.20 で動作させるには、KSP を Kotlin 1.6.20 用にビルドされたバージョン(例えば KSP 1.1.0)に上げるだけです。
より新しい KSP 実装を古い Kotlin コンパイラで使用できますか?
言語バージョンが同じであれば、Kotlin コンパイラは後方互換性があるとされています。 Kotlin コンパイラのバージョンアップはほとんどの場合、容易なはずです。より新しい KSP 実装が必要な場合は、Kotlin コンパイラをそれに合わせてアップグレードしてください。
KSP の更新頻度はどれくらいですか?
KSP はセマンティックバージョニングに可能な限り従うようにしています。 KSP のバージョンが major.minor.patch
の場合、
major
は非互換な API 変更のために予約されています。これに事前に定められたスケジュールはありません。minor
は新機能のために予約されています。これはおよそ四半期ごとに更新されます。patch
はバグ修正と新しい Kotlin リリースのために予約されています。これはおよそ毎月更新されます。
通常、新しい Kotlin バージョンがリリースされてから数日以内に、対応する KSP リリースが利用可能になります。これには、プレリリース (ベータ版または RC 版) も含まれます。
Kotlin 以外に、ライブラリのバージョン要件はありますか?
以下は、ライブラリ/インフラストラクチャの要件リストです。
- Android Gradle Plugin 7.1.3+
- Gradle 6.8.3+
KSP の今後のロードマップは?
以下の項目が計画されています。
- 新しい Kotlin コンパイラのサポート
- マルチプラットフォームのサポートを改善します。例えば、ターゲットのサブセットで KSP を実行したり、ターゲット間で計算を共有したりします。
- パフォーマンスを改善します。多くの最適化が必要です!
- 引き続きバグを修正します。
ご意見がある場合は、お気軽に Kotlin Slack の #ksp チャンネル(招待状を入手する)までご連絡ください。GitHub の issue/機能リクエスト の提出やプルリクエストも歓迎します!