Ksp и kapt нужны для генерации кода. Довольно удобно написать код один раз, а потом просто подтягивать в нужных местах с помощью аннотации. Если вы использовали Room или Dagger, то в зависимостях прописываете kapt("") и указываете плагин "org.jetbrains.kotlin.kapt". Вот как раз тут и происходит вся магия.
Минутка истории: вначале появился apt (Annotation Processing Tool). И он работает только с Java. А ещё там есть рефлексия, плохая производительность, плохая безопасность и прочие радости. И самое главное: apt доступен только для чтения. Разработчиков это не устраивало и появился JSR 269, который позволяет писать плагины самостоятельно. И именно на нем были написаны Room, Moshi, Dagger и другие популярные библиотеки, которые подключаются через kapt или apt.
Потом появился андроид. Пока все писали на Java, всё было хорошо. Но с появлением Kotlin возникла проблема, потому что apt не умеет работать с ним. Так появился kapt.
Немного про то как устроен kapt: внутри там обычный java-компилятор. И это главная проблема: если мы пишем на kotlin, то kapt генерирует некие стабы (заглушка с конструкторами, но без реализации) ➝ Java-компилятор берет стабы и генерирует код ➝ этот код попадает в kotlin-компилятор и все работает. Вы только посмотрите сколько времени уходит на генерацию стабов при сборке проекта:
Плюс есть еще проблемы стабов, если вы пишете свой собственный плагин, а не просто используете библиотеку. При их генерации может теряться функционал, например, методы в data-классах. Я сама не пробовала создавать плагины, но читала разные статьи, где жаловались, что с kotlin-кодом надо всё контролировать.
Итого про kapt: производительность плохая, потерянная информация при генерации стабов, Java-компилятор.
В 2022 появился ksp. Он всё так же работает во время компиляции, но теперь там kotlin-компилятор и этап с генерацией стабов полностью уходит. И благодаря этому всё работает намного быстрее. Плюс, при написании своих плагинов многие проблемы решены и не нужно переживать, что какие-то данные потеряются. И это главные причины, почему все перешли или в процессе перехода с kapt на ksp.
Многие библиотеки уже поддержали ksp: Room, Moshi, Koin, Glide и прочие. Из печального: Dagger ещё не поддержал, но они работают над этим.
Кстати, в официальной документации уже советуют использовать ksp, а kapt находится только на поддержке: https://kotlinlang.org/docs/kapt.html
Дубль статей в телеграмме — https://t.me/android_junior
Мои заметки в телеграмме — https://t.me/android_junior_notes