При разработке и тестировании приложений порой требуется заглянуть под капот - проанализировать HTTP-трафик или проверить кэш данных в базе данных. Ранее для этих целей мы использовали Inspektify и Delight SQL Viewer. Но в какой-то момент нам понадобился еще и удобный доступ к логам приложения и тащить ещё одно отдельное решение не хотелось. Был нужен один инструмент, который объединит всё самое необходимое в одном месте. Так появился Kick — расширяемый модульный набор инструментов, позволяющий разработчикам и тестировщикам легко инспектировать приложение.
Преимущества Kick
Мультиплатформенность: библиотека написана на Kotlin Multiplatform с использованием Compose Multiplatform и работает на Android, iOS и Desktop-приложениях из общего кода. Один и тот же интерфейс отладки доступен на всех платформах.
Функционал из коробки: после интеграции Kick вы получаете встроенный в приложение просмотрщик, через который можно просматривать логи, отслеживать сетевой трафик (HTTP), изменять конфигурацию приложения (например, endpoint), инспектировать и редактировать SQLite-базы данных, просматривать файлы приложения и менять настройки Multiplatform Settings.
Полная модульность: функциональность разбита на независимые модули. Вы подключаете только те модули, которые нужны в вашем проекте. Не требуется тянуть за собой лишний код – например, можно включить только логи и сеть, если работа с базой данных не актуальна.
Расширяемость: Kick изначально спроектирован как расширяемая платформа. При необходимости вы даже можете добавлять собственные модули с вашей специфичной функциональностью.
Ярлыки для быстрого запуска: по умолчанию Kick автоматически добавляет ярлык запуска на иконку вашего приложения (Android и iOS) – при долгом тапе можно мгновенно открыть отладочный интерфейс. С ярлыками на Desktop сложнее, но вы легко можете вызвать окно Kick через собственную кнопку в интерфейсе или пункт меню.
Лёгкая интеграция: библиотека доступна в Maven Central, и для подключения достаточно добавить несколько зависимостей и вызвать инициализацию.
Безопасность для продакшена: вы можете полностью отключить Kick в релизных сборках. Для этого предусмотрены специальные модули-заглушки (stub). Достаточно подключить их вместо основной реализации или вообще не вызывать функции Kick в продакшене – и никакого отладочного функционала в боевом релизе не останется (как будто библиотеки нет).
Установка и подключение
Основой библиотеки являются модули main-core
и main-runtime
(или main-runtime-stub
для релиза), к которым подключаются необходимые вам функциональные модули.
Добавим зависимости в общий модуль KMM-проекта. Например, в файле Gradle shared/build.gradle.kts
пропишите нужные реализации:
val isRelease = /* логика определения режима release/debug */
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
implementation("ru.bartwell.kick:main-core:1.0.0") // общая часть Kick
if (isRelease) {
// В релизе подключаем no-op заглушки вместо полной реализации
implementation("ru.bartwell.kick:main-runtime-stub:1.0.0")
implementation("ru.bartwell.kick:logging-stub:1.0.0")
implementation("ru.bartwell.kick:ktor3-stub:1.0.0")
// ... другие stub-модули по необходимости
} else {
// В debug-сборке подключаем полноценные модули
implementation("ru.bartwell.kick:main-runtime:1.0.0")
implementation("ru.bartwell.kick:logging:1.0.0")
implementation("ru.bartwell.kick:ktor3:1.0.0")
// ... другие модули (SQLite, Settings, FileExplorer, и т.д.)
}
}
}
}
}
Как видно, для каждой части функциональности есть две версии артефакта – основная и stub. Stub-модули содержат пустые реализации, благодаря чему их подключение практически не влияет на размер и поведение приложения. В приведённом примере мы для простоты указали только модуль логов и сети; полный список модулей – в README репозитория.
Для iOS может также понадобиться экспортировать зависимости Kick во фреймворк.
Инициализация
Инициализация выполняется один раз при старте приложения – после этого инструментарий становится доступен. Основной метод – Kick.init(...)
: в него передаётся контекст и конфигурация со списком подключаемых модулей.
Поскольку для многих операций на Android требуется Context
, Kick реализует обёртку PlatformContext
. Библиотека предоставляет различные функции под все платформы для получения этой обертки:
В Compose – функция
platformContext()
В Android:
androidContext.toPlatformContext()
На Desktop и в iOS (Kotlin):
getPlatformContext()
В Swift:
PlatformContextKt.getPlatformContext()
.
Пример инициализации:
Kick.init(context) {
// включение/выключение ярлыка (по умолчанию true)
enableShortcut = true
// просмотр логов
module(LoggingModule(context))
// перехват HTTP (Ktor 3.x)
module(Ktor3Module(context))
// база SQLDelight
module(SqliteModule(SqlDelightWrapper(sqlDelightDriver)))
// или база Room
// module(SqliteModule(RoomWrapper(roomDatabase)))
// Multiplatform Settings
module(MultiplatformSettingsModule(listOf("My Awesome Settings" to settings)))
// проводник файловой системы
module(FileExplorerModule())
// дебажная конфигурация приложения (endpoint, опции для тестов и т.д.)
module(ConfigurationModule(context, configItems))
}
Модули
На данный момент в библиотеке доступно шесть модулей:

• Logging отображает список лог-сообщений приложения. По умолчанию можно добавлять сообщения через Kick.log(level, "сообщение")
. Кроме того, Kick легко интегрируется с популярным логгером Napier – нужно один раз настроить Napier, чтобы он пробрасывал все логи в Kick. Полезно, когда нет доступа к Logcat/Xcode.

• Ktor3 позволяет перехватывать и просматривать HTTP-запросы, выполняемые библиотекой Ktor 3.x. Необходимо установить специальный плагин KickKtor3Plugin
в ваш HttpClient
и все запросы/ответы будут видны в интерфейсе. Kick отображает список сетевых запросов с деталями (URL, метод, код ответа, время) и предоставляет подробности каждого запроса: заголовки, тело запроса и ответа.

• SQLite: модуль предоставляет удобный просмотр и редактирование данных в базе SQLite прямо на устройстве. Kick поддерживает две популярные библиотеки: SQLDelight и Room. Просто оберните ваш драйвер в соответствующий адаптер: SqlDelightWrapper(sqlDriver)
или RoomWrapper(roomDatabase)
и передать его в SqliteModule
. В UI можно просматривать список таблиц выбранной базы, открывать таблицы, видеть содержимое, редактировать, добавлять или удалять записи и даже выполнять произвольные SQL-запросы. Удобно при отладке: например, вы можете руками поправить записи для воспроизведения определенного сценария.

• Multiplatform Settings: модуль для работы с настройками, сохранёнными через библиотеку Multiplatform Settings от russhwolf. Kick умеет отображать несколько хранилищ сразу – вы сами передаёте список пар «название-хранилище» при инициализации модуля. В интерфейсе можно переключаться между ними и просматривать/редактировать ключи и значения. Поскольку Multiplatform Settings не предоставляет метаданные о типах, все значения показываются и редактируются как обычный текст. Тем не менее, даже в таком виде это полезно: можно в рантайме менять флаги, настройки приложения, не залезая в код. В будущем, если API Multiplatform Settings позволит получать информацию о типах, появится возможность улучшить UI (например, переключатели для Boolean, числовые поля для Int/Float и т.п.).

• Configuration предназначен для внутренних фиче-флагов и параметров отладки (по сути, готовая дебажная пасхалка). При инициализации модуля вы сами определяете, какие опции добавить. Это могут быть булевые флаги (включить/выключить фичу), числовые параметры (с указанием диапазона), строки (например, URL сервера) или выпадающие списки. Может пригодиться, если тестировщику нужно поменять endpoint или включить вывод отладочной информации где-то в интефейсе.

• File Explorer: модуль проводника файлов даёт возможность просматривать файловую систему вашего приложения. Вы можете «покопаться» во внутренних файлах прямо на устройстве: проверить, создался ли нужный файл, открыть кэш, убедиться, что записались верные данные, и т.д.
Итог
Kick объединяет в себе сразу несколько отладочных инструментов, облегчая жизнь разработчикам и тестировщикам Kotlin Multiplatform проектов. Вместо того чтобы использовать отдельные решения для логов, сети, базы данных и прочего, вы получаете единую панель управления, встроенную в приложение. При этом библиотека остаётся гибкой: вы подключаете только нужные компоненты и легко отключаете её в продакшен-сборках (заглушками или условной инициализацией). Для команды это означает меньше рутины и больше прозрачности при отладке: все важные данные и настройки – как на ладони.
Библиотека Kick распространяется бесплатно и открыто (лицензия Apache 2.0), исходники доступны на GitHub. Переходите в репозиторий, пробуйте в деле и делитесь обратной связью!
Ссылка на репозиторий: https://github.com/bartwell/kick
Буду рад вашим вопросам, фидбэку и идеям по новым модулям.
Удачной отладки!