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/機能リクエスト の提出やプルリクエストも歓迎します!
