這是一個用於移除代碼中對ButterKnife使用的AS插件,接下來咱們將從頭開始講講AS插件開發和這個插件的開發過程 地址是RemoveButterKnife java
相信能開始閱讀這篇文章的朋友都是從事,或者有興趣從事Android開發的,那麼,咱們如今最經常使用的開發工具無疑就是AndroidStudio了。android
那麼,什麼又是AndroidStudio插件呢?git
AndroidStudio雖然是Google公司推出的一款很方便的開發環境,可是在實際的使用中,仍是有一些功能是咱們須要而它沒有的,好比對vim輸入方式的支持,這時候,就須要咱們在它上面安裝各類各樣的插件來得到這些額外的功能了。github
一般咱們能夠在AndroidStudio的右上角找到一個小小的放大鏡,點擊它,而後搜索plugin,就能夠找到插件搜索的界面了,在這裏,咱們能夠搜索到本身想要的插件,固然,這些插件得上傳到插件庫裏才行,這個後面會講到。
正則表達式
如今,咱們裝好了插件,該怎麼用呢?這就要視插件的功能而定了,好比,用於支持vim輸入的插件————IdeaVim,裝上咱們就能夠開始使用,咱們就能在AS裏面使用Vim的快捷鍵和操做了,很是的厲害呢。vim
相信你們都據說過大名鼎鼎的ButterKnife,一款用於經過註解綁定View的第三方庫,咱們一旦用了它,就能夠不用寫長長的findViewById語句了,用幾個註解就能夠綁定。api
再配合上AS插件——android butterknife zelezny一塊兒使用,直接從佈局自動生成相應的butterknife註解到你的代碼裏,真是太愉快了。ide
可是,事情總不是像咱們想象的那麼順利,當咱們愉快的使用着butterknife的時候,每每會遇到一些尷尬的狀況,好比工具
1.ButterKnife這個第三方庫每次更新以後,綁定view的註解都會改變,從bind,到inject,再到bindview,搞得不少人都不敢升級,一旦升級,就會有巨量的代碼須要手動修改,很是痛苦佈局
2.當咱們有一些很是棒的代碼須要拿到其餘項目使用,可是咱們發現,那個項目對第三方庫的使用是有限制的,咱們不能使用butterknife,這時候,咱們又得從註解改回findviewbyid
針對上面的兩種狀況,若是view比較少還好說,若是有幾十個view,那麼咱們一個個的手動刪除註解,寫findviewbyid語句,簡直是一場噩夢(別問我爲何知道這是噩夢)
因此,這種有規律又重複簡單的工做爲何不能用一個插件來實現呢?因而RemoveButterKnife的想法就出如今了筆者腦海中。
1.要開發插件,咱們須要一些工具,因爲AS是基於Idea開發的,其實咱們開發的插件也是一個idea插件,咱們須要去下載一個idea的社區版本,你們只要搜索IntelliJ Idea就能夠找到了。
2.既然是用java作插件開發,確定要設置好jdk,這個網上的資料更多,你們能夠自行搜索。
有了以上兩點,咱們的工具就準備完畢了,就能夠開始寫了。
有了想法和工具,咱們就能夠開始編碼了,可是,插件該怎麼寫呢?
其實,插件就是一種項目類型,咱們新建項目的時候就會發現,有plugin這個類型,咱們就新建一個這個類型的項目,中途會選擇idea sdk,若是沒有咱們就新建一個(點擊new 而後選擇你的idea安裝目錄就能夠了)
如今,咱們有了插件項目了,咱們點擊src目錄,這就是咱們存放代碼的地方,右鍵,新建一個Action
完成建立以後,咱們的類代碼是這樣的
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 } }
每次咱們在菜單或者快捷鍵激活咱們的插件的時候,actionPerformed方法就會被調用,裏面的代碼就會執行。
到此爲止,咱們的第一個插件就完成了,是否是很簡單呢。
知道了怎麼寫插件,接下來咱們就要開始想想,咱們的插件應該有哪些功能了
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上面找到 地址是RemoveButterKnife
在代碼中,使用了一些idea提供的api來獲取當前編輯文件的內容,並編輯,這些api都很簡單,各位若是想查詢的話能夠到idea的支持頁面上進行查找.
你能夠把你的插件發佈到倉庫裏面去,這樣就能在IDE裏面找到它了,方法很簡單,登錄倉庫地址而後註冊帳號,發佈插件等待經過審覈便可。 倉庫地址