Kapt(Kotlin Annotation Processing Tool)を使用すると、Java アノテーション プロセッサが Kotlin をサポートしていない場合でも、Java アノテーション プロセッサを使用して Kotlin コードを処理できます。ただし、そのためには、Kotlin ファイルから、Java アノテーション プロセッサが読み取れる Java スタブを生成する必要があります。このスタブ生成は高コストのオペレーションのため、ビルド速度に大きく影響します。
KSP(Kotlin Symbol Processing)は、kapt に代わる Kotlin 対応の処理方法です。KSP は Kotlin コードを直接分析できるため、最大 2 倍速くなります。また、Kotlin の言語構造も詳細に把握しています。
移行中は、プロジェクト内で kapt と KSP を並行して利用できます。移行は、モジュールごとまたはライブラリごとに行えます。
移行手順は主に次のとおりです。
- 使用しているライブラリが KSP をサポートしているかを確認する
- KSP プラグインをプロジェクトに追加する
- アノテーション プロセッサを KSP に置き換える
- kapt プラグインを削除する
使用しているライブラリが KSP をサポートしているかを確認する
まず、kapt で使用しているライブラリが、すでに KSP をサポートしているかどうかを確認します。多くの一般的なライブラリ(Dagger、Glide、Room、Moshi など)がサポートしています。
こちらのドキュメントでサポートされているライブラリのリストを確認できます。また、使用しているライブラリのドキュメントや Issue Tracker も参照してください。
KSP プラグインをプロジェクトに追加する
まず、最上位の build.gradle.kts
ファイルで KSP プラグインを宣言します。プロジェクトの Kotlin バージョンに適した KSP バージョンを選択してください。リリースのリストについては、KSP GitHub ページをご覧ください。
Kotlin
plugins { id("com.google.devtools.ksp") version "2.0.21-1.0.27" apply false }
Groovy
plugins { id 'com.google.devtools.ksp' version '2.0.21-1.0.27' apply false }
次に、モジュール レベルの build.gradle.kts
ファイルで KSP を有効にします。
Kotlin
plugins { id("com.google.devtools.ksp") }
Groovy
plugins { id 'com.google.devtools.ksp' }
アノテーション プロセッサを KSP に置き換える
KSP を有効にすると、kapt を KSP に置き換えられます。ほとんどのライブラリでは、アノテーション プロセッサと KSP プロセッサが同じアーティファクトで出荷されるため、依存関係の宣言時に kapt を ksp に変更するだけで済みます。
Kotlin
dependencies {kapt("androidx.room:room-compiler:2.5.0")ksp("androidx.room:room-compiler:2.5.0") }
Groovy
dependencies {kapt 'androidx.room:room-compiler:2.5.0'ksp 'androidx.room:room-compiler:2.5.0' }
KSP に移行したら、プロジェクトを同期してビルドし、引き続き正しく動作することを確認します。
注意すべき一般的な問題は次のとおりです。
- 一部のライブラリでは、kapt と KSP でサポートしている機能セットが異なる場合があります。移行後にコードが機能しない場合は、ライブラリのドキュメントを確認してください。
- KSP は kapt よりも正確な Kotlin 型情報(null 可能性など)を把握しているため、KSP プロセッサのほうが型要件に正確に対応できます。そのためには、ビルドファイルの更新に加え、ソースコードも一部修正しなければならない場合があります。
- これまでアノテーション プロセッサに引数を渡していたのであれば、場合によっては、今度は KSP に渡す必要があります。引数の形式は kapt と KSP で異なる場合があるので注意してください。詳細については、KSP のドキュメントと、使用しているライブラリのドキュメントをご覧ください。
kapt プラグインを削除する
モジュール内に kapt
との依存関係がなくなったら、kapt プラグインを削除します。
プラグイン ブロックで kapt が宣言されている場合:
Kotlin
plugins {id("org.jetbrains.kotlin.kapt")}
Groovy
plugins {id 'org.jetbrains.kotlin.kapt'}
kapt が Groovy を使用して apply plugin 構文を使用していた場合:
apply plugin: 'kotlin-kapt'
また、kapt に関連する残りの設定も削除します。
Kotlin
kapt { correctErrorTypes = true useBuildCache = true }
Groovy
kapt { correctErrorTypes true useBuildCache true }