AndroidStudio插件开发——RemoveButterKnife从构思到实现

ReomveButterKnife插件

这是一个用于移除代码中对ButterKnife使用的AS插件,接下来我们将从头开始讲讲AS插件开发和这个插件的开发过程
地址是RemoveButterKnife
QQ截图20160624161742

什么是AndroidStudio插件

相信能开始阅读这篇文章的朋友都是从事,或者有兴趣从事Android开发的,那么,我们现在最常用的开发工具无疑就是AndroidStudio了。

那么,什么又是AndroidStudio插件呢?

AndroidStudio虽然是Google公司推出的一款很方便的开发环境,但是在实际的使用中,还是有一些功能是我们需要而它没有的,比如对vim输入方式的支持,这时候,就需要我们在它上面安装各种各样的插件来获得这些额外的功能了。

通常我们可以在AndroidStudio的右上角找到一个小小的放大镜,点击它,然后搜索plugin,就可以找到插件搜索的界面了,在这里,我们可以搜索到自己想要的插件,当然,这些插件得上传到插件库里才行,这个后面会讲到。
step1
step2

AndroidStudio插件应该怎么用

现在,我们装好了插件,该怎么用呢?这就要视插件的功能而定了,比如,用于支持vim输入的插件————IdeaVim,装上我们就可以开始使用,我们就能在AS里面使用Vim的快捷键和操作了,非常的厉害呢。

RemoveButterKnife插件的设计目的

相信大家都听说过大名鼎鼎的ButterKnife,一款用于通过注解绑定View的第三方库,我们一旦用了它,就可以不用写长长的findViewById语句了,用几个注解就可以绑定。

再配合上AS插件——android butterknife zelezny一起使用,直接从布局自动生成相应的butterknife注解到你的代码里,真是太愉快了。

但是,事情总不是像我们想象的那么顺利,当我们愉快的使用着butterknife的时候,往往会遇到一些尴尬的情况,比如

1.ButterKnife这个第三方库每次更新之后,绑定view的注解都会改变,从bind,到inject,再到bindview,搞得很多人都不敢升级,一旦升级,就会有巨量的代码需要手动修改,非常痛苦

2.当我们有一些非常棒的代码需要拿到其他项目使用,但是我们发现,那个项目对第三方库的使用是有限制的,我们不能使用butterknife,这时候,我们又得从注解改回findviewbyid

针对上面的两种情况,如果view比较少还好说,如果有几十个view,那么我们一个个的手动删除注解,写findviewbyid语句,简直是一场噩梦(别问我为什么知道这是噩梦)

所以,这种有规律又重复简单的工作为什么不能用一个插件来实现呢?于是RemoveButterKnife的想法就出现在了笔者脑海中。

1

开发插件前的准备工作

1.要开发插件,我们需要一些工具,由于AS是基于Idea开发的,其实我们开发的插件也是一个idea插件,我们需要去下载一个idea的社区版本,大家只要搜索IntelliJ Idea就可以找到了。

2.既然是用java做插件开发,肯定要设置好jdk,这个网上的资料更多,大家可以自行搜索。

有了以上两点,我们的工具就准备完毕了,就可以开始写了。

插件开发101

有了想法和工具,我们就可以开始编码了,但是,插件该怎么写呢?

其实,插件就是一种项目类型,我们新建项目的时候就会发现,有plugin这个类型,我们就新建一个这个类型的项目,中途会选择idea sdk,如果没有我们就新建一个(点击new 然后选择你的idea安装目录就可以了)
plugin

现在,我们有了插件项目了,我们点击src目录,这就是我们存放代码的地方,右键,新建一个Action
QQ截图20160624145412

这里会填写一些信息
QQ截图20160624145701

完成创建之后,我们的类代码是这样的

每次我们在菜单或者快捷键激活我们的插件的时候,actionPerformed方法就会被调用,里面的代码就会执行。

到此为止,我们的第一个插件就完成了,是不是很简单呢。

RemoveButterKnife的主要功能分析

知道了怎么写插件,接下来我们就要开始想一想,我们的插件应该有哪些功能了

1.适用于Activity/Fragment,使用了ButterKnife的情况

2.删除对butterknife的引用

3.删除butterknife的注解(@bind(R.id.xyz))

4.生成findviewbyid语句

5.删除ButterKnife.inject(this)等方法的使用语句

说完了功能,我们来看一个简单的对比例子,来说明到底是怎样的效果

整容前:
QQ截图20160624154939

整容后:
QQ截图20160624155124

具体实现思路

有了上面的功能分析和效果图,想必大家都有了一个比较清晰的了解了,那么我们来从代码层面分析如何实现。

1.由于import语句都是固定的,我们可以直接匹配,记录行号

2.因为注解语句有很多种,我们可能需要正则表达式去匹配,并提取id和view的名字信息,并生成一个map,用来对应id和名字以及view的类型,当然,也记录下注解的行号

3.对于butterknife.method的方法调用,使用字符串匹配,也记录下来行号

4.删除记录下行号的行

5.根据记录下的id和name的map,找到oncreate/oncreateview方法,在设置了layout的代码下面生成findviewbyid语句

具体代码分析

为了实现上述的功能,我们用了三个

1.MainAction ———— 主要用于扫描匹配,记录行号,生成id和name的map

2.DeleteAction ———— 主要用于删除记录下行号的代码

3.FindViewByIdWriter ———— 用于生成findviewbyid代码

具体的代码可以在github上面找到
地址是RemoveButterKnife
QQ截图20160624161742

在代码中,使用了一些idea提供的api来获取当前编辑文件的内容,并编辑,这些api都很简单,各位如果想查询的话可以到idea的支持页面上进行查找.

把你的插件发布出去

你可以把你的插件发布到仓库里面去,这样就能在IDE里面找到它了,方法很简单,登陆仓库地址然后注册账号,发布插件等待通过审核即可。
仓库地址
最后,如果你觉得这篇文章还不错的话,请我喝杯咖啡吧:)
1469583527097

u3coding

A software developer

Leave a Comment

Your email address will not be published. Required fields are marked *

*