type
status
date
slug
summary
tags
category
icon
password
文章讨论了如何快速移除Android老项目中的ButterKnife。作者提出了三个开源项目:dengzii/RemoveButterKnife,u3shadow/RemoveButterKnife和Joehaivo/RemoveButterKnife。最后选择了Joehaivo/RemoveButterKnife,因为它支持一键替换全部文件,包括移除ButterKnife,生成findViewById,以及替换OnClick等相关代码。尽管使用此插件仍需要花费一些时间进行调整和测试,但它大大提高了效率。
背景
ButterKnife 很早就已经被废弃了,这个曾经很流行的开源项目已经不再维护了,我们目前的主力产品中,一直还遗留着这个东东。到了砍掉的时刻了。
基于以上因素,就在思考如何快速的清理掉,做好替换。
调研以及解决方案
我们暂时并未使用ViewBinding之类的技术,也就没有想着找移除ButterKnife生成ViewBinding之类的方案了。就想要找能够从ButterKnife到findViewById的代码。 更想要找的是直接一键生成,遍历整个App工程的全部Java文件进行替换生成。这样是最好的方案。如果只是一个文件一个文件手动转换的话,那要到猴年马月了呢。
经过了几个小时的探索,找到了三个开源项目,这里也一一介绍一下吧.
dengzii/RemoveButterKnife
项目地址: dengzii/RemoveButterKnife
看录制的视频上的演示效果,这是一个单文件的替换逻辑,只能一个文件一个文件的进行替换,手都要累断了。作者是dengzii。我试用了一下,是还可以。用的是idea社区版 本地导入jar包后测试的。替换后生成了findViewById等相关的代码。
![notion image](https://raw.githubusercontent.com/dengzii/RemoveButterKnife/main/art/screen_cap.gif)
u3shadow/RemoveButterKnife
项目地址: u3shadow/RemoveButterKnife
这是u3shadow开发的RemoveButterKnife插件。Android Studio上可以找到这个插件。这个的操作按钮在android studio编辑菜单中找到RemoveButterKnife按钮。效果上看也是单文件操作的。跟上面的类似吧,不过这个只是帮你移除了ButterKnife的代码,没有生成findViewById等代码
Joehaivo/RemoveButterKnife
项目地址:Joehaivo/RemoveButterKnife
这个才是能够一键去除Butterknife相关依赖, 老项目迁移的神器,感谢Joehaivo大佬。
功能包括移除Butterknife,生成findViewById,以及替换OnClick等相关的代码。支持在Activity还有fragment,ViewHolder等地方。最厉害的就是支持一键替换全部的文件,会遍历全部的Java文件,去找到有butterKnife注解的Java类做替换操作。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F155940bf-cdde-45b2-9de8-e1d8e1ed10f7%2F7ba4350e-6566-46f3-84fa-dd1e73d91bd7%2FUntitled.jpeg?table=block&id=c37c220f-769e-4d4f-ba90-aca6220ed938)
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F155940bf-cdde-45b2-9de8-e1d8e1ed10f7%2F2a5cd693-76cc-4319-a782-f83bfdd5a47c%2FUntitled.jpeg?table=block&id=9e5697ff-c4cc-451e-9d19-55725b9ef05c)
操作步骤以及结果就看以上这两个图就好啦。
总结
用了上面的第三个RemoveButterKnife后,还是花了两天的时间,才完成了这个任务,毕竟这个插件插入的代码位置,顺序啊,并不一定是你期望的,但是呢,也大大提高了效率。
比如生成的
__bindViews();
, __bindClicks();
等代码如果是Activity,那么必须在onCreate()
方法里面的setContentView()
的后面.如果是Fragment
,那么看你自己的处理逻辑了,我的得是在onCreateView()
的后面。毕竟插件解决不了不同程度的封装嘛,具体不同的地方还是得结合自己的框架业务来做调整。最后,修改完了,一定要多测测,毕竟所有的页面都涉及到了呢。