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;
    1. import com.intellij.openapi.actionSystem.AnActionEvent;
    1. public class test extends AnAction {
    1. @Override
    1. public void actionPerformed(AnActionEvent e) {
    1. // TODO: insert action logic here
    1. }
    1. }
每次我们在菜单或者快捷键激活我们的插件的时候,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. jQuery 表格插件25

    jQuery 表格插件可以让你创建各种各样的表格布局,表格布局是报纸和杂志中最常见的布局,现在的网站中也很常见,在这篇文章中,我向大家推荐25个jQuery 的表格插件,你可以任意控制表格的行和列,用 ...

  2. spoj 4487. Can you answer these queries VI (gss6) splay 常数优化

    4487. Can you answer these queries VI Problem code: GSS6 Given a sequence A of N (N <= 100000) in ...

  3. 【POJ1021】Intervals (最短路解差分约束)

    题目: Sample Input 5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1 Sample Output 6 题意: 我们选数,每个数只能选一次.给定n个条件[ai,bi]和 ...

  4. gridview数据导出到word和excel以及excel的导入

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  5. 【HDOJ】1881 毕业bg

    01背包. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 1005 ty ...

  6. AppDomain

    AppDomain http://www.cnblogs.com/xiashengwang/archive/2012/07/17/2594623.html http://www.cnblogs.com ...

  7. WordPress Simple Login Registration插件’username‘参数跨站脚本漏洞

    漏洞名称: WordPress Simple Login Registration插件’username‘参数跨站脚本漏洞 CNNVD编号: CNNVD-201308-519 发布时间: 2013-0 ...

  8. 关于数据库一致改关闭下redo日志文件丢失的处理办法的总结

    数据库一致性关闭下redo日志文件丢失的处理办法(归档和非归档都行) 1. inactive log  在一致性关闭后删除重启时可以在mount下(不丢失数据) alter database clea ...

  9. Hibernate自定查询返回list<?>

    /** * * @param session * :一个会话 * * @param hql * :是需要执行的hql语句, * * @param offset * 设置开始位置 * * @param ...

  10. Google Reader的另一个开源的替代品Go Read

    Google Reader到7月1号退休了,于是出现了一批Google Reader的替代品,比如Google Reader Is Shutting Down; Here Are the Best A ...