0、 前言
我们在Android Studio上使用了很多插件,比如开发flutter的时候用到的FishReduxTemplate 、FlutterJsonBeanFactory等,这些插件是如何开发的呢,今天我们来开发自己的AS插件。
1、 AS插件开发介绍
AS 插件开发也就是IntelliJ IDEA插件开发。
IntelliJ IDEA 简称 IDEA,是 Jetbrains 公司旗下的一款 JAVA 开发工具,支持 Java、Scala、Groovy 等语言的开发,同时具备支持目前主流的技术和框架,擅长于企业应用、移动应用和 Web 应用的开发,提供了丰富的功能,智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等。
IntelliJ Platform
是一个构建 IDE 的开源平台,基于它构建的 IDE 有 IntelliJ IDEA、WebStorm、DataGrip、以及 Android Studio 等等。AS和IDEA 插件也是基于
IntelliJ Platform
开发的。
您可以使用 IntelliJ IDEA Community Edition 或 IntelliJ IDEA Ultimate 作为您的 IDE。两者都包括完整的插件开发工具集。要更熟悉 IntelliJ IDEA,请参阅 IntelliJ IDEA Web 帮助 。
2、三种模板
有三个支持的工作流可用于构建插件。
1、
GitHub Template
它提供了一个纯样板模板
intellij-platform-plugin-template
, 以便使用推荐的Gradle设置更容易地创建新的插件项目。
2、
Gradle
官方推荐
* 源集、模块和项目的表示是可移植的,
* 任何规模或复杂性的项目通常都需要用于构建管理的脚本,Gradle 可以在本地处理这些脚本,
* 一般 Gradle 主题的培训、文档和社区帮助随处可见。
特定于使用 IntelliJ IDEA 的 Gradle 插件开发 IntelliJ 平台插件:
* 更改插件目标更舒服,因为这一切都在build.gradle 中完成:
* 切换目标 IntelliJ 平台(IDE)的版本,
* 更改目标 IntelliJ Platform-based IDE,例如,从 IntelliJ IDEA 更改为 PyCharm,
* 针对 JetBrains 运行时的替代版本运行插件。
* Gradle 与持续集成系统和JetBrains Plugin Repository完全集成,因此可以轻松自定义和扩展构建和发布过程。
* plugin.xml和插件分发结构的内置验证任务。
* 与IntelliJ Plugin Verifier工具的内置集成,用于运行在JetBrains Plugin Repository上执行的兼容性检查。
my_gradle_plugin
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
├── main
│ ├── java
│ └── resources
│ └── META-INF
│ └── plugin.xml
└── test
├── java
└── resources
3、Plugin DevKit
Plugin DevKit是一个捆绑的 IntelliJ IDEA 插件,用于使用 IntelliJ IDEA 的构建系统为 IntelliJ 平台开发插件。它提供其自定义 SDK 类型和一组用于在 IDE 中构建插件的操作。
本文使用的是Plugin DevKit的方式。
3、 开发环境搭建
本文开发工具使用的是 Intellij IDEA 2019
jdk版本:JDK 8
启用Plugin DevKit
Plugin DevKit 是 IntelliJ 的一个插件,它使用 IntelliJ IDEA 自己的构建系统来为开发 IDEA 插件提供支持。开发 IDEA 插件之前需要安装并启用 Plugin DevKit 。
打开 IDEA,导航到 Settings | Plugins,若插件列表中没有 Plugin DevKit,点击 Install JetBrains plugin,搜索并安装。
配置 IntelliJ 平台 SDK
1、安装jdk1.8,并启用
3、配置Project的 IntelliJ Platform Plugin SDK
IntelliJ Platform Plugin SDK 就是开发 IntelliJ 平台插件的SDK, 是基于 JDK 之上运行的,类似于开发 Android 应用需要 Android SDK。
创建好 IntelliJ Platform Plugin SDK 后,选择左侧栏 Project Settings 下的 Projects,在 Project SDK 下选择刚创建的 IntelliJ Platform Plugin SDK。
如果需要每个插件的开发环境是相互独立的,可以创建多个 IntelliJ Platform SDK,为 Sandbox Home 指定不同的目录 。
至此环境配置完毕。
4、开发一个简单的插件
1、 创建工程
选择 File | New | Project,左侧栏中选择 IntelliJ Platform Plugin 工程类型
src 实现插件功能的classes
resources/META-INF/plugin.xml 插件的配置文件,指定插件名称、描述、版本号、支持的 IntelliJ IDEA 版本、插件的 components 和 actions 以及软件商等信息。
<idea-plugin>
<!-- 插件名称,别人在官方插件库搜索你的插件时使用的名称 -->
<name>MyPlugin</name>
<!-- 插件唯一id,不能和其他插件项目重复,所以推荐使用com.xxx.xxx的格式
插件不同版本之间不能更改,若没有指定,则与插件名称相同 -->
<id>com.example.plugin.myplugin</id>
<!-- 插件的描述 -->
<description>my plugin description</description>
<!-- 插件版本变更信息,支持HTML标签;
将展示在 settings | Plugins 对话框和插件仓库的Web页面 -->
<change-notes>Initial release of the plugin.</change-notes>
<!-- 插件版本 -->
<version>1.0</version>
<!-- 供应商主页和email-->
<vendor url="http://www.jetbrains.com" email="support@jetbrains.com" />
<!-- 插件所依赖的其他插件的id -->
<depends>MyFirstPlugin</depends>
<!-- 插件兼容IDEA的最大和最小 build 号,两个属性可以任选一个或者同时使用
官网详细介绍:http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html-->
<idea-version since-build="3000" until-build="3999"/>
<!-- application components -->
<application-components>
<component>
<!-- 组件接口 -->
<interface-class>com.foo.Component1Interface</interface-class>
<!-- 组件的实现类 -->
<implementation-class>com.foo.impl.Component1Impl</implementation-class>
</component>
</application-components>
<!-- project components -->
<project-components>
<component>
<!-- 接口和实现类相同 -->
<interface-class>com.foo.Component2</interface-class>
</component>
</project-components>
<!-- module components -->
<module-components>
<component>
<interface-class>com.foo.Component3</interface-class>
</component>
</module-components>
<!-- Actions -->
<actions>
</actions>
<!-- 插件定义的扩展点,以供其他插件扩展该插件 -->
<extensionPoints>
</extensionPoints>
<!-- 声明该插件对IDEA core或其他插件的扩展 -->
<extensions xmlns="com.intellij">
</extensions>
</idea-plugin>
3、创建Action
一个 Action 表示 IDEA 菜单里的一个 menu item 或工具栏上的一个按钮,通过继承 AnAction class 实现,当选择一个 menu item 或点击工具栏上的按钮时,就会调用 AnAction 类的 actionPerformed 方法。
实现自定义 Action 分两步:
1 、定义一个或多个 action
定义一个 Java class
,继承 AnAction
类,并重写 actionPerformed
方法, 如
public class HelloWorldClass extends AnAction {
public void actionPerformed(AnActionEvent event) {
Project project = event.getData(PlatformDataKeys.PROJECT);
Messages.showInputDialog(
project,
"What is your name?",
"Input your name",
Messages.getQuestionIcon());
2、注册 action,将 item 添加到菜单或工具栏上
在 plugin.xml 文件的 <actions>
元素内注册
<actions>
<!-- Add your actions here ProjectViewPopupMenu-->
<action id="HelloWorldID"
class="HelloWorldClass"
text="HelloWorldName"
description="HelloWorld">
<add-to-group group-id="EditMenu" anchor="first"/>
</action>
</actions>
<action>
元素会定义一个 action,指定 action 的 id、实现类、显示文本、描述
<group>
元素会定义一个 action group(多个action),设置 action group 的 id、文本、描述
<add-to-group>
元素指定其外部 action 或 action group 被添加到的位置
3+、快速创建Action
IntelliJ Platform 提供了 New Action 向导,它会帮助我们创建 action class 并配置 plugin.xml 文件:
在目标 package 上右键,选择 New | Plugin DevKit | Action:
在弹出的对话框中填充下列字段,然后点击 OK:
Action ID: action 唯一 id,推荐 format: PluginName.ID
Class Name: 要被创建的 action class 名称
Name: menu item 的文本
Description: action 描述,toolbar 上按钮的提示文本,可选
Add to Group:选择新 action 要被添加到的 action group(Groups, Actions)以及相对其他 actions 的位置(Anchor)
Keyboard Shortcuts:指定 action 的第一和第二快捷键