공식 문서 Migrate from kapt to KSP 에 잘 설명되어 있다.
Kapt
Kapt는 the Kotlin Annotation Processing Tool 의 약자로 Java Annotation을 코틀린에서 사용가능하도록 만들어준다. 결과적으로 Kotlin 코드에서 Annotation들의 사용이 가능해진다. 예를 들면, Room Database를 사용시 다음과 같은 Dao코드를 필요로 하는데,
@Dao
interface PlantDao {
@Query("SELECT * FROM plants ORDER BY name")
fun getPlants(): LiveData<List<Plant>>
@Query("SELECT * FROM plants WHERE growZoneNumber = :growZoneNumber ORDER BY name")
fun getPlantsWithGrowZoneNumber(growZoneNumber: Int): LiveData<List<Plant>>
@Query("SELECT * FROM plants WHERE id = :plantId")
fun getPlant(plantId: String): LiveData<Plant>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll(plants: List<Plant>)
}
@Dao, @Query 등이 코드에 부가적으로 달려있는 annotation이며 Kapt는 이를 해석하고 필요한 코드를 생성하는 역할을 한다.
Kapt의 사용은 build.gradle에 다음과 같은 코드의 추가로 사용한다.
plugins {
id 'kotlin-kapt'
}
...
dependencies {
kapt "androidx.room:room-compiler:2.6.1"
kapt "com.github.bumptech.glide:compiler:4.16.0"
...
kapt 플러그인을 추가하고 이를 사용하는 라이브러리를 kapt 로 기술하고있다.
Kapt의 문제는 Java Annotation으로 처리하기위해 Kotlin 코드로부터 Java Stubs 코드를 생성하는 단계를 거친다. 이는 컴파일 단계에서 부하가 꽤 큰 작업이다.
KSP
KSP는 Kotlin Symbol Processing의 약자로, Kapt를 대체하고 Kotlin 코드에서 직접 Annotation을 처리하기위해 만들어진 것이다. Kotlin 코드를 보다 잘 이해하고 Java Stub코드의 생성을 제거함으로서 2배이상 빨라졌다고 한다. 그래서 요즘 안드로이드 스튜디오에서 kapt 부분이 보이면 KSP로 바꾸도록 권고하고 있다.
Migration Kapt to KSP
gradle 파일만 수정하면된다. 우선 프로젝트 수준의 build.gradle파일에 다음을 추가한다.
plugins {
id 'com.google.devtools.ksp' version '1.9.24-1.0.20' apply false
}
버전 넘버는 KSP의 github에서 확인 가능하다. 다음, 모듈 레벨 build.gradle에 다음을 추가한다.
plugins {
id 'kotlin-kapt'
}
이제 kapt를 사용하는 라이브러리의 접두어를 바꿔준다.
dependencies {
//kapt "androidx.room:room-compiler:2.6.1"
ksp "androidx.room:room-compiler:2.6.1"
...
마지막으로 kapt관련 코드를 제거해준다. 주석처리로 표시했지만, 그냥 삭제하면 된다.
plugins {
//id 'org.jetbrains.kotlin.kapt'
}
...
//kapt {
//correctErrorTypes true
//useBuildCache true
//}
Kapt가 여전히 필요한 경우
예를들어 코드가 아직 databinding을 사용중이라면 Kapt를 삭제할 수 없다. 구글에서 databinding은 예전방식이고 완전히 compose로 넘어간 상태라서 databinding에서 KSP 지원계획은 없다고 한다. 이런경우는 여전히 Kapt를 사용해야 하는데, 필요한 부분은 KSP로 변경하고 databinding 사용만 일시적으로 kapt를 유지하여 Kapt와 KSP를 병행사용하는 것도 하나의 방법이다. 이후에 kapt 의존성이 사라지면 제거해도 된다.