KSP FAQ
なぜKSPなのですか?
KSPにはkaptと比較していくつかの利点があります:
- より高速です。
- Kotlinユーザーにとってより使いやすい(fluentな)APIを提供します。
- 生成されたKotlinソースに対して多ラウンド処理(multiple round processing)をサポートしています。
- マルチプラットフォーム互換性を念頭に置いて設計されています。
なぜKSPはkaptよりも高速なのですか?
kaptはJavaスタブを生成するためにすべての型参照を解析して解決する必要がありますが、KSPはオンデマンドで参照を解決します。 また、javacに処理を委任すること自体も時間を要します。
さらに、KSPの増分処理(incremental processing)モデルは、単なる隔離(isolating)や集約(aggregating)よりも細かい粒度を持っています。これにより、すべてを再処理することを避ける機会が増えます。また、KSPはシンボルの解決を動的に追跡するため、ファイル内での変更が他のファイルに影響を及ぼしにくく、結果として再処理が必要なファイルのセットが小さくなります。これは処理をjavacに委任しているkaptでは不可能です。
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)に上げるだけです。
古いKotlinコンパイラで新しいKSP実装を使用できますか?
言語バージョンが同じであれば、Kotlinコンパイラは後方互換性があるはずです。 ほとんどの場合、Kotlinコンパイラのバージョンアップは容易です。新しいKSP実装が必要な場合は、それに応じてKotlinコンパイラをアップグレードしてください。
KSPはどのくらいの頻度で更新されますか?
KSPはセマンティックバージョニング(Semantic Versioning)に可能な限り忠実に従うよう努めています。 KSPのバージョンが major.minor.patch の場合:
majorは、互換性のないAPIの変更のために予約されています。これに関するあらかじめ決まったスケジュールはありません。minorは、新機能のために予約されています。これはおよそ四半期ごとに更新される予定です。patchは、バグ修正と新しいKotlinのリリース(プレリリース(BetaまたはRC)を含む)のために予約されています。およそ毎月更新されます。
通常、新しいKotlinバージョンがリリースされてから数日以内に、対応するKSPリリースが利用可能になります。
Kotlin以外に、ライブラリのバージョン要件はありますか?
ライブラリおよびインフラストラクチャの要件リストは以下の通りです:
- Android Gradle Plugin 7.1.3以上
- Gradle 6.8.3以上
KSPの今後のロードマップを教えてください。
以下の項目が計画されています:
- 新しいKotlinコンパイラのサポート
- マルチプラットフォーム対応の改善。例えば、特定のターゲットのサブセットでKSPを実行したり、ターゲット間で計算を共有したりすること。
- パフォーマンスの向上。多くの最適化が予定されています!
- 継続的なバグ修正。
アイデアについて議論したい場合は、Kotlin Slackの #ksp チャンネル(招待はこちらから)までお気軽にお問い合わせください。GitHubでのIssue作成や機能リクエスト、プルリクエストも歓迎します!
