Как кодогенерация в Hilt и Koin влияет на сборку
Что проверяют
Понимаете ли вы, где каждая библиотека платит за внедрение зависимостей: Hilt на этапе сборки, Koin в рантайме. Следом обычно спрашивают, как ускоряли сборку многомодульного проекта с Hilt и как ловить ошибки графа в Koin до релиза.
Как отвечать
Hilt построен поверх Dagger и генерирует код обработчиком аннотаций. Раньше это был только kapt, сейчас Dagger и Hilt поддерживают KSP, и переход на него заметно сокращает сборку: kapt генерирует Java-заглушки для Kotlin-кода модуля и находится в режиме поддержки. Что стоит назвать:
- проверка графа при компиляции: пропущенная привязка или цикл ломают сборку, а не приложение у пользователя;
- агрегация в app-модуле: корневой компонент собирается там, где
@HiltAndroidApp, поэтому правка@InstallIn-модуля в фиче-модуле затрагивает и app; - Gradle-плагин Hilt: переписывает байткод, чтобы классы с
@AndroidEntryPointнаследовались от сгенерированныхHilt_*, это ещё один шаг сборки; - рантайм: сгенерированные фабрики без рефлексии, накладные расходы при старте минимальны.
Koin в классическом виде кодогенерацию не использует. Модули описываются Kotlin DSL, регистрируются при startKoin и разрешаются по типу в рантайме. Сборка от этого не тяжелеет, зато ошибка в графе проявится падением при первом обращении. Закрывают это тестом: verify() из koin-test проверяет модули в обычном юнит-тесте. Если подключён Koin Annotations, кодогенерация через KSP появляется и у Koin.
Хороший вывод: разница в скорости работы приложения обычно невелика и подтверждается замерами Macrobenchmark, а разница в скорости и надёжности сборки реальна, её смотрят в Build Analyzer или build scan.
Где спотыкаются
Говорят, что Hilt замедляет приложение из-за кодогенерации. Всё наоборот: генерация стоит времени сборки, а в рантайме работают обычные фабрики.
Утверждают, что Koin «вообще без генерации и без проблем». Без тестов графа ошибки уходят в прод, а с Koin Annotations KSP всё равно участвует в сборке.
Не знают разницы между kapt и KSP и жалуются на медленную сборку, не попробовав миграцию и не включив кэш сборки Gradle.