自己打造Android Studio插件,提升开发效率

作者:张勇 | 腾讯移动客户端开发高级工程师

在开发的过程中,我们难免会遇到一些重复性编码的工作,如果能够让这些重复工作变得自动化,那该是一件多么爽的事情,比如我通过打造一个插件,提示了5%的工作效率。节省下来的时间,干点什么不好呢?

一、首先,什么是插件

说android studio插件实际上是指intellij plugin上面的插件,只不过,我做好插件之后,是使用在android stuido上而已,android stuido实际上就是intellij安装了android stuido插件之后的一个独立发布版本包而已。那么intellij plugin到底是什么东西,我觉得能用图说话,就尽量避免啰嗦了,这里,我使用我工作中使用的非常频繁的一个插件来说说:

如图上图所示,这是一个可以在android studio中使用的翻译插件,它可以说是英语水平不太好的开发的必备法宝之一。

怎么安装的呢?

通常是在这里搜索安装,当然也可以下载开发者发布的zip(jar)包到本地进行安装。

当然,你也可以通过这里管理你安装的插件,卸载,更新等等。

实际上,除了这个翻译插件,我们在开发的过程中已经不知不觉的用到了很多插件,比如,代码查找,重构,根据xml生成adapter代码等等,不得不说,没有这些插件,我们的开发效率将会大打折扣。

然而,也些时候,你的需求intellij plugin插件仓库中的插件并不能满足你,那么一定是时候自己动手做一个了。

动手自己做插件

1、首先上图,这是我自己做的一个插件,实现了一键从pb生成网络请求相关的接口文件。

2、我为什么需要在做一个插件

在项目的开发的过程中,我遇到了一个痛点,那就是每次一个新的业务到来,后台就会提供一些请求数据的接口(PB文件),自然而然,前端为了和后台交互,就需要封装一些请求方法去请求后台了,实际上做着做着,就觉得这部分操作属于枯燥无味的重复性操作:如下:

基本上都是面对一个pb文件,写一个Service,然后,在去写其中的具体的请求方法了。

那么我就在思考怎么突破,:

1、当然想到的第一个可能是后台能不能将这部分代码封装好打包一个jar给我们,和后台同学一说,他们觉得我想得可能有点多了,嗯,没时间做,还是你们自己做吧(哈哈,想太多)。

2、有没有什么自动生成代码的方法,了解过一些,比如,https://github.com/square/javapoet但是发现做起可能有点复杂,需要花太多的时间。

3、那么,能不能做一个可以在android studio中使用的插件呢?那么为什么不呢?

4、最后,我显然是做好了,如下图所示,基于后台提供的PB代码,使用我做好的插件,自动生成了Service文件,自动生成了接口请求文件Presenter,以后后台增加接口,我再也不用写枯燥无味的请求接口了。

我获得了哪些好处呢?

实现这个插件之后,我获得了哪些好处呢?

1、开发效率大大提升,我们再也不用为后台req封装网络请求了,操作有之前的手写变为了一键无痛生成。

2、servcie文件,和presenter文件都具备统一的命名规范,再也不懂担心开发人员随意命名了,这样一来保持了命名一致性,现在请求后台一个业务接口,我只需要对着pb文件就知道该怎么调用那个封装的方法,而不用去具体presenter中找了。

3、避免了不同的开发人员做重复的网络请求封装。

4、减低人为封装接口造成的请求参数类型错误而导致浪费调试时间。

整体算起来,解读pb文件大约需要5分钟,一个请求接口的封装需要10分钟,如果调试的时候,发现参数类型,参数个数错误导致接口调试不同,额外花费了10多分钟,,后期接口维护,增加参数了,你还得去改封装接口,大概10分钟,那么,平均算起来,每次一个请求都大概就去了半小时了。如果使用自动生成组件,这些几乎都是0成本了。按一个细分过的需求实现要9个小时,那大概每个需求就省去了5.5%的时间,

四、总结

这里是我做插件的一个过程,也都是从写Hello World开始的。

1、创建一个插件工程参考的这里。

https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/creating_plugin_project.html

2、创建一个action参考的这里

https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/creating_an_action.html

3、好了,基本上,经过上面的环节,就到了代码编写环节,可能,你已经到了这里了。

4、代码编写环节。

那么,Hello World肯定是必须玩一玩的,actionPerformed其实就是当你选择插件中一个功能时,他做什么动作。实际上,这里就是一个调用入口。比如,你可以在这里写上Hello World.编译,运行,此时会蹦出另外一个IntelliJ实例,而且已经安装好了这个插件了,找到这个插件。点击,哈哈,入门了,自此,你已经掌握怎么编写一个简单插件的全部步骤了,就这么简单。那么,这个插件有个卵用?我们要的是能用,那么时候来点提高了。

5、别着急写代码,先做一下需求分析,可行性分析

我这里把我做这个插件的过程拿来分析一下,虽然写的很挫,但是毕竟功能实现了,先来简单的对自己的需求进行一下分析:

a、想要从pb文件生成出对应的service和presneter文件,首先,我们需要知道有哪些pb文件,因此,当运行插件的时候,需要弹出一个对话框,告知用户指定pb文件目录,程序好取遍历里面的pb文件,如果有子目录怎么处理?

b、然后对每个pb文件,分析出里面的Req请求

这个就是一个请求了,那么怎么分析,IntelliJ插件开发框架中是否存在一些库可以分析文件树?那么,拿到这个请求,首先需要在service文件中去定义一个接口,需要在presenter文件去写一个实现方法,这个该怎么做,是否使用。

c、文件中的import 怎么处理,不然编译怎么过的了?

d、对于不想生成的pb该怎么处理,甚至pb里面的某些请求不想处理,咋办,使用配置么,嗯,看来还是对文件的解析操作。

e、对于后期增加文件,是删除重新生成,还是指添加少量代码段,intellij是否有提供方法,比如往类里添加方法,添加字段等等,是否有类似好用的接口?

6、可行性分析,技术调研,这点很重要,不然可能白忙活半天

那么,我的这些需求到底可行不可行,经过我自己的调研,我大概了解了以下几个概念,就基本断定可行了:

a、VFS 相关(VirtualFileSystem)

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

提供一个处理文件的通用API,而不关心文件的具体位置(无论文件位于磁盘上、归档文件中还是HTTP服务器上)追踪文件变化,并且在检测到文件内容发生更改时能提供新旧两个版本的文件建立文件在VFS和持久化存储之间的关联比如,我做插件的过程中,就用到了VFS来定位文件。

需要注意的是,文件的写操作是需要是需要放到异步线程中去处理的,不然插件会报错,这也是很多平台都具备的特性,耗时操作丢在异步线程,避免主线程卡顿

b、PSI相关(Program Structure Interface)

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

PSI(Program Structure Interface)是Intellij Platform中一个非常重要的概念,在IDE所管理的Project中,每个目录,Package,源代码和资源文件都会被抽象成相应的PSI对象。这个好处可以是大大的,比如有这么一些好用的api

这就使得我们给已有的内中添加方法提供了便利,而不是去做底层的文件读写操作。

还有例如:

从一段代码创建一个文件,这对于代码生成也是相当有用。这些生成的文件你将其加入到不同的package下面,他会自动补上包名 ,等等其他的一些好处。

c、Project Model

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

提供了一些api处理项目结构相关。

7、插件开发这方面的资料非常少,那么,有时候要实现功能,却不知道怎么下手怎么办,有一个可行的办法是,找一个功能有点类似的插件,然后如果 有源码就去github上去阅读别人的代码,挖出功能点的实现方式,基本上就能变成自己的了。

8、插件打包,因为我是专用插件,所以我直接打本地包了。

打包相当简单,直接

就会打包出一个jar文件,或者zip文件,去插件中心安装即可。随后你就可以使用你自己制作的插件啦。

五、附加学习资源

1、翻译插件源码,很值得学习

https://github.com/YiiGuxing/TranslationPlugin

2、一位网友写的插件开发教程,作为入门参考

https://juejin.im/post/599f7f546fb9a0248c2de496

3、官方教程不太友好,但是也有些作用的教程的,毕竟官方~

https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/creating_plugin_project.html

最后祝大家顺利做出自己想要的插件~~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180323A1NQKF00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券