Вступление
Плагины для продуктов JetBrains, включая Android Studio, позволяют расширять функциональность IDE, улучшая процесс написания, отладки и тестирования кода. Они помогают автоматизировать рутинные задачи, интегрировать сторонние инструменты и адаптировать среду под индивидуальные потребности разработчика. В этой статье мы рассмотрим, как плагины упрощают работу в Android Studio, ускоряют разработку и делают процесс кодинга более продуктивным.
Так, например, можно написать плагин для автоматического форматирования и инспекции кода, для генерации шаблонов, таких как геттеры, сеттеры, шаблоны классов и XML‑разметки и тд. Возможностей и идей много, много всего уже реализовано, но не все уже созданное может подойти именно под ваши задачи и стиль кода, так что имеет смысл уметь писать собственные плагины.
Плагин — программный модуль, добавляющий или расширяющий функции основного приложения.
Установка IDE
Первое, что стоит отметить, — Android Studio построена на основе IntelliJ IDEA и адаптирована компанией Google для разработки Android‑приложений. По сути, IntelliJ IDEA является универсальной платформой, предоставляющей базу для Android Studio, а также обладающей более широкими возможностями для создания различных типов проектов. Это означает, что проекты, созданные в IntelliJ IDEA, могут быть перенесены и использованы в Android Studio без значительных изменений, поэтому писать плагин мы будем именно в нем. Но настроить IDE все равно придется.
Нам понадобится IntelliJ IDEA Community Edition, но важно, чтобы версия IntelliJ IDEA совпадала с версией Android Studio. Это необходимо для обеспечения совместимости плагинов, библиотек и функционала между обеими средами разработки. Несоответствие версий может привести к проблемам с открытием проектов, работой инструментов или корректным отображением настроек Android Studio в IntelliJ IDEA.
Посмотреть версию Android Studio можно во вкладке Help → About. Точно таким же образом можно посмотреть версию любых других продуктов JetBrains
Нам важно, чтобы совпадали первые 3 цифры номера. Найти и скачать версию, подходящую под вашу Android Studio можно здесь. Установка самая стандартная, ее можете настраивать как вам нравится ;)
Создание проекта
Вот мы установили IDE, что же делать дальше? А дальше нужно создавать сам плагин, но для этого придется установить... плагин...
Заходим в настройки
Ищем раздел Plugins
В нем находим плагин Plugin DevKit
Устанавливаем его
Может потребоваться перезапуск IDE
Установка DevKit нам нужна была для того, чтобы при создании нового проекта у нас появился вот такой генератор IDE Plugin
В целом, здесь самая стандартная настройка проекта, изменить может потребоваться только имя проекта и версию JDK,
Настройка проекта
После создания проекта вам сразу откроется файл build.gradle.kts
. В нем нам потребуется внести несколько изменений. В разделе intellij меняем код таким образом:
intellij {
version.set("241.19072.14.2412.12360217")
type.set("AI") // Target IDE Platform
plugins.set(listOf("Kotlin", "android"))
}
version.set(...)
— устанавливает версию платформы, для которой разрабатывается плагин. Плагины лучше всегда указывать явно, т.к. в таргетной IDE может отсутствовать встроенная поддержка какого-то плагина. Также не забывайте про правильный регистр в имени;type.set(...)
— определяет целевую IDE;plugins.set(...)
— cписок плагинов, от которых зависит ваш плагин.
Примечание по поводу версии
Во многих туториалах я видела, что ставили конкретно версию (2020.1.4, 2024.1.2...), а не номер сборки (как показано в примере). При таком способе у меня просто не компилировался Gradle, так что рекомендую писать именно версию сборки.
Остановимся поподробнее на типах IDE. Поддерживается создание плагинов для следующих платформ:
AI |
Android Studio |
IC |
IntelliJ IDEA Community Edition |
IU |
IntelliJ IDEA Ultimate Edition |
CL |
CLion |
GW |
Gateway |
GO |
GoLand |
PS |
PhpStorm |
PY |
PyCharm Professional Edition |
PC |
PyCharm Community Edition |
RD |
Rider |
RR |
ReSharper |
FLIJ |
Fleet IntelliJ |
Далее переходим к разделу tasks. В нем нам необходимо создать подраздел runIde и прописать путь до build.txt файла целевой IDE. Из этого же файла при его открытии можно скопировать версию сборки IDE.
Путь для Windows
Найти папку нужной IDE можно в директории "C:\Program Files\..."
Путь для Linux
Если у вас стоит Linux, то вот пример пути для Android Studio "/Applications/Android Studio.app/Contens"
tasks {
buildSearchableOptions {
enabled = false
}
runIde {
// Absolute path to the installed targetIDE to use as IDE Development
// IDE Development Instance (the "Contents" directory is macOS specific):
ideDir.set(file("C:/Program Files/Android/Android Studio"))
}
//остальные подразделы
}
Вы можете заметить, что в примере добавлена еще настройка buildSearchableOptions. Эта задача генерирует файл searchableOptions.xml
, который содержит настройки поиска для элементов UI плагина. Пока что мы не будем писать UI плагина, так что отключаем его. Если вы не вставите этот подраздел и при этом не добавите интерфейс плагину — IntelliJ при сборке выдаст ошибку.
Целиком файл build.gradle.kts
выглядит так:
plugins {
id("java")
id("org.jetbrains.kotlin.jvm") version "1.9.23"
id("org.jetbrains.intellij") version "1.17.3"
}
group = "com.example"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
// Configure Gradle IntelliJ Plugin
// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html
intellij {
version.set("241.19072.14.2412.12360217")
type.set("AI") // Target IDE Platform
plugins.set(listOf("Kotlin", "android"))
}
tasks {
buildSearchableOptions {
enabled = false
}
runIde {
// Absolute path to installed target 3.5 Android Studio to use as
// IDE Development Instance (the "Contents" directory is macOS specific):
ideDir.set(file("C:/Program Files/Android/Android Studio"))
}
// Set the JVM compatibility versions
withType<JavaCompile> {
sourceCompatibility = "17"
targetCompatibility = "17"
}
withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "17"
}
patchPluginXml {
sinceBuild.set("232")
untilBuild.set("242.*")
}
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"))
}
}
Для Android Studio мне не удалось найти способа сразу тестировать плагин. Поэтому каждый раз для тестирования придется собирать плагин, переходить в Android Studio и добавлять/обновлять плагин из локального хранилища. Для этого переходим в Gradle → Tasks → Build и нажимаем build. Собранный плагин будет храниться по пути C:\Users\User\IdeaProjects\NameProject\build\libs
Для других платформ
Для тестирования плагинов для других платформ (IC, IU...) можно просто запустить плагин нажав на Run, таргетная IDE сама откроется с пустым проектом (который от тестирования к тестированию будет сохранять изменения, которые вы в него внесли). Запуск плагина может занять некоторое время.
Создание плагина
Первое, куда нам следует зайти — в файл plagin.xml
. Это конфигурационный файл, предоставляющий таргетной IDE информацию об плагине, такую как навазние, автор, поддерживаемые модули и тд. Подробнее о структуре и тэгах файла plugin.xml
можно ознакомиться в официальной документации и вообще, там много интересного;). Мы пройдемся по основным.
|
Название плагина, которое будет отображаться в списке плагинов |
|
Автор и контакты |
|
Описание плагина, которое будет отображаться на странице плагина в JetBrains Marketplace и в окне управления плагинами в IDE |
|
Совместимость с продуктами JetBrains. Документация. Конкретно для Android Studio понадобятся следующие модули: — |
|
Этот блок определяет действия, которые плагин добавляет в интерфейс IDE |
Остановимся подробнее на <actions>
. Необходимо определить группу действий с идентификатором с помощью тэга <group>
. Внутри мы уже определяем само действие (имя класса, который реализует действие). <add-to-group>
добавляет действие в определенное контекстное меню (Build, Run, Tools...), если нужно. Пример кода:
<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->
<idea-plugin>
<!-- Unique identifier of the plugin. It should be FQN. It cannot be changed between the plugin versions. -->
<id>com.example.PlaginExample</id>
<!-- Public plugin name should be written in Title Case.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/plugin-overview-page.html#plugin-name -->
<name>Demo plagin</name>
<!-- A displayed Vendor name or Organization ID displayed on the Plugins Page. -->
<vendor email="12345@gmail.com" url="https://mvnrepository.com/">Santexnik</vendor>
<!-- Description of the plugin displayed on the Plugin Page and IDE Plugin Manager.
Simple HTML elements (text formatting, paragraphs, and lists) can be added inside of <![CDATA[ ]]> tag.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/plugin-overview-page.html#plugin-description -->
<description>Usefull plugin</description>
<!-- Product and plugin compatibility requirements.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html -->
<depends>com.intellij.modules.platform</depends>
<depends>org.jetbrains.android</depends>
<depends>com.intellij.modules.androidstudio</depends>
<!-- Extension points defined by the plugin.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -->
<actions>
<group
id="MyDemoActionGroup"
description="Demo action group">
<action
id="MyActionId"
class="MyAction"
text="Convert to Toml"
description="Plugin info"/>
<add-to-group group-id="ToolsMenu" anchor="first"/>
</group>
</actions>
</idea-plugin>
Теперь нам необходимо создать сам класс, в котором будет логика плагина. Для этого в папке main/kotlin создаем класс с именем, которое мы указывали в <action>
(MyAction). Сам класс должен наследоваться от AnAction() класса. Как только мы пропишем наследование, IDE преложит нам имплементировать метод actionPerformed(e: AnActionEvent). Внутри мы можем прописать вывод сообщения на экран пользователю:
override fun actionPerformed(e: AnActionEvent) {
Messages.showMessageDialog(
e.project,
"Примет мир!",
"Приветсвие",
Messages.getInformationIcon());
}
Для сборки плагина переходим в Gradle → Tasks → build → build. Ждем когда плагин соберется, а затем переходим в проект Android Studio, в нем нажимаем File → Settings → Plugins , нажимаем на шетеренку и выбираем Install Plugin from Disk. Выбираем .jar
файл из директории C:\Users\User\IdeaProjects\NameProject\build\libs. Готово! Теперь остается только выбрать в контекстном меню пункт, в который мы сохранили действие нашего плагина (в моем случае Tools в верхнем меню, и там название нашего плагина). Нажимаем на него и нам высвечивается сообщение.
Вывод
В заключение, плагины для продуктов JetBrains, включая Android Studio, являются мощным инструментом, который может значительно упростить и ускорить процесс разработки.
Надеюсь, мне получилось убедить вас в том, что плагины — классная штука (про это написано в начале, также можете самостоятельно поискать существующие плагины под ваши нужды). Если у вас есть какие‑то замечания/пожелания по теме статьи — оставляйте свое мнение в комментариях. Это моя первая статья, так что любая обратная связь для меня очень важна. Спасибо за внимание, надеюсь статья оказалась полезной :)
dev-priporov
Я сталкивался с тем, что jar в build/libs/ файл не содержит сторонние зависимости, установку надо делать из build/distributions/ (https://github.com/open-policy-agent/opa-idea-plugin/blob/master/docs/devel/setup_development_env.md#main-gradle-tasks), Это актуально для таски buildPlugin. Есть ли проблема при простом build я не в првоерял, но думаю автору стоит на всякий случай проверить и если что, поправить.