Search
Write a publication
Pull to refresh

Kick: Kotlin Inspection & Control Kit — единый модульный инструмент отладки прямо в приложении

Level of difficultyEasy
Reading time6 min
Views177

При разработке и тестировании приложений порой требуется заглянуть под капот - проанализировать 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
Logging

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

Ktor3
Ktor3

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

SQLite
SQLite

• 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

Буду рад вашим вопросам, фидбэку и идеям по новым модулям.
Удачной отладки!

Tags:
Hubs:
0
Comments0

Articles