开发属于自己的插件 | IDEA & Android Studio插件开发指南

来这里找志同道合的小伙伴!

作 者 简 介

谷轩宇——从事安卓开发,目前效力于通天塔技术开放组是否曾经被ide重复繁琐的操作所困扰,又或者没有心仪的UI控件而难受。那么请阅读这篇文章,掌握idea插件的开发流程,开发属于自己的插件,造福开源社区。

开发前请做好相关准备工作:

  • 安装Java SDK什么的……不做解释
  • 掌握Java语言,最好会Kotlin,因为IDEA已经有一部分用Kotlin改写了
  • 下载IDEA社区版(Community)并安装,Android Studio插件开发同样需要下载IDEA,因为Android Studio基于IDEA并且精简掉了插件开发包 地址 https://www.jetbrains.com/idea/download 下载分为发行和社区版,因为社区版是开源的,所以用这个(后续需要看源码)
  • 下载或clone IDEA的社区版源码 地址 https://github.com/JetBrains/intellij-community
  • 打开IDEA SDK的官方文档 地址 http://www.jetbrains.org/intellij/sdk/docs

>>>> 入门篇

都准备好了,那就进入正题。

>>>> 一、创建新的插件项目

类型就选择IntelliJ Platform Plugin,然后一直选下一步。

>>>> 二、新建一个Action

先在src文件夹建个packge,取名随意,在packge里新建action

需要填4个内容和选择一个Groups,分别是:

  • Action ID,action的唯一标识,建议 包名.类名
  • Class Name,创建的Action类名
  • Name,action显示的文字
  • Description,描述
  • Groups,插件属于哪部分,可以定位插件的显示位置

ok之后,plugin.xml会自动加入刚刚创建的action

<actions>  
  <!-- Add your actions here -->   
  <action id="xxx" class="xxx" text="xxx">  
    <add-to-group group-id="xxx" anchor="last"/>  
  </action>  
</actions>

anchor代表插件相对于组的位置的位置,有以下几种:

  • first,放在最前面
  • last,放在最后
  • before,放在relative-to-action属性指定的ID的前面
  • after,放在relative-to-action属性指定的ID的后面

例如,本例Group ID选择了,anchor选了last

最后插件就会在git块的这里出现

运行后插件可以出现了,但这时候点击是没有反应的,进入下一步

>>>> 三、重写public void actionPerformed (AnActionEvent e)方法

先写个简单的hello world

@Override
public void actionPerformed(AnActionEvent e) {
  Projectproject=event.getProject();
  Messages.showMessageDialog(project,"helloworld","mytitle",Messages.getInformationIcon());
}

点击三角运行

正常会打开新的idea窗口,随便打开个项目找到刚才的插件位置,点击,不出意外会弹出一个helloworld的提示窗口了。

插件开发的过程大概如此,但是我们开发,肯定不是一个弹窗就解决需求的。由于开发需求的多样性,没法在一篇文章介绍所有api,所以在下面的部分,我将介绍IDEA开发的一些统一标准要求。

>>>> 进阶篇

IDEA官方开发者封装了大量易用的api,由于官方文档介绍很笼统,看过了仅有的文档,只能根据要开发的插件功能,去定位官方的源码相似功能部分,然后模仿着写。下面给出的一些经验,开发过程可能有的用不到,但是一定会对你大致理解整套系统有所帮助

>>>> 一、在event线程操作UI

这点很多平台都有这种规定,后台线程是不能操作UI的,Android中使用的是消息Handler机制,在IDEA中也有类似的消息机制。在event线程中不要进行耗时操作(例如网络,IO),耗时操作要放在后台线程。在后台线程获取到数据后,可以使用下面方式来更新UI。(还有其他方法,这里仅介绍一种)

ApplicationManager.getApplication().invokeLater(new Runnable() {
    @Override
    public void run() {
        // update UI
    }
 });

>>>> 二、如何开启一个后台任务?

不仅限于此,这里介绍一种方法,可以使用ProgressManager来开启

ProgressManager.getInstance().XXXX(new Runnable());

补全后可以看到很多方法,选择合适的调用即可。

>>>> 三、如何开启进度条任务(类似于构建,ide底下会出进度条)

创建自定义类MyTask继承于Task.Backgroundable,并重写run方法,run方法在后台线程执行,调用时可以如下:

new BackgroundTaskQueue(project, "my-task-name").run(newMyTask());

>>>> 四、什么是虚拟文件系统VFS(VirtualFileSystem)?

官方文档地址:

http://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/files.html

看代码时可能会经常看见VirtualFile,初次见肯定会疑惑,简单介绍一下(摘自官档)

虚拟文件系统(VFS)是IntelliJ Platform的一个组件,它封装了用于处理文件的大部分活动。它有以下主要用途:

  • 提供用于处理文件的通用API,无论其实际位置如何(在磁盘上,存档中,在HTTP服务器上,或者git上等)
  • 在检测到修改时跟踪文件修改并提供文件内容的新旧版本。
  • 提供将附加持久数据与VFS中的文件相关联的可能性。

看一下VirtualFileSystem实例的方法,大概有以下几项:刷新、获取VirtualFile、添加监听等作用。

比较常用的是VirtualFile,看一下实例方法

可以看到我们常用的文件操作基本都在这里。而与之相对应的有个类叫 Document ,这两个是不同的概念,Document 只能用于文本的文档,而且对应的是实例文件。VirtualFile是虚拟的文件,既可用于文本也可用于二进制文件。

>>>> 五、什么是程序结构接口PSI (Program Structure Interface)?

程序结构接口,通常称为PSI,是IntelliJ平台中的一个层,负责解析文件并创建支持平台许多功能的语法和语义代码模型。(摘自官档)

也就是说对特定语言语法树,符号解析等可以使用PSI,如果有此需要,可以参考

https://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/psi.html

>>>> 六、UI相关(用户界面组件)

IntelliJ平台包含大量自定义Swing组件。在插件中使用这些组件将确保您的插件与IDE的其余部分的UI一致并且与其一致,并且与使用默认Swing组件相比,通常可以减少代码大小。

列举一些:

  • Tool Windows
  • 对话框 Dialogs
  • 弹出窗口 Popups
  • 通知 Notifications
  • 文件和类选择器 File and Class Choosers
  • 编辑器组件 Editor Components
  • 列表和树控件 List and Tree Controls
  • 以及其他很多很多

可以参考

http://www.jetbrains.org/intellij/sdk/docs/user_interface_components/user_interface_components.html

>>>> 总结

其中VFS和PSI是众多模块中比较核心的部分,开发过程中也建议参考其他开源插件的源码,多看多想,相信读者在开发过程中会有不小的收获。

>>>> 参考文献

  • AndroidStudio插件开发(HelloWorld篇)by huachao1001 https://blog.csdn.net/huachao1001/article/details/53856916
  • IDEA官方文档 http://www.jetbrains.org/intellij/sdk/docs
  • IDEA社区版Github https://github.com/JetBrains/intellij-community

原文发布于微信公众号 - 京东技术(jingdongjishu)

原文发表时间:2018-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

Redis PK Memcached,哪个更牛叉?

说到 redis 就会联想到 memcached,反之亦然。了解过两者的同学有那么个大致的印象:

712
来自专栏PHP在线

Redis 和 Memcached 的区别

说到redis就会联想到memcached,反之亦然。了解过两者的同学有那么个大致的印象:redis与memcached相比,比仅支持简单的key-value数...

4076
来自专栏Seebug漏洞平台

WordPress REST API 内容注入漏洞分析

0x00 漏洞简述 1. 漏洞简介 在REST API自动包含在Wordpress4.7以上的版本,WordPress REST API提供了一组易于使用的HT...

3037
来自专栏大数据

Python爬虫之urllib库—爬虫的第一步

第一个爬虫代码的实现我想应该是从urllib开始吧,博主开始学习的时候就是使用urllib库敲了几行代码就实现了简单的爬数据功能,我想大多伙伴们也都是这么过来的...

19410
来自专栏JavaEdge

操作系统之文件管理一、文件与文件系统二、文件控制块和文件目录三、文件的物理结构四、文件系统的实现五、文件系统实例(UNIX)六、UNIX文件系统一、文件系统实例(FAT)二、文件操作的实现三、文件系统

4916
来自专栏cloudskyme

JAVA高性能I/O设计模式

同步阻塞模式。在JDK1.4以前,使用Java建立网络连接时,只能采用BIO方式,在服务器端启动一个ServerSocket,然后使用accept等待客户端请求...

1432
来自专栏JavaEdge

操作系统之内存管理内存管理3.1 内存管理的概念3.2 内存覆盖与内存交换3.3 内存连续分配管理方式3.4 内存非连续分配管理方式

5676
来自专栏编程一生

linux内核中听过就能记住的概念

1482
来自专栏PPV课数据科学社区

【平台】HBase学习总结

HBase的下载与安装 (HBase是一种数据库:Hadoop数据库,它是一种NoSQL存储系统,专门设计用来快速随机读写大规模数据。本文介绍HBase的下...

6477
来自专栏蛋未明的专栏

myweb0.2版本(更新)

1483

扫码关注云+社区