Kapt (Kotlin Annotation Processing Tool) umożliwia używanie procesorów adnotacji Java z kodem Kotlin, nawet jeśli nie obsługują one tego języka. W tym celu generowane są z plików Kotlin stuby w języku Java, które mogą następnie odczytywać procesory. Generowanie tych elementów jest kosztowną operacją i ma znaczący wpływ na szybkość kompilacji.
KSP (Kotlin Symbol Processing) to alternatywa dla kapt, która jest przeznaczona przede wszystkim do języka Kotlin. KSP analizuje kod Kotlin bezpośrednio, co jest do 2 razy szybsze. Lepiej też rozumie konstrukcje języka Kotlin.
Podczas migracji możesz w projekcie uruchamiać kapt i KSP jednocześnie. Migrację można przeprowadzać moduł po module i biblioteka po bibliotece.
Oto przegląd kroków migracji:
- Sprawdź, czy używane biblioteki obsługują KSP
- Dodawanie wtyczki KSP do projektu
- Zastępowanie procesorów adnotacji KSP
- Usuwanie wtyczki kapt
Sprawdź, czy używane biblioteki obsługują KSP
Na początek sprawdź, czy biblioteki, których używasz z kapt, obsługują już KSP. Dotyczy to wielu popularnych bibliotek (w tym Dagger, Glide, Room i Moshi), a inne dodają obsługę.
Listę obsługiwanych bibliotek znajdziesz w dokumentacji. Możesz też zapoznać się z dokumentacją i śledzić zgłoszenia dotyczące bibliotek, których używasz.
Dodawanie wtyczki KSP do projektu
Najpierw zadeklaruj wtyczkę KSP w pliku build.gradle.kts najwyższego poziomu.
Listę wersji znajdziesz na stronie KSP w GitHubie.
Kotlin
plugins { id("com.google.devtools.ksp") version "2.3.4" apply false }
Groovy
plugins { id 'com.google.devtools.ksp' version '2.3.4' apply false }
Następnie włącz KSP w pliku build.gradle.kts na poziomie modułu:
Kotlin
plugins { id("com.google.devtools.ksp") }
Groovy
plugins { id 'com.google.devtools.ksp' }
Zastępowanie procesorów adnotacji KSP
Po włączeniu KSP możesz zacząć zastępować użycia kapt KSP. W przypadku większości bibliotek wystarczy zmienić kapt na ksp w deklaracji zależności, ponieważ procesor adnotacji i procesor KSP są dostarczane w tym samym artefakcie.
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' }
Po przejściu na KSP zsynchronizuj i skompiluj projekt, aby sprawdzić, czy nadal działa prawidłowo.
Oto kilka typowych problemów, na które warto zwrócić uwagę:
- Niektóre biblioteki nie obsługują dokładnie tego samego zestawu funkcji w przypadku kapt i KSP. Jeśli po migracji kod przestanie działać, zapoznaj się z dokumentacją biblioteki.
- KSP ma dokładniejsze informacje o typach w Kotlinie niż kapt (np. o możliwości przyjmowania wartości null), co oznacza, że procesory KSP mogą być bardziej precyzyjne w określaniu wymagań dotyczących typów. Oprócz aktualizacji plików kompilacji może to wymagać wprowadzenia poprawek w kodzie źródłowym.
- Jeśli wcześniej przekazywano argumenty do procesora adnotacji, prawdopodobnie trzeba będzie teraz przekazywać je do KSP. Pamiętaj, że format argumentów może się różnić w zależności od kapt i KSP. Więcej informacji znajdziesz w dokumentacji KSP i dokumentacji używanej biblioteki.
Usuwanie wtyczki kapt
Gdy w module nie ma już zależności uwzględnionych w kapt, usuń wtyczkę kapt.
Jeśli została zadeklarowana w bloku wtyczek:
Kotlin
plugins {id("org.jetbrains.kotlin.kapt")}
Groovy
plugins {id 'org.jetbrains.kotlin.kapt'}
Jeśli używało składni wtyczki apply w Groovy:
apply plugin: 'kotlin-kapt'
Należy też usunąć wszelkie pozostałe konfiguracje związane z kapt, takie jak:
Kotlin
kapt { correctErrorTypes = true useBuildCache = true }
Groovy
kapt { correctErrorTypes true useBuildCache true }