この記事の内容
GradleのAnnotationProcesserを、kaptからkspにするお話です。
そもそもAnnotationProcesserって何?
「AnnotationProcesser」は、コンパイルの時にコードを自動生成しましょうという機能です。
これはjavaの機能で、ソースに埋め込まれているアノテーションに基づいてコードを自動生成します。
このAnnotateionProcesserをkotlinで書かれたソースでもできるようにしたのが、「kapt(kotlin annotation processer tools)」です。
で、kaptを高速化させたのが、「KSP(kotlin symbol processing)」になります。
細かい話は、公式ページにお任せしますが、kaptでは、kotlinからjavaのコードに変換することで、Java AnnotaionProcesserが理解できるようにしてから、コードの自動生成を行っていました。
kspは、kotlinから直接コードを自動生成する(javaで中間コードを生成しない)ので早い!らしいです。(ちゃんとはかってませんが、体感できるレベルで早いです)
RoomとHiltをKSPに移行する
gradle
plugins {
id 'com.android.application' version '8.1.0' apply false
id 'org.jetbrains.kotlin.android' version '1.8.10' apply false
id 'org.jetbrains.kotlin.plugin.serialization' version '1.8.10' apply false
id 'com.google.dagger.hilt.android' version '2.47' apply false
+ id 'com.google.devtools.ksp' version '1.8.10-1.0.9' apply false
}
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'org.jetbrains.kotlin.plugin.serialization'
- id 'kotlin-kapt'
+ id 'com.google.devtools.ksp'
id 'com.google.dagger.hilt.android'
}
android {
defaultConfig {
- kapt {
- arguments {
- arg("room.schemaLocation", "$projectDir/schemas")
- }
- }
+ ksp {
+ arg("room.schemaLocation", "$projectDir/schemas")
+ }
+ }
}
dependencies {
// hilt
def hilt_version = "2.47"
implementation "com.google.dagger:hilt-android:$hilt_version"
- kapt "com.google.dagger:hilt-compiler:$hilt_version"
+ ksp "com.google.dagger:hilt-compiler:$hilt_version"
implementation 'androidx.hilt:hilt-navigation-compose:1.0.0'
// Room
def room_version = "2.5.2"
implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-ktx:$room_version"
- kapt "androidx.room:room-compiler:$room_version"
+ ksp "androidx.room:room-compiler:$room_version"
}
room.schemaLocationのところは、Roomの設定でexportSchemaがtrueの時に必要な記述です。