0Pricing
Kotlin Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. KSPとKAPT:KSPが高速な理由
  2. 最初のSymbolProcessorを作成する
  3. KotlinPoetによるKotlinソースファイルの生成
  4. GradleビルドへのKSPプロセッサーの統合
← Kotlin Academyに戻る