KSP よくある質問
KSPを選ぶ理由
KSPには、kaptに比べていくつかの利点があります。
- 高速です。
- KotlinユーザーにとってAPIがより自然です。
- 生成されたKotlinソースに対して複数ラウンド処理をサポートしています。
- マルチプラットフォーム互換性を念頭に置いて設計されています。
KSPはなぜkaptよりも高速なのですか?
kaptはJavaスタブを生成するためにすべての型参照を解析して解決する必要がありますが、KSPは参照をオンデマンドで解決します。 javacへの委譲も時間がかかります。
さらに、KSPのインクリメンタル処理モデルは、分離と集約よりもきめ細かい粒度を持っています。これにより、すべてを再処理するのを避ける機会が増えます。また、KSPはシンボル解決を動的にトレースするため、ファイル内の変更が他のファイルを汚染する可能性が低く、したがって再処理されるファイルのセットが小さくなります。これはkaptでは不可能です。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
NOTE
プロセッサーのユーザーは、プロセッサーがAPIにのみ依存するため、プロセッサーのバージョンを上げる必要はありません。
例えば、あるプロセッサーがKSP 1.0.1でリリースされテストされており、それはKotlin 1.6.0に厳密に依存しているとします。 それをKotlin 1.6.20で動作させるには、Kotlin 1.6.20のためにビルドされたKSPのバージョン(例えばKSP 1.1.0)にKSPを上げるだけです。
古いKotlinコンパイラで新しいKSP実装を使用できますか?
言語バージョンが同じであれば、Kotlinコンパイラは後方互換性があるとされています。 ほとんどの場合、Kotlinコンパイラのバージョンを上げることは簡単です。新しいKSP実装が必要な場合は、それに応じてKotlinコンパイラをアップグレードしてください。
KSPはどのくらいの頻度で更新されますか?
KSPはセマンティックバージョニングにできるだけ従うように努めています。 KSPのバージョン`major.minor.patch`において、
- `major`は互換性のないAPI変更のために予約されています。これについては、事前に決定されたスケジュールはありません。
- `minor`は新機能のために予約されています。これはおよそ四半期ごとに更新されます。
- `patch`はバグ修正と新しいKotlinリリースのために予約されています。これはおよそ月ごとに更新されます。
通常、新しいKotlinバージョンがリリースされてから数日以内に、プレリリース(ベータ版またはRC版)を含め、対応するKSPリリースが利用可能になります。
Kotlin以外に、ライブラリのバージョン要件はありますか?
以下は、ライブラリ/インフラストラクチャの要件のリストです。
- Android Gradle Plugin 7.1.3+
- Gradle 6.8.3+
KSPの将来のロードマップは何ですか?
以下の項目が計画されています。
- 新しいKotlinコンパイラのサポート
- マルチプラットフォームサポートの改善。例えば、KSPをターゲットのサブセットで実行したり、ターゲット間で計算を共有したりします。
- パフォーマンスの改善。多くの最適化を行うべき点があります!
- バグ修正を継続します。
アイデアについて議論したい場合は、Kotlin Slackの#kspチャンネル(招待状を入手)にてお気軽にお問い合わせください。GitHub issue/機能リクエストの提出やプルリクエストも歓迎します!