Android Studio plugin development

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 EditionIntelliJ 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,并启用
选择第一步中的 Java SDK 作为默认 Java SDK

注:官方提示不要使用比指定版本更新的 Java 版本。

截图
2、配置 Platform SDKs

导航到 File | Project Structure,选择对话框左侧栏 Platform Settings 下的 SDKs
点击 + 按钮,先选择 JDK,指定 JDK 的路径;再创建 IntelliJ Platform Plugin SDK,指定 home path 为 IDEA 的安装路径,如图

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

4、设置Sandbox

IntelliJ IDEA 插件以 Debug/Run 模式运行时是在 SandBox 中进行的,不会影响当前的 IntelliJ IDEA;但是同一台机器同时开发多个插件时默认使用的同一个 Sandbox,即在创建 IntelliJ Platform SDK 时默认指定的 Sandbox Home

如果需要每个插件的开发环境是相互独立的,可以创建多个 IntelliJ Platform SDK,为 Sandbox Home 指定不同的目录 。

至此环境配置完毕。

4、开发一个简单的插件

1、 创建工程

选择 File | New | Project,左侧栏中选择 IntelliJ Platform Plugin 工程类型

Plugin dev模板工程

点击 Next,设置工程名称及位置,点击 Finish 完成创建。可以到 File | Project Structure 来自定义工程设置。

作为对比,看下Gradle模板的工程如何创建。


Gradle模板

选择左侧Gradle,右侧指定SDK,并勾选Java和Intellij Platform Plugin。

2、Plugin Dev工程的文件结构
MyFirstPluginDemo/
    resources/
      META-INF/
        plugin.xml
    src/
      xxx/...
      ...
      ...
  • 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 的第一和第二快捷键

注意:该向导只能向主菜单中已存在的 action group 或工具栏上添加 action,若要创建新的 action group,请参考前面的内容。

4、运行调试插件

运行/调试插件可直接在 IntelliJ IDEA 进行,选择 Run | Edit Configurations...,若左侧栏没有 Plugin 类型的 Configuration, 点击右上角+ 按钮,选择 Plugin 类型,

点击Run图标运行,IntelliJ IDEA 会另启一个装有该插件的 IDEA 窗口。

5、打包插件

选择 Build | Prepare Plugin Module ‘module name’ for Deployment 来打包插件:

插件包位置:一般在工程根目录下

如果插件没有依赖任何 library,插件会被打包成一个 .jar,否则会被打包成一个 .zip,zip 中包含了所有的插件依赖。

6、安装插件

导航到 File | Settings | Plugins 页面,点击 Install plugin from disk...

安装本地插件

选择插件包的位置,点击 OK
在插件列表中,勾选插件名字后面的 check-box 来启用插件,点击 OK
重启 IDEA

7、发布插件

将插件发布到 Jetbrains Plugin market

5、For-U的flutter工程代码模板。

https://gitlab.fuyoukache.com/flutter/fy_code_gen

功能:输入Yapi接口地址,生成flutter的网络请求代码。

参考文章IntelliJ Platform Plugin SDK

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342