當前位置:
首頁 > 最新 > 自己打造Android Studio插件,提升開發效率

自己打造Android Studio插件,提升開發效率

GIF

作者:張勇 | 騰訊移動客戶端開發高級工程師

在開發的過程中,我們難免會遇到一些重複性編碼的工作,如果能夠讓這些重複工作變得自動化,那該是一件多麼爽的事情,比如我通過打造一個插件,提示了5%的工作效率。節省下來的時間,干點什麼不好呢?

一、首先,什麼是插件

說android studio插件實際上是指intellij plugin上面的插件,只不過,我做好插件之後,是使用在android stuido上而已,android stuido實際上就是intellij安裝了android stuido插件之後的一個獨立發布版本包而已。那麼intellij plugin到底是什麼東西,我覺得能用圖說話,就盡量避免啰嗦了,這裡,我使用我工作中使用的非常頻繁的一個插件來說說:

如圖上圖所示,這是一個可以在android studio中使用的翻譯插件,它可以說是英語水平不太好的開發的必備法寶之一。

怎麼安裝的呢?

通常是在這裡搜索安裝,當然也可以下載開發者發布的zip(jar)包到本地進行安裝。

當然,你也可以通過這裡管理你安裝的插件,卸載,更新等等。

實際上,除了這個翻譯插件,我們在開發的過程中已經不知不覺的用到了很多插件,比如,代碼查找,重構,根據xml生成adapter代碼等等,不得不說,沒有這些插件,我們的開發效率將會大打折扣。

然而,也些時候,你的需求intellij plugin插件倉庫中的插件並不能滿足你,那麼一定是時候自己動手做一個了。

動手自己做插件


GIF

在項目的開發的過程中,我遇到了一個痛點,那就是每次一個新的業務到來,後台就會提供一些請求數據的介面(PB文件),自然而然,前端為了和後台交互,就需要封裝一些請求方法去請求後台了,實際上做著做著,就覺得這部分操作屬於枯燥無味的重複性操作:如下:

基本上都是面對一個pb文件,寫一個Service,然後,在去寫其中的具體的請求方法了。


1、當然想到的第一個可能是後台能不能將這部分代碼封裝好打包一個jar給我們,和後台同學一說,他們覺得我想得可能有點多了,嗯,沒時間做,還是你們自己做吧(哈哈,想太多)。

2、有沒有什麼自動生成代碼的方法,了解過一些,比如,https://github.com/square/javapoet但是發現做起可能有點複雜,需要花太多的時間。

3、那麼,能不能做一個可以在android studio中使用的插件呢?那麼為什麼不呢?

4、最後,我顯然是做好了,如下圖所示,基於後台提供的PB代碼,使用我做好的插件,自動生成了Service文件,自動生成了介面請求文件Presenter,以後後台增加介面,我再也不用寫枯燥無味的請求介面了。

我獲得了哪些好處呢?

實現這個插件之後,我獲得了哪些好處呢?

1、開發效率大大提升,我們再也不用為後台req封裝網路請求了,操作有之前的手寫變為了一鍵無痛生成。

2、servcie文件,和presenter文件都具備統一的命名規範,再也不懂擔心開發人員隨意命名了,這樣一來保持了命名一致性,現在請求後台一個業務介面,我只需要對著pb文件就知道該怎麼調用那個封裝的方法,而不用去具體presenter中找了。

3、避免了不同的開發人員做重複的網路請求封裝。

4、減低人為封裝介面造成的請求參數類型錯誤而導致浪費調試時間。

整體算起來,解讀pb文件大約需要5分鐘,一個請求介面的封裝需要10分鐘,如果調試的時候,發現參數類型,參數個數錯誤導致介面調試不同,額外花費了10多分鐘,,後期介面維護,增加參數了,你還得去改封裝介面,大概10分鐘,那麼,平均算起來,每次一個請求都大概就去了半小時了。如果使用自動生成組件,這些幾乎都是0成本了。按一個細分過的需求實現要9個小時,那大概每個需求就省去了5.5%的時間,

四、總結

這裡是我做插件的一個過程,也都是從寫Hello World開始的。


https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/creating_plugin_project.html


https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/creating_an_action.html


那麼,Hello World肯定是必須玩一玩的,actionPerformed其實就是當你選擇插件中一個功能時,他做什麼動作。實際上,這裡就是一個調用入口。比如,你可以在這裡寫上Hello World.編譯,運行,此時會蹦出另外一個IntelliJ實例,而且已經安裝好了這個插件了,找到這個插件。點擊,哈哈,入門了,自此,你已經掌握怎麼編寫一個簡單插件的全部步驟了,就這麼簡單。那麼,這個插件有個卵用?我們要的是能用,那麼時候來點提高了。


我這裡把我做這個插件的過程拿來分析一下,雖然寫的很挫,但是畢竟功能實現了,先來簡單的對自己的需求進行一下分析:

a、想要從pb文件生成出對應的service和presneter文件,首先,我們需要知道有哪些pb文件,因此,當運行插件的時候,需要彈出一個對話框,告知用戶指定pb文件目錄,程序好取遍歷裡面的pb文件,如果有子目錄怎麼處理?

b、然後對每個pb文件,分析出裡面的Req請求

這個就是一個請求了,那麼怎麼分析,IntelliJ插件開發框架中是否存在一些庫可以分析文件樹?那麼,拿到這個請求,首先需要在service文件中去定義一個介面,需要在presenter文件去寫一個實現方法,這個該怎麼做,是否使用。

c、文件中的import 怎麼處理,不然編譯怎麼過的了?

d、對於不想生成的pb該怎麼處理,甚至pb裡面的某些請求不想處理,咋辦,使用配置么,嗯,看來還是對文件的解析操作。

e、對於後期增加文件,是刪除重新生成,還是指添加少量代碼段,intellij是否有提供方法,比如往類里添加方法,添加欄位等等,是否有類似好用的介面?


那麼,我的這些需求到底可行不可行,經過我自己的調研,我大概了解了以下幾個概念,就基本斷定可行了:

a、VFS 相關(VirtualFileSystem)

https://www.jetbrains.org/intellij/sdk/docs/basics/virtual_file_system.html

提供一個處理文件的通用API,而不關心文件的具體位置(無論文件位於磁碟上、歸檔文件中還是HTTP伺服器上)追蹤文件變化,並且在檢測到文件內容發生更改時能提供新舊兩個版本的文件建立文件在VFS和持久化存儲之間的關聯比如,我做插件的過程中,就用到了VFS來定位文件。

需要注意的是,文件的寫操作是需要是需要放到非同步線程中去處理的,不然插件會報錯,這也是很多平台都具備的特性,耗時操作丟在非同步線程,避免主線程卡頓

b、PSI相關(Program Structure Interface)

https://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/psi.html

PSI(Program Structure Interface)是Intellij Platform中一個非常重要的概念,在IDE所管理的Project中,每個目錄,Package,源代碼和資源文件都會被抽象成相應的PSI對象。這個好處可以是大大的,比如有這麼一些好用的api

這就使得我們給已有的內中添加方法提供了便利,而不是去做底層的文件讀寫操作。

還有例如:

從一段代碼創建一個文件,這對於代碼生成也是相當有用。這些生成的文件你將其加入到不同的package下面,他會自動補上包名 ,等等其他的一些好處。

c、Project Model

https://www.jetbrains.org/intellij/sdk/docs/basics/project_structure.html

提供了一些api處理項目結構相關。

7、插件開發這方面的資料非常少,那麼,有時候要實現功能,卻不知道怎麼下手怎麼辦,有一個可行的辦法是,找一個功能有點類似的插件,然後如果 有源碼就去github上去閱讀別人的代碼,挖出功能點的實現方式,基本上就能變成自己的了。

8、插件打包,因為我是專用插件,所以我直接打本地包了。

打包相當簡單,直接

就會打包出一個jar文件,或者zip文件,去插件中心安裝即可。隨後你就可以使用你自己製作的插件啦。

五、附加學習資源

1、翻譯插件源碼,很值得學習

https://github.com/YiiGuxing/TranslationPlugin

2、一位網友寫的插件開發教程,作為入門參考

https://juejin.im/post/599f7f546fb9a0248c2de496

3、官方教程不太友好,但是也有些作用的教程的,畢竟官方~

https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/creating_plugin_project.html

最後祝大家順利做出自己想要的插件~~

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雲加社區 的精彩文章:

python3和python2共存
如何打造一隻執行力強的團隊

TAG:雲加社區 |