开发属于自己的插件 | 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 条评论
登录 后参与评论

相关文章

来自专栏Seebug漏洞平台

WordPress REST API 内容注入漏洞分析

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

3157
来自专栏JavaEdge

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

6326
来自专栏Linyb极客之路

操作日志追踪记录之MDC入门

MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。某些...

1922
来自专栏EarlGrey的专栏

十分钟配置云端数据科学开发环境

本文将介绍如何在一台云服务器上配置 Jupyter Notebook 环境,从此只要有浏览器和网络,就是可以随时随地进行数据科学开发工作,不用担心家庭环境与办公...

1K2
来自专栏小狼的世界

在Codeigniter框架中使用NuSOAP

NuSOAP 是一组功能强大的PHP类,这个工具的发布让使用和创建SOAP消息变得相当简单。 NuSOAP有Dirtrich Ayala编写,可以无缝的与许多最...

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

【平台】HBase学习总结

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

6937
来自专栏JavaEdge

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

5946
来自专栏BinarySec

Windows x64上的x86重定向

0x00 背景 搬砖过程中遇到一个很奇怪的现象。写了一个程序利用命令regedit来读取注册表的某项值,出现了一个奇怪的现象:在某些电脑上能读到值,在另一些电脑...

3778
来自专栏大数据

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

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

20110
来自专栏前端杂货铺

Nodejs cluster模块深入探究

由表及里 HTTP服务器用于响应来自客户端的请求,当客户端请求数逐渐增大时服务端的处理机制有多种,如tomcat的多线程、nginx的事件循环等。而对于nod...

56810

扫码关注云+社区

领取腾讯云代金券