KSPとKAPT:KSPが高速な理由
KSPとKAPTの処理モデルを比較し、性能上のメリットを理解します。
「KSPとKAPT:KSPが高速な理由」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
アノテーション処理の課題
アノテーションプロセッサはビルド時にコードを生成します。Kotlinプロジェクトでは長年、KAPT(Kotlin Annotation Processing Tool)が使われてきました。KAPTはKotlinのソースコードをJavaスタブに変換してから、Javaのアノテーションプロセッサに渡します。この変換には大きなコストがかかります。
KAPTの仕組み
KAPTはKotlinコンパイラを実行してJavaスタブファイルを生成し、続いてそのスタブに対してJavaアノテーションプロセッサ(APT)を実行し、最後にすべてをまとめてコンパイルします。各ビルド工程によって遅延が発生します。
- KotlinからJavaスタブへのコンパイル
- スタブに対するJava APT処理
- Kotlinコードと生成ソースの最終コンパイル
KSPの仕組み
KSP(Kotlin Symbol Processing)は、KotlinのコンパイラプラグインAPI上で直接動作します。Kotlinの抽象構文木(AST)をネイティブに読み取るため、スタブの生成もJavaの中間処理も必要ありません。プロセッサはSymbolProcessorを実装し、KSNodeオブジェクトを走査します。
速度比較
Googleのベンチマークデータによると、KSPはインクリメンタルビルドでKAPTより最大2倍高速で、クリーンビルドでも大幅に高速です。スタブ生成をなくすことで高速化されます。大規模なプロジェクトでは、スタブ生成だけでKAPTのビルド時間の30~50%を占めることがあります。
インクリメンタル処理
KSPはインクリメンタル処理をネイティブにサポートしており、前回のビルド以降に変更されたシンボルだけを再処理します。KAPTのインクリメンタル処理のサポートは限定的です。頻繁に小さな変更を加える大規模なコードベースでは、この違いが大きな差になります。
APIの違い
KAPTプロセッサはjavax.annotation.processing.AbstractProcessor(Java API)を実装します。KSPプロセッサはcom.google.devtools.ksp.processing.SymbolProcessor(sealed classや拡張関数など、Kotlinネイティブの構造を備えたKotlin API)を実装します。
Kotlinネイティブの型情報
KSPはKotlinのASTを直接読み取るため、KAPTのスタブでは正確に表現できないKotlin固有の構造も認識できます。これには、null許容性、デフォルト引数値、拡張関数、expect/actual宣言、インラインクラスが含まれます。
マルチプラットフォームのサポート
KSP 2.xはKotlin Multiplatformをサポートしています。1つのKSPプロセッサで、JVM、JS、Nativeの各ターゲット向けにコードを生成できます。KAPTはJVM専用であり、KMPのcommonMainソースを処理できません。
KAPTからKSPへの移行手順
多くの主要ライブラリにはKSP版があります。Room(KSP)、Hilt(KSP)、Moshi(KSP)、Dagger(一部対応)などです。ライブラリのドキュメントを確認してください。ビルド設定のkapt("...")をksp("...")に置き換え、すべてのプロセッサを移行したらKAPTプラグインを削除します。
plugins {
id("com.google.devtools.ksp") version "2.0.0-1.0.21"
}
dependencies {
ksp("androidx.room:room-compiler:2.6.1")
}KAPTがまだ必要な場合
ライブラリにKSPプロセッサ版がまだない場合は、KAPTを使用します。同じプロジェクトでKAPTとKSPを併用することは可能ですが、KAPTを使うプロセッサについてはスタブ生成によるオーバーヘッドがなくなるわけではありません。
ツールとデバッグ
KSPプロセッサでは、さまざまな重大度レベルでメッセージをログに出力できます(KSPLogger)。生成されたファイルはbuild/generated/ksp/に出力されます。IDE(IntelliJ / Android Studio)では生成ソースが強調表示され、そこへ移動できます。
確認問題
インクリメンタルビルドでKSPがKAPTより高速なのはなぜですか。
まとめ:KSPとKAPT
重要なポイント:
- KAPT:KotlinをJavaスタブに変換してからJava APTを実行するため、低速でJVM専用です
- KSP:コンパイラプラグインを介してKotlinのASTをネイティブに読み取るため、最大2倍高速です
- KSPはインクリメンタル処理とKotlin Multiplatformをサポートします
- KSPは、KAPTのスタブでは表現できないKotlin固有の構造を認識します
- ライブラリが対応している場合は、
kapt()をksp()に置き換えて移行します
よくある質問
「KSPとKAPT:KSPが高速な理由」レッスンは無料ですか?
はい。「KSPとKAPT:KSPが高速な理由」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「KSPとKAPT:KSPが高速な理由」で何を学びますか?
KSPとKAPTの処理モデルを比較し、性能上のメリットを理解します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「KSPとKAPT:KSPが高速な理由」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。