Kapt (инструмент обработки аннотаций Kotlin) позволяет использовать процессоры аннотаций Java с кодом Kotlin, даже если эти процессоры не имеют специальной поддержки Kotlin. Это делается путем создания заглушек Java из ваших файлов Kotlin, которые затем могут прочитать процессоры. Генерация заглушки является дорогостоящей операцией и оказывает существенное влияние на скорость сборки.
KSP (Kotlin Symbol Processing) — это первая альтернатива kapt, основанная на Kotlin. KSP анализирует код Kotlin напрямую, что происходит в 2 раза быстрее . Он также лучше понимает языковые конструкции Kotlin.
Kapt сейчас находится в режиме обслуживания, и мы рекомендуем по возможности перейти с kapt на KSP. В большинстве случаев эта миграция требует только изменений в конфигурации сборки вашего проекта.
Вы можете запускать kapt и KSP вместе в своем проекте во время миграции, и миграция может выполняться модуль за модулем, библиотека за библиотекой.
Вот обзор этапов миграции:
- Проверьте библиотеки, которые вы используете для поддержки KSP.
- Добавьте плагин KSP в свой проект
- Замените обработчики аннотаций на KSP
- Удалить плагин kapt
Проверьте библиотеки, которые вы используете для поддержки KSP.
Для начала проверьте, поддерживают ли уже библиотеки, которые вы используете с kapt, KSP. Так обстоит дело со многими популярными библиотеками (включая Dagger , Glide , Room и Moshi ), а другие добавляют поддержку.
Вы можете проверить список поддерживаемых библиотек в документации или обратиться к документации и системе отслеживания проблем библиотек, которые вы используете.
Добавьте плагин KSP в свой проект
Сначала объявите плагин KSP в файле build.gradle.kts
верхнего уровня. Убедитесь, что вы выбрали версию KSP, соответствующую версии Kotlin вашего проекта. Список релизов вы можете найти на странице KSP GitHub .
Котлин
plugins { id("com.google.devtools.ksp") version "1.8.10-1.0.9" apply false }
классный
plugins { id 'com.google.devtools.ksp' version '1.8.10-1.0.9' apply false }
Затем включите KSP в файле build.gradle.kts
на уровне модуля:
Котлин
plugins { id("com.google.devtools.ksp") }
классный
plugins { id 'com.google.devtools.ksp' }
Замените обработчики аннотаций на KSP
Включив KSP, вы можете начать заменять использование kapt на KSP. Для подавляющего большинства библиотек это просто требует замены kapt на ksp в объявлении зависимости, поскольку они поставляют свой процессор аннотаций и процессор KSP в одном и том же артефакте.
Котлин
dependencies {kapt("androidx.room:room-compiler:2.5.0")ksp("androidx.room:room-compiler:2.5.0") }
классный
dependencies {kapt 'androidx.room:room-compiler:2.5.0'ksp 'androidx.room:room-compiler:2.5.0' }
После перехода на KSP синхронизируйте и соберите свой проект, чтобы проверить, работает ли он по-прежнему правильно.
Некоторые распространенные проблемы, на которые следует обратить внимание:
- Некоторые библиотеки не поддерживают тот же набор функций, что и kapt и KSP. Если ваш код не работает после миграции, проверьте документацию библиотеки.
- KSP имеет более точную информацию о типе Kotlin, чем kapt (например, о допустимости значений NULL), что означает, что процессоры KSP могут более точно определять требования к типам. Помимо обновления файлов сборки, это может потребовать некоторых исправлений в исходном коде.
- Если вы ранее передавали аргументы обработчику аннотаций, вам, вероятно, придется передать эти аргументы KSP сейчас. Обратите внимание, что формат аргументов может отличаться в зависимости от kapt и KSP. См. документацию KSP и обратитесь к документации библиотеки, которую вы используете, чтобы узнать больше.
Удалить плагин kapt
Если в вашем модуле больше нет зависимостей, включенных в kapt
, удалите плагин kapt.
Если он был объявлен в блоке плагинов:
Котлин
plugins {id("org.jetbrains.kotlin.kapt")}
классный
plugins {id 'org.jetbrains.kotlin.kapt'}
Если он использовал синтаксис плагина Apply с использованием Groovy:
apply plugin: 'kotlin-kapt'
Вам также следует удалить все оставшиеся конфигурации, связанные с kapt, например:
Котлин
kapt { correctErrorTypes = true useBuildCache = true }
классный
kapt { correctErrorTypes true useBuildCache true }