AndroidStudio外掛開發——RemoveButterKnife從構思到實現

u3shadow發表於2018-11-30

ReomveButterKnife外掛

這是一個用於移除程式碼中對ButterKnife使用的AS外掛,接下來我們將從頭開始講講AS外掛開發和這個外掛的開發過程 地址是RemoveButterKnife QQ截圖20160624161742

什麼是AndroidStudio外掛

相信能開始閱讀這篇文章的朋友都是從事,或者有興趣從事Android開發的,那麼,我們現在最常用的開發工具無疑就是AndroidStudio了。

那麼,什麼又是AndroidStudio外掛呢?

AndroidStudio雖然是Google公司推出的一款很方便的開發環境,但是在實際的使用中,還是有一些功能是我們需要而它沒有的,比如對vim輸入方式的支援,這時候,就需要我們在它上面安裝各種各樣的外掛來獲得這些額外的功能了。

通常我們可以在AndroidStudio的右上角找到一個小小的放大鏡,點選它,然後搜尋plugin,就可以找到外掛搜尋的介面了,在這裡,我們可以搜尋到自己想要的外掛,當然,這些外掛得上傳到外掛庫裡才行,這個後面會講到。 step1 step2

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的想法就出現在了筆者腦海中。

1

開發外掛前的準備工作

1.要開發外掛,我們需要一些工具,由於AS是基於Idea開發的,其實我們開發的外掛也是一個idea外掛,我們需要去下載一個idea的社群版本,大家只要搜尋IntelliJ Idea就可以找到了。

2.既然是用java做外掛開發,肯定要設定好jdk,這個網上的資料更多,大家可以自行搜尋。

有了以上兩點,我們的工具就準備完畢了,就可以開始寫了。

外掛開發101

有了想法和工具,我們就可以開始編碼了,但是,外掛該怎麼寫呢?

其實,外掛就是一種專案型別,我們新建專案的時候就會發現,有plugin這個型別,我們就新建一個這個型別的專案,中途會選擇idea sdk,如果沒有我們就新建一個(點選new 然後選擇你的idea安裝目錄就可以了) plugin

現在,我們有了外掛專案了,我們點選src目錄,這就是我們存放程式碼的地方,右鍵,新建一個Action QQ截圖20160624145412

這裡會填寫一些資訊 QQ截圖20160624145701

完成建立之後,我們的類程式碼是這樣的

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方法就會被呼叫,裡面的程式碼就會執行。

到此為止,我們的第一個外掛就完成了,是不是很簡單呢。

RemoveButterKnife的主要功能分析

知道了怎麼寫外掛,接下來我們就要開始想一想,我們的外掛應該有哪些功能了

1.適用於Activity/Fragment,使用了ButterKnife的情況

2.刪除對butterknife的引用

3.刪除butterknife的註解(@bind(R.id.xyz))

4.生成findviewbyid語句

5.刪除ButterKnife.inject(this)等方法的使用語句

說完了功能,我們來看一個簡單的對比例子,來說明到底是怎樣的效果

整容前: QQ截圖20160624154939

整容後: QQ截圖20160624155124

具體實現思路

有了上面的功能分析和效果圖,想必大家都有了一個比較清晰的瞭解了,那麼我們來從程式碼層面分析如何實現。

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 QQ截圖20160624161742

在程式碼中,使用了一些idea提供的api來獲取當前編輯檔案的內容,並編輯,這些api都很簡單,各位如果想查詢的話可以到idea的支援頁面上進行查詢.

把你的外掛釋出出去

你可以把你的外掛釋出到倉庫裡面去,這樣就能在IDE裡面找到它了,方法很簡單,登陸倉庫地址然後註冊賬號,釋出外掛等待通過稽核即可。 倉庫地址

相關文章