Вступление
Привет! У каждого есть свои подходы в разработке фич, чаще всего, при реализации нового экрана, приходиться копировать код из одного модуля в другой и форматировать его под свои нужды. Ну например создавать классы: ProfileFragment, ProfileViewModel, ProfileDependencies и так далее в этом духе. Хотелось бы избавиться от этой рутины и чтобы все базовые классы, за нас генерил плагин.
Уже существую готовые решения, т.е можно взять плагин и его настроить под нужды своей архитектуры, например тут: https://github.com/hhru/android-multimodule-plugin/tree/master/plugins/hh-geminio Но это статья не об этом, здесь я хочу дать обзорную, вводную часть, как вообще писать собственные плагины и уделить внимание подводным камням.
Шаг #1. С чего начать?
Начать стоит сразу с написания своего первого простого плагина, чтобы вообще понять суть, как что работает.
- Плагины для Android Studio пишутся в IntelliJ IDEA, на языке Kotlin.
- Важно вести разработку в IntelliJ IDEA в версии совместимой с версией Android Studio, тут можно посмотреть соответствия: https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html
- Есть две версии:
- IntelliJ IDEA Ultimate - платная, из коробки сразу можно разрабатывать плагины.
- IntelliJ IDEA Community Edition - бесплатная, чтобы начать разрабатывать плагины, нужны из Marketplace установить плагин Plugin DevKit: https://plugins.jetbrains.com/plugin/22851-plugin-devkit
- Скачать нужную версию IntelliJ IDEA, можно тут: https://www.jetbrains.com/idea/download/other.html
- Далее, можно воспользоваться готовым шаблоном на GitHub для написание плагинов: https://github.com/JetBrains/intellij-platform-plugin-template, шаблон обновляется и актуализируется, там же есть вся инструкция, как это запустить.
- Или прям в IntelliJ IDEA

- Следующий шаг, настроить Build Gradle Script так, чтобы мы разрабатывали плагин именно под Android Studio, так как есть разные IDE от JetBrains, и разработка там, чуть отличается. Как это сделать, описано тут: https://plugins.jetbrains.com/docs/intellij/android-studio.html#gradle-build-script
- После этой настройки, вы уже можете в самой IDE запустить свой плагин(например с помощью команды
gradle runIde
), естественно он не будет содержать никакой логики, просто откроет новый инстанс Android Studio, где уже будет предустановлен разрабатываемый вам плагин. Так же еще бы добавил, если вы из России, то могут возникнуть проблемы со скачиванием зависимостей,
Шаг #2. Пишем первый простой плагин
У вас теперь есть готовый шаблон, можно начать писать код вашего первого плагина, самым простым решением будет создание собственного AnAction
. Есть простенькая статья с описанием, как это можно сделать: https://medium.com/simform-engineering/get-started-with-android-studio-plugin-development-50971c1ef737. Важно! В этой статье используется Gradle IntelliJ Plugin (1.x)
, он уже считается устаревшим и лучше использовать IntelliJ Platform Gradle Plugin (2.x)
, как мигрировать на 2 версию, есть тут инструкция: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-migration.html#intellij-extension
Так же подробнее про AnAction
стоит почитать вот тут: https://plugins.jetbrains.com/docs/intellij/basic-action-system.html
Шаг #3. Датальнее изучаем информацию
Конечно, можно этот шаг пропустить, но если вы ходите быстро и эффективно решать проблемы, с которыми сталкиваетесь на пути написания своего плагина, настоятельно рекомендую ознакомиться со статьями и видосами ниже:
- Еще раз освежить память и зафиксироваться, как создавать плагины: https://medium.com/kuos-funhouse/creating-a-plugin-for-android-studio-a-complete-walkthrough-47a154aacb7a
- Простенькая статья, которая описывает основной подход по генерации шаблонного кода: https://habr.com/ru/companies/alfa/articles/799873/
- Видео с Mobius, с основными подходами к реализации плагинов, оно 2020 года, что-то может быть уже не актуальным, но основная база полезна будет в ознакомлении: https://www.youtube.com/watch?v=QKervhpICjk
- В целом еще хочу добавить, что на просторах интернета, можно не найти какие-то не популярные кейсы в разработке плагинов, в этом случае выручает исходный код Android плагина(он opensource), который можно изучить и сделать свой плагин, как в общем то было и у меня. Исходный код тут: https://github.com/JetBrains/android
Шаг #4. Пишем плагин
Я хотел добавить возможность создания шаблонного кода, именно через меню создание модуля, как на скрине ниже:

Первым делом, нужно настроить build.gradle.kts
, у меня такие настройки:
plugins {
id("java")
id("org.jetbrains.kotlin.jvm") version "1.9.25"
id("org.jetbrains.intellij.platform") version "2.3.0"
}
group = "ru.shalkoff.android"
version = "0.0.1"
repositories {
mavenCentral()
intellijPlatform {
defaultRepositories()
}
}
dependencies {
intellijPlatform {
androidStudio("2024.2.2.13") // Ladybug Feature Drop 2024.2.2 (242)
bundledPlugin("org.jetbrains.android")
}
}
tasks {
// Set the JVM compatibility versions
withType<JavaCompile> {
sourceCompatibility = "21"
targetCompatibility = "21"
}
withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "21"
}
patchPluginXml {
sinceBuild.set("242")
untilBuild.set("243.*")
}
signPlugin {
certificateChain.set(System.getenv("CERTIFICATE_CHAIN"))
privateKey.set(System.getenv("PRIVATE_KEY"))
password.set(System.getenv("PRIVATE_KEY_PASSWORD"))
}
publishPlugin {
token.set(System.getenv("PUBLISH_TOKEN"))
}
}
Далее настраиваем plugin.xml
<idea-plugin>
<id>ru.shalkoff.android.CodeGenerator</id>
<name>CodeGenerator</name>
<vendor email="[email protected]" url="https://shalkoff.ru">Shalkov</vendor>
<depends>com.intellij.modules.platform</depends>
<depends>org.jetbrains.android</depends>
<depends>com.intellij.modules.androidstudio</depends>
<extensions defaultExtensionNs="com.intellij">
</extensions>
<extensions defaultExtensionNs="com.android">
<moduleDescriptionProvider
implementation="ru.shalkoff.android.codegenerator.module.AndroidModuleDescriptionProvider"/>
</extensions>
</idea-plugin>
Важным тут является extensions defaultExtensionNs="com.android"
иммено благодаря этому, мы добавляем в меню свой собственный пункт.
Следующим шагом, нужно реализовать сам класс AndroidModuleDescriptionProvider
, он может выглядеть так:
class AndroidModuleDescriptionProvider : ModuleDescriptionProvider {
override fun getDescriptions(project: Project): Collection<ModuleGalleryEntry> {
return listOf(AndroidModuleGalleryEntry())
}
}
В целом, на этом реализация не заканчивается и просто копировать код и github я бы не хотел, поэтому приглашаю детально ознакомиться с плагином, вот здесь:
На что хочу обратить внимание, так это на то, что я всё делал по образу и подобию того, что уже реализовано, вот например класс: ConfigureAndroidModuleStep
, в нём описывается весь UI: https://github.com/JetBrains/android/blob/master/android-npw/src/com/android/tools/idea/npw/module/ConfigureAndroidModuleStep.kt. В моём плагине, есть аналогичный класс AndroidConfigureModuleStep
, но реализован он так, как нужно именно мне. Таким образом, можно понять суть разработки плагинов, просто изучая исходный код. На мой взгляд, это самый хороший способ на начальных этапах понять, как лучше разрабатывать плагины и каких подходов придерживаться.
Заключение
Спасибо, что уделили время и прочитали мою статью, надеюсь она вам помогла понять базовые основы разработки плагинов, увидимся в других статьях.