ReomveButterKnife插件
这是一个用于移除代码中对ButterKnife使用的AS插件,接下来我们将从头开始讲讲这个插件的开发过程

什么是AS插件

相信能开始阅读这篇文章的朋友都是从事、或者有兴趣从事Android开发的,那么,我们现在最常用的开发工具无疑就是AndroidStudio了。
AndroidStudio虽然是Google公司推出的一款很方便的开发环境,但是在实际的使用中,还是有一些功能是我们需要而它没有的,比如对vim输入方式的支持,这时候,就需要我们在它上面安装各种各样的插件来获得这些额外的功能了。

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

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

RemoveButterKnife插件的设计目的

相信大家都听说过大名鼎鼎的ButterKnife,一款用于通过注解绑定View的第三方库,我们一旦用了它,就可以不用写长长的findViewById语句了,用几个注解就可以绑定。
再配合上AS插件——android butterknife zelezny一起使用,直接从布局自动生成相应的butterknife注解到你的代码里,真是太愉快了。

但是,事情总不是像我们想象的那么顺利,当我们愉快的使用着butterknife的时候,往往会遇到一些尴尬的情况,比如
  • ButterKnife这个第三方库每次更新之后,绑定view的注解都会改变,从bind,到inject,再到bindview,搞得很多人都不敢升级,一旦升级,就会有巨量的代码需要手动修改,非常痛苦
  • 当我们有一些非常棒的代码需要拿到其他项目使用,但是我们发现,那个项目对第三方库的使用是有限制的,我们不能使用butterknife,这时候,我们又得从注解改回findviewbyid
针对上面的两种情况,如果view比较少还好说,如果有几十个view,那么我们一个个的手动删除注解,写findviewbyid语句,简直是一场噩梦(别问我为什么知道这是噩梦)
所以,这种有规律又重复简单的工作为什么不能用一个插件来实现呢?于是RemoveButterKnife的想法就出现在了笔者脑海中。

开发插件前的准备工作

要开发插件,我们需要一些工具,由于AS是基于Idea开发的,其实我们开发的插件也是一个idea插件,我们需要去下载一个idea的社区版本,大家只要搜索IntelliJ Idea就可以找到了。
既然是用java做插件开发,肯定要设置好jdk,这个网上的资料更多,大家可以自行搜索。

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

插件开发

有了想法和工具,我们就可以开始编码了,但是,插件该怎么写呢?
其实,插件就是一种项目类型,我们新建项目的时候就会发现,有plugin这个类型,我们就新建一个这个类型的项目,中途会选择idea sdk,如果没有我们就新建一个(点击new 然后选择你的idea安装目录就可以了)


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


完成创建之后,我们的类代码是这样的
  1. import com.intellij.openapi.actionSystem.AnAction;
  2. import com.intellij.openapi.actionSystem.AnActionEvent;
  3. public class test extends AnAction {
  4. @Override
  5. public void actionPerformed(AnActionEvent e) {
  6. // TODO: insert action logic here
  7. }
  8. }
每次我们在菜单或者快捷键激活我们的插件的时候,actionPerformed方法就会被调用,里面的代码就会执行。

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

RemoveButterKnife的主要功能分析

知道了怎么写插件,接下来我们就要开始想一想,我们的插件应该有哪些功能了
  • 1、适用于Activity/Fragment使用了ButterKnife的情况
  • 2、删除对butterknife的引用
  • 3、删除butterknife的注解 @bind(R.id.xyz)
  • 4、生成findviewbyid语句
  • 5、删除ButterKnife.inject(this)等方法的使用语句

具体实现思路

有了上面的功能分析和效果图,想必大家都有了一个比较清晰的了解了,那么我们来从代码层面分析如何实现。
  • 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上面找到

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

把你的插件发布出去

你可以把你的插件发布到仓库里面去,这样就能在IDE里面找到它了。
方法很简单,登陆仓库地址然后注册账号,发布插件等待通过审核即可。

AS插件开发 RemoveButterKnife从构思到实现的更多相关文章

  1. JavaScript学习笔记(四)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...

  2. jira的插件开发流程实践

    怎么开头呢,由于自己比较懒,博客一直不怎么弄,以后克己一点,多传点自己遇到的问题和经历上来,供自己以后记忆,也供需要的小伙伴少走点弯路吧 最近公司项目需要竞标一个运维项目,甲方给予了既定的几种比较常用 ...

  3. 架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)

    在深入学习zookeeper我想先给大家介绍一个和zookeeper相关的应用实例,我把这个实例命名为远程调用服务.通过对这种应用实例的描述,我们会对zookeeper应用场景会有深入的了解. 远程调 ...

  4. Vue插件开发入门

    相对组件来说,Vue 的插件开发受到的关注要少一点.但是插件的功能是十分强大的,能够完成许多 Vue 框架本身不具备的功能. 大家一般习惯直接调用现成的插件,比如官方推荐的 vue-router.vu ...

  5. 【原创】记一次Project插件开发

    一.开发背景 最近在使用微软的Office Project 2010 进行项目管理,看到排的满满的计划任务,一个个地被执行完毕,还是很有成就感的.其实,不光是在工作中可以使用Project进行项目进度 ...

  6. JavaScript学习总结(四)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...

  7. [Tool] Open Live Writer插件开发

    一 前言 Windows Live Writer(简称 WLW)开源之后变成 Open Live Writer(简称 OLW),原先 WLW 的插件在 OLW 下都不能用了,原因很简单,WLW 插件开 ...

  8. VS插件开发 - 登录身份验证

    [附加] 很多朋友问那个VS背景怎么弄的,我刚刚已经抽时间把制作步骤发出来了: 请参见<VS插件开发 - 个性化VS IDE编辑器,瞬间 高 大 上>. 最近一直在忙着一些事情,一直没有发 ...

  9. jQuery插件开发精品教程,让你的jQuery提升一个台阶

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

随机推荐

  1. C++中四种类型转换方式

    类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...

  2. Application+Handle+Task

    Application Application和Activity,Service一样,是android框架的一个系统组件,android系统会为每个程序运行时创建一个Application类的对象且仅 ...

  3. ruby定时脚本

    ruby定时脚本的实现涉及到三个方面: 要定时执行的代码 定时控制(设置定时的时间) 将脚本后台化 实例: # in func.rb def func # the function body goes ...

  4. Katu Puzzle

    poj3678:http://poj.org/problem?id=3678 题意:给你一些数,然后这些要么是0要么是1,然后回给出一些数之间的and,or,xor的值,问你是否存在一组解. 题解:2 ...

  5. Keil 程序调试窗口

    上一讲中我们学习了几种常用的程序调试方法,这一讲中将介绍Keil提供各种窗口如输出窗口.观察窗口.存储器窗口.反汇编窗口.串行窗口等的用途,以及这些窗口的使用方法,并通过实例介绍这些窗口在调试中的使用 ...

  6. git在myelispse中的安装

    1.git在myelispse中的安装 http://blog.csdn.net/chinaonlyqiu/article/details/8830050

  7. android逐行读取文件内容以及保存为文件

    用于长时间使用的apk,并且有规律性的数据 1,逐行读取文件内容 //首先定义一个数据类型,用于保存读取文件的内容 class WeightRecord { String timestamp; flo ...

  8. HDU-3854 LOOPS

    http://acm.hdu.edu.cn/showproblem.php?pid=3853 LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memo ...

  9. Difference Between Primes

    Problem Description All you know Goldbach conjecture.That is to say, Every even integer greater than ...

  10. (转载)ASP网站如何防止注入漏洞攻击

    SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如 果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉.但 ...