当前位置:首页 > 技术文章 > 正文内容

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

u3blog2年前 (2022-10-08)技术文章610

ReomveButterKnife插件

这是一个用于移除代码中对ButterKnife使用的AS插件,接下来我们将从头开始讲讲AS插件开发和这个插件的开发过程
地址是<a href="https://github.com/u3shadow/RemoveButterKnife" target="_blank">RemoveButterKnife</a>
undefined

什么是AndroidStudio插件

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

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

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

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

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的想法就出现在了笔者脑海中。

undefined

开发插件前的准备工作

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

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

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

插件开发101

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

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

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

这里会填写一些信息
undefined

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

<pre class="lang:default decode:true " >import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;

public class test extends AnAction {

@Override
public void actionPerformed(AnActionEvent e) {
// TODO: insert action logic here
}
}</pre>

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

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

RemoveButterKnife的主要功能分析

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

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

2.删除对butterknife的引用

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

4.生成findviewbyid语句

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

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

整容前:
undefined

整容后:
undefined

具体实现思路

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

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上面找到
地址是<a href="https://github.com/u3shadow/RemoveButterKnife" target="_blank">RemoveButterKnife</a>
undefined

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

把你的插件发布出去

你可以把你的插件发布到仓库里面去,这样就能在IDE里面找到它了,方法很简单,登陆仓库地址然后注册账号,发布插件等待通过审核即可。
<a href="https://plugins.jetbrains.com/?idea" target="_blank">仓库地址</a>

扫描二维码推送至手机访问。

版权声明:本文由u3blog发布,如需转载请注明出处。

本文链接:https://u3blog.xyz/?id=691

分享给朋友:

“AndroidStudio插件开发——RemoveButterKnife从构思到实现” 的相关文章

开源数据库Postgresql安装/卸载总结

What Postgresql一个开源数据库,类似mysql,由于mysql被收购了,这个数据库正被越来越多的使用 怎么安装?安装非常简单,但是安装过后的初始化还是有点麻烦,具体可以看这篇文章为什么要卸载?安装好之后,如果你很倒霉的话,会遇到postgresql服务怎么都启动不了,输入psql指令显...

项目的改造——RemoveButterKnife插件代码的重构

项目的改造——RemoveButterKnife插件代码的重构

前言这篇文章记述了我的插件RemoveButterKnife的代码改进过程以及思路,关于插件,各位可以看RemoveButterKnife代码库,关于文章,可以看构思到实现RemoveButterKnife 原因近期想给原来的插件RemoveButterKnife加入一些新的功能,发现以前的代码没...

项目的升级-给RemoveButterKnife插件增加新功能

项目的升级-给RemoveButterKnife插件增加新功能

前言经过项目的初步编写和进一步改造,RemoveButterKnife插件终于也有模有样了,但是,功能上仅仅支持Activity/Fragment的BindView注解。 关于编写和优化的过程可以看下面两篇文章项目构造RemoveButterKnife 项目改进-重构RemoveButterKn...

使用Databinding为Recyclerview使用同一个ViewHolder加载不同Item

提示:在阅读本篇文章前,你最好对android databinding有一定了解,本文使用的代码均为kotlin,但是不用担心,都很简单 最近在写项目的时候使用了databinding技术,突发奇想,databinding是不是也能应用于recyclerview中,让加载多个不同的item更简单呢...

自己实现一个Android网络图片加载器

在Android开发中,我们经常会用到各种各样的图片加载框架来帮助我们加载网络图片,那有没有想过自己实现一个呢 本文记录了实现一个图片框架的整个流程,以及对代码的优化整理过程,文章比较长,如果只对其中的一部分感兴趣直接跳转到相应部分即可 提问环节把大象装进冰箱分几步?是不是感觉在这初秋时节更加凉...

评论列表

1111
1111 IP:
2个月前 (08-07)

识别码:atgjue14560FJ-这游戏真不错!http://www.a5km.com/yxgl/jdqs/29436.html

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。