Вступление

Плагины для продуктов 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

Версия Android Studio
Версия Android Studio
Версия IntelliJ IDEA Community Edition
Версия IntelliJ IDEA Community Edition

Нам важно, чтобы совпадали первые 3 цифры номера. Найти и скачать версию, подходящую под вашу Android Studio можно здесь. Установка самая стандартная, ее можете настраивать как вам нравится ;)

Создание проекта

Вот мы установили IDE, что же делать дальше? А дальше нужно создавать сам плагин, но для этого придется установить... плагин...

  1. Заходим в настройки

  2. Ищем раздел Plugins

  3. В нем находим плагин Plugin DevKit

  4. Устанавливаем его

  5. Может потребоваться перезапуск IDE

Plugin DevKit
Plugin DevKit

Установка DevKit нам нужна была для того, чтобы при создании нового проекта у нас появился вот такой генератор IDE Plugin

IDE Plugin
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 можно ознакомиться в официальной документации и вообще, там много интересного;). Мы пройдемся по основным.

<name>

Название плагина, которое будет отображаться в списке плагинов

<vendor>

Автор и контакты

<description>

Описание плагина, которое будет отображаться на странице плагина в JetBrains Marketplace и в окне управления плагинами в IDE

<depends>

Совместимость с продуктами JetBrains. Документация. Конкретно для Android Studio понадобятся следующие модули:

com.intellij.modules.platform — совместимость с IntelliJ IDEA.
org.jetbrains.android — поддержка Android Studio.
com.intellij.modules.androidstudio — совместимость конкретно с Android Studio.

<actions>

Этот блок определяет действия, которые плагин добавляет в интерфейс 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, являются мощным инструментом, который может значительно упростить и ускорить процесс разработки.

Надеюсь, мне получилось убедить вас в том, что плагины — классная штука (про это написано в начале, также можете самостоятельно поискать существующие плагины под ваши нужды). Если у вас есть какие‑то замечания/пожелания по теме статьи — оставляйте свое мнение в комментариях. Это моя первая статья, так что любая обратная связь для меня очень важна. Спасибо за внимание, надеюсь статья оказалась полезной :)

Комментарии (1)


  1. dev-priporov
    03.02.2025 07:36

    Я сталкивался с тем, что 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 я не в првоерял, но думаю автору стоит на всякий случай проверить и если что, поправить.