
Привет! Меня зовут Антон, я ведущий разработчик мобильных приложений в Ozon Tech.
Наверное, почти у каждого происходит стечение обстоятельств, которые подталкивают нас что-то сделать своё. Иногда это стол из слэба, а случается в жизни и собственный плагин. У меня было второе, и вот моя история…
Я долго работал на Android View, но жизнь безапелляционно мотивировала меня перейти к дизайн-системам на Jetpack Compose. Мне стало не хватать некоторых фич Android Studio, которые были доступны только в Android View.
«РАБОТАЕТ!» — такая громкая мысль прозвучала у меня в голове, когда всё получилось. Надеюсь, соседи этого не слышали.
Плагин для Android Studio был готов! Он был призван в этот мир для улучшения поддержки кастомных дизайн-систем на Jetpack Compose в Android Studio.
Здесь, возможно, для иллюстрации этой сцены хорошо бы прозвучал смех сумасшедшего, но очень радостного учёного. Давайте мысленно проиграем этот джингл.
Он был назван Kelp. Строго и лаконично. Мы сразу договорились, что без панибратства.
А теперь позвольте с гордостью и небольшим апломбом создателя рассказать о своём творении.
TLDR; Kelp на GitHub
Kelp предлагает широкий набор функций, которые делают разработку UI быстрее и проще.
После перехода с дизайн-систем, построенных на Android View, к дизайн-системам на Jetpack Compose я заметил, что мне не хватает некоторых фич Android Studio, которые были доступны только в Android View.
Чтобы исправить эту ситуацию, я разработал Kelp — мощный плагин для Android Studio, разработанный для улучшения поддержки кастомных дизайн-систем на Jetpack Compose в Android Studio. Kelp предлагает широкий набор функций, которые делают разработку UI быстрее и проще.
Ключевые особенности
🔧 Настраиваемые иконки для компонентных функций
Kelp позволяет устанавливать кастомные иконки для composable-функций компонентов вашей дизайн-системы. Эти иконки отображаются в выпадающем списке code completion аналогично тому, как отображаются ресурсы R.drawable
. Эта декорация помогает легче идентифицировать и использовать компоненты последовательно по всему проекту.

🎨 Иконки дизайн-системы
С помощью Kelp иконки вашей дизайн-системы отображаются в выпадающем списке code completion и сбоку от строк кода (gutter) так же, как и нативные ресурсы Android drawable. Эта функция позволяет быстро находить и использовать нужные иконки, не отвлекаясь от кода.

🌈 Предпросмотр цветов
Kelp оживляет цветовую палитру вашей дизайн-системы, показывая превью цветов в выпадающем списке code completion и в gutter. Эта функция аналогична нативным ресурсам R.color
, предоставляя мгновенный визуальный ориентир, который упрощает применение правильных цветов.

📱 Интеграция демоприложения
Установка и переход к демоприложению, демонстрирующему компоненты вашей дизайн-системы, становится сильно проще. Kelp автоматизирует скачивание и установку APK (соответствующей той версии дизайн-системы, которая подключена к проекту) и предоставляет Intention Action (⌥
+↵
) и иконку в gutter для открытия конкретных страниц компонентов прямо из вашего кода.


🖼️ Рендеринг изображений в KDoc
Ещё одна крутая фича Kelp — возможность рендерить изображения в KDoc, несмотря на текущие ограничения Android Studio. Эта функция сильно прокачивает вашу документацию, позволяя добавлять картинки компонентов ДС в KDoc, что способствует их лучшему поиску, пониманию и использованию.

⌨️ Шаблоны кода (Live Templates)
Ускорьте написание кода с помощью настраиваемых шаблонов кода. Эти шаблоны могут быть адаптированы для включения часто используемых фрагментов кода вашей дизайн-системы, автоматически вызывая окно code completion для ускорения разработки.

А теперь к настройкам…
Kelp очень конфигурируемый. Изменяя файл config.json
, вы можете адаптировать плагин под уникальные нужды вашего проекта. Эта конфигурация на основе JSON поддерживает детальную настройку — от префиксов функций для подсветки компонентов до параметров отображения цветов и иконок.
Кроме того, так как это файл, его можно хранить в Git и делиться им с командой, обеспечивая консистентность и устраняя необходимость каждому разработчику вручную настраивать плагин через интерфейс настроек Android Studio.
Вот полный конфигурационный файл с комментариями (более актуальную версию см. на GitHub):
{
// If you want to disable some of these features, just don't include
// their sections to your json file.
// Replacing the default icon of design system components
// in the code completion with a customizable icon
// Custom icon MUST be
// 1. an svg
// 2. with size — 40x40
// 3. placed here: /.idea/kelp/dsComponentFunIcon.svg
// 4. optionally, a dark version can be added:
// /.idea/kelp/dsComponentFunIcon_dark.svg
"componentFunHighlighting": {
// custom icon will be added to all functions in this package
"functionFqnPrefix": "com.your.designsystem.package.components.",
"functionSimpleNamePrefix": "Ds" // optional
},
// Rendering design system colors in the code completion and
// gutter (where breakpoints are).
// Like with regular Android resources.
"colorPreview": {
"codeCompletionEnabled": true,
"gutterEnabled": true,
// optional, color tokens from enum class
"enumColorTokensEnabled": true,
},
// Rendering design system icons in the code completion and
// gutter (where breakpoints are).
// Like with regular Android resources.
"iconsRendering": {
"codeCompletionEnabled": true,
"gutterEnabled": true,
// class with a lot of properties that return icons and are
// named as icons
"containerClassName": "com.your.designsystem.package.DsIcons",
// optional: filters out properties that do not represent an icon
"propertyNameFilter": {
// optional: only properties with this prefix will be considered
// as an icon
"startsWith": ["ic_"],
// optional: all properties with this prefix will be skipped
"doesNotStartWith": ["allIconsAsList", "otherProperty"]
},
// maps property names to drawable resource names
"propertyToResourceMapper": {
"addPrefix": "ic_", // optional
"convertToSnakeCase": true // optional; e.g. "AddAccount" -> "add_account"
}
},
// Opening the component page in the demo app via an Intention Action
"demoApp": {
// optional: custom name of the intention action
"intentionName": "🚀 Open in MY CUSTOM design system demo app",
"functionFqnPrefix": "com.your.designsystem.package.components.",
"functionSimpleNamePrefix": "Ds", // optional
// package name of the demo app
"appPackageName": "com.your.designsystem.package.demo",
// deeplink that will be used to open a component page in the demo app.
// DS_COMPONENT_FQN_DEEPLINK_PLACEHOLDER will be replaced with
// the fully qualified name of the
// composable function, e.g. com.your.designsystem.package.components.Badge
"componentDeeplink": "yourscheme://component/DS_COMPONENT_FQN_DEEPLINK_PLACEHOLDER",
// optional
// Installing (if not installed) the apk file
// of the demo app (showcase app) on an Android device.
// Demo app apk must be placed here with
// this name: /.idea/kelp/demoApp-VERSION_NAME.apk
// For example: /.idea/kelp/demoApp-0.12.0.apk
// The plugin will acquire the latest version
// from the apk file name (for example, 0.12.0).
// If the app is not installed OR installed, but has a lower
// version, the plugin will install the apk on the device.
"apkInstallation": true,
// optional
// if apkInstallation == true, and there is no apk file found, launches this gradle command.
// If you use Kelp Gradle Plugin, value must be "kelpCheckDemoAppApk"
"apkDownloadGradleCommand": "kelpCheckDemoAppApk"
},
// Installs live templates into the IDE.
// Useful for writing frequent code, like "MaterialTheme.colors." in
// just 3 keystrokes.
// After completion, opens code completion
// in place of $CODE_COMPLETION$, saving even more effort.
"liveTemplates": [
{
"abbreviation": "dt",
"text": "com.your.designsystem.DsTheme.$CODE_COMPLETION$",
"description": "Writes \"DsTheme.\"",
"variables": [{ "name": "CODE_COMPLETION", "expression": "complete()" }]
},
{
"abbreviation": "dtc",
"text": "com.your.designsystem.DsTheme.colors.$CODE_COMPLETION$",
"description": "Writes \"DsTheme.colors.\"",
"variables": [{ "name": "CODE_COMPLETION", "expression": "complete()" }]
},
{
"abbreviation": "dtt",
"text": "com.your.designsystem.DsTheme.typography.$CODE_COMPLETION$",
"description": "Writes \"DsTheme.typography.\"",
"variables": [{ "name": "CODE_COMPLETION", "expression": "complete()" }]
},
{
"abbreviation": "dti",
"text": "com.your.designsystem.DsTheme.icons.$CODE_COMPLETION$",
"description": "Writes \"DsTheme.icons.\"",
"variables": [{ "name": "CODE_COMPLETION", "expression": "complete()" }]
},
{
"abbreviation": "rmso",
"text": "$VAL_TYPE$ $NAME$ by androidx.compose.runtime.remember { androidx.compose.runtime.mutableStateOf($VALUE$) }",
"description": "Creates mutableStateOf",
"reformat": true,
"variables": [
{ "name": "VAL_TYPE", "expression": "enum(\"var\", \"val\")" },
{ "name": "NAME" },
{ "name": "VALUE", "expression": "enum(\"false\", \"null\", \"0\", \"0f\")" }
],
"context": ["KOTLIN_CLASS", "KOTLIN_STATEMENT", "KOTLIN_TOPLEVEL"]
}
]
}
Рекомендации по установке, если вы решились попробовать Kelp.
🛠️Инструкция по установке находится здесь.
🐘 Gradle Plugin
В дополнение к IDE-плагину вы можете дополнительно использовать сопутствующий gradle-плагин. Он имеет 2 функции/gradle tasks:
kelpCheckIdePluginPresence
— уведомляет разработчика, если плагин Kelp IDE отсутствует или имеет неправильную версию. Может привести к build fail или вывести предупреждение в консоль;kelpCheckDemoAppApk
— проверяет наличие и версию apk-файла демоприложения дизайн-системы. Загружает его при необходимости.
Вы можете включить/отключить эти функции независимо.
⚙️ Конфигурация
// в build.gradle.kts модуля приложения, который разработчики часто компилируют для запуска приложения
plugins {
id("ru.ozon.kelp") version "0.0.4"
}
kelp {
idePluginAbsenceBehaviour = IdePluginAbsenceBehaviour.WARNING // NOTHING, WARNING, BUILD_FAIL
requiredIdePluginVersion = "1.0.0"
requiredDemoApkVersion = "1.3.0" // libs.versions.yourDesignSystem.get()
// Если файл apk можно скачать без необходимости входа через веб-браузер, используйте SimpleApkDownloader:
setApkDownloader(
SimpleApkDownloader(
additionalErrorMsg = "Убедитесь, что корпоративный VPN включен", // опционально
urlProvider = { version -> "https://example.com/demo-$version.apk" },
),
)
// В других случаях, когда требуются ручные действия с браузером, используйте BrowserApkDownloader:
setApkDownloader(BrowserApkDownloader { version -> "https://example.com/?query=android/$version" })
// Это сделает следующее:
// 1. Откроет указанный URL в браузере
// 2. Попросит пользователя скачать apk
// 3. Будет отслеживать появление нового файла ".apk" в папке загрузок
// 4. Скопирует его в [destinationDir] с именем [fileName].
// Вы также можете реализовать полностью кастомный ApkDownloader:
setApkDownloader(ApkDownloader { version, destinationDir, fileName, logger ->
// ...
file("ваш apk файл").copyTo(destinationDir.resolve(fileName))
})
}
🚚 Как выбрать способ распространения apk демоприложения? Задаём себе вопросы.

1️⃣ Находится ли ваша дизайн-система в отдельном репозитории? Если нет, то установка демоприложения на данный момент не поддерживается.
Можно сделать следующее:
включить gradle-модуль демоприложения в debug-сборку вашего приложения. В этом случае Kelp просто откроет deeplink в ваше приложение;
надеяться, что разработчики установят демоприложение вручную.
2️⃣ Сколько клиентов используют библиотеку вашей дизайн-системы?
Если есть только один пользователь, и команда дизайн-системы ответственна за обновление версий в репозитории клиента, вы можете добавить последний apk демоприложения в git (возможно, используя git lfs) и обновлять его с новой версией при каждом изменении версии библиотеки. Таким образом, у всех будет актуальный apk-файл в каталоге
/.idea/kelp/apk
.Если у вас много клиентов, и они обновляют версию библиотеки самостоятельно, вы можете порекомендовать им интегрировать Kelp Gradle Plugin и настроить его с использованием
SimpleApkDownloader
илиBrowserApkDownloader
.
3️⃣ Насколько просто скачать apk демоприложения?
Рекомендую публиковать apk-файл демоприложения вместе с .aar-файлом библиотеки дизайн-системы в maven
В этом случае можно использовать
SimpleApkDownloader
.
Если apk демоприложения можно скачать по прямой ссылке (возможно, доступной только через корпоративный VPN), вы можете использовать
SimpleApkDownloader
и не добавлять apk в git. Это обеспечит автоматическую загрузку последнего apk демоприложения для всех разработчиков, работающих над проектами, которые зависят от вашей дизайн-системы.В противном случае, если для загрузки apk требуются ручные действия через браузер, используйте
BrowserApkDownloader
и добавьте apk в git.
Когда владелец проекта выполнит обновление версии дизайн-системы и соберёт приложение, Kelp Gradle Plugin обнаружит несовпадение между старой версией apk демоприложения и новой версией дизайн-системы.
Плагин откроет браузер и попросит владельца проекта скачать apk. Плагин автоматически обнаружит его появление в папке Downloads, переименует и скопирует его в проект.
Наконец, владелец проекта закоммитит изменения версии вместе с новым apk в git.
В этом случае BrowserApkDownloader упрощает задачу обновления дизайн-системы до новой версии. Владелец проекта больше не должен обращаться к документации дизайн-системы для получения ссылки на скачивание apk и ручного размещения apk в проекте.
🚀 Повышайте эффективность разработки
Kelp существенно повышает удовольствие от взаимодействия с дизайн-системой внутри Android Studio. Предоставляя визуальные подсказки и удобный доступ к ресурсам ДС прямо в IDE, он сокращает время поиска нужных компонентов.
Kelp помогает добиться консистентности, улучшает читаемость кода и в конечном итоге позволяет быстрее создавать качественные продукты.
Более подробная информация и примеры конфигурации —Kelp на GitHub.
Если вам нравится Kelp, я буду признателен за ⭐️ на GitHub!
Удачной разработки! 👋