插件開發(fā)系列
Android Studio插件開發(fā)1之插件介紹與環(huán)境搭建
Android Studio插件開發(fā)2之Action System
Android Studio插件開發(fā)3之Extensions And Extension Points(擴(kuò)展與擴(kuò)展點(diǎn))
我們每天都在使用Android Studio進(jìn)行開發(fā),測(cè)試,review奠支。在這過(guò)程中站楚,免不了接觸到各種IDE插件來(lái)幫助我們的工作趣兄,包括Android Studio本身其實(shí)就是在Intellij IDEA的基礎(chǔ)上添加各種插件以及針對(duì)性的優(yōu)化形成的跋理。所以其實(shí)為Android Studio開發(fā)插件,其實(shí)很多情況下也適用于Itellij IDEA(只要沒(méi)有依賴特定平臺(tái)的特性)拳恋。那么氮发,既然插件這么厲害渴肉,為什么我們不去自己學(xué)著寫一寫呢?
什么是插件
維基百科上關(guān)于插件的定義如下:
插件(又譯外掛爽冕,英文為Plug-in仇祭、Plugin、add-in扇售、addin前塔、add-on嚣艇、addon或extension)是一種電腦程序承冰,通過(guò)和應(yīng)用程序(例如網(wǎng)頁(yè)瀏覽器,電子郵件客戶端)的互動(dòng)食零,用來(lái)替應(yīng)用程序增加一些所需要的特定的功能困乒。最常見的有游戲、網(wǎng)頁(yè)瀏覽器的插件和媒體播放器的插件贰谣。
應(yīng)用程序之所以支持插件的使用原因很多娜搂,主要包括:使得第三方的開發(fā)者可以對(duì)應(yīng)用程序進(jìn)行擴(kuò)充、精簡(jiǎn)吱抚,或者將源代碼從應(yīng)用程序中分離出來(lái)百宇,去除因軟件使用權(quán)限而產(chǎn)生的不兼容。
插件的類型
依據(jù)官方文檔的說(shuō)法秘豹,主要有以下4中類型的插件
-
Custom language support
運(yùn)用Intellij平臺(tái)的強(qiáng)大的開放性和擴(kuò)展性携御,添加對(duì)一種編程語(yǔ)言的支持,如文件識(shí)別,詞法分析啄刹,語(yǔ)法高亮涮坐,代碼補(bǔ)全,語(yǔ)法檢查等等誓军,我使用過(guò)或著名的這類型的比較出名的插件有
-
Framework integration
整個(gè)編程框架的功能袱讹,這種插件進(jìn)行web開發(fā)的話會(huì)接觸的更多,Android開發(fā)的話昵时,本身Android插件就是一個(gè)最好的例子
-
Tool integration
在IDE內(nèi)與第三方工具交互捷雕,例如如果我們的開發(fā)電腦的usb被禁或沒(méi)有數(shù)據(jù)線的話可以用以下插件
-
User interface add-ons
改變IDE的界面,例如各種主題插件
實(shí)際上债查,還有各種類型的擴(kuò)展平臺(tái)功能的插件非区,在官方插件網(wǎng)站上列出的插件種類有如下圖列出的這么多種
插件能干什么
實(shí)際上,插件的類型的部分就很好的解答了這個(gè)問(wèn)題盹廷。通過(guò)應(yīng)用插件征绸,IDE可以為我們構(gòu)建開發(fā)環(huán)境、可以整合我們與優(yōu)秀的工具俄占,如git管怠,可以批量生成代碼,減少重復(fù)的敲樣板代碼缸榄,可以幫助我們尋找代碼的問(wèn)題渤弛,提高代碼的質(zhì)量......
Intellij插件開發(fā)與Android Application開發(fā)的對(duì)比
作為一個(gè)Android開發(fā)者,從Android Application開發(fā)的角度來(lái)類比就最恰當(dāng)不過(guò)了甚带。為Intellij平臺(tái)寫插件就好像為Android平臺(tái)寫應(yīng)用她肯。Intellij這個(gè)平臺(tái)就相當(dāng)于一個(gè)系統(tǒng),插件就是各種應(yīng)用程序鹰贵,Intellij平臺(tái)向外提供各種API來(lái)改變它的UI和行為晴氨,給開發(fā)者使用。
而事實(shí)上碉输,Intellij插件開發(fā)的框架架構(gòu)和Android應(yīng)用程序有挺大的相似之處
-
插件組件
vs
Android 四大組件Intellij提供了Action籽前、Extension、(Application/Project/Module)conponent敷钾、Service等插件的組件枝哄,像Android四大組件一樣,這些組件都需要在plugin.xml文件了注冊(cè)阻荒,這些基本的組件了插件的主要功能
-
UI component
vs
View/widgetUI界面的基本組件
-
plugin.xml
vs
AndroidManifest.xmlplugin.xml就是插件的說(shuō)明文件挠锥,提供了插件所有的基本信息:名字、作者侨赡、聯(lián)系方式蓖租、使用說(shuō)明纱控,最重要的是插件組件的聲明,想AndroidManifest.xml文件一樣菜秦,Intellij通過(guò)這個(gè)文件讀取并收集插件的信息甜害,在適當(dāng)時(shí)候調(diào)用通過(guò)plugin.xml注冊(cè)的組件的功能。
插件開發(fā)環(huán)境搭建
進(jìn)行Intellij平臺(tái)的插件開發(fā)球昨,應(yīng)該先安裝如下的軟件或下載相關(guān)代碼
- JDK(Java相關(guān)的開發(fā)尔店,這個(gè)必備了)
- Intellij IDEA Community
- Gradle(可選)
- Intellij IDEA Community源碼(可選,不過(guò)最好有)
使用Plugin DevKit
Intellij IDEA提供了一個(gè)工具專門給開發(fā)者開發(fā)插件主慰,值得一提的是嚣州,Plugin DevKit本身也是插件,不得不說(shuō)Intellij功能真的是強(qiáng)大共螺。
此種方式建立插件工程比較簡(jiǎn)單 File->new->project,打開new project對(duì)話框该肴,在左邊選擇Intellij Platform Plugin后一直確認(rèn)即可
Plugin DevKit的使用比較簡(jiǎn)單,這里不再敘述藐不,下面重點(diǎn)說(shuō)說(shuō)用為插件工程引入gradle構(gòu)建的功能
創(chuàng)建Project SDK
在上圖所示創(chuàng)建項(xiàng)目的時(shí)候匀哄,有個(gè)Project SDK的選項(xiàng)。寫插件的時(shí)候雏蛮,我們不只依賴JDK了涎嚼,畢竟我們要用到Intellij IDEA的API。這時(shí)用到的是Plugin SDK挑秉,如果還沒(méi)有的話法梯,點(diǎn)擊new新建,選擇 Intellij Platform Plugin SDK
犀概,路徑選擇你的Intellij IDEA的安裝目錄立哑。
關(guān)聯(lián)源碼
下載源碼
git clone --depth 1 git://git.jetbrains.org/idea/community.git idea
創(chuàng)建工程后,依次點(diǎn)擊File / Project Structure / SDKs姻灶,選擇Plugin SDK铛绰,點(diǎn)擊SourcePath,按“+”號(hào)選擇源碼目錄
使用gradle構(gòu)建
其實(shí)環(huán)境搭建這樣基本的開發(fā)步驟木蹬,本來(lái)是不想講的至耻,不過(guò)若皱,官網(wǎng)關(guān)于使用gradle的說(shuō)明非常簡(jiǎn)要并且我發(fā)現(xiàn)其實(shí)有問(wèn)題的镊叁,在多次碰壁和閱讀其他插件的源碼才搞明白怎樣使用,詳細(xì)步驟如下
創(chuàng)建一個(gè)gradle工程走触,在上圖的左邊選擇
Gradle
晦譬,按提示完成-
在build.gradle文件加入如下內(nèi)容
buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } maven { url 'http://dl.bintray.com/jetbrains/intellij-plugin-service' } } dependencies { classpath "gradle.plugin.org.jetbrains:gradle-intellij-plugin:0.1.10" } } apply plugin: 'org.jetbrains.intellij'
此時(shí)編譯工程,其實(shí)是無(wú)法構(gòu)建的互广,因?yàn)檫€沒(méi)有用到intellij這個(gè)gradle插件的命令敛腌,加入如下內(nèi)容即可
intellij {
plugins 'android' //使用android插件
version 'IC-2016.2.5' //指明使用的Intellij IDEA版本
pluginName 'xxxx' //插件名字
alternativeIdePath 'path to android studio'//如果想在Android Studio里運(yùn)行卧土,給出Android Studio的路徑
//下面兩個(gè)選項(xiàng)跟適配Intellij的版本有關(guān),具體可查看官網(wǎng)
updateSinceUntilBuild = false
sameSinceUntilBuild = false
}
其中最重要的是version
這一項(xiàng)像樊,如果注釋掉這一項(xiàng)的話尤莺,gradle默認(rèn)去下載最新版本的Intellij IDEA源碼,麻煩的地方就在此生棍,每次有版本更新颤霎,編譯時(shí)就會(huì)去下載源碼,即使本地倉(cāng)庫(kù)已經(jīng)有這個(gè)依賴涂滴,所以最好指定一個(gè)版本的源碼友酱,避免多次下載源碼,并且有時(shí)下載的速度很慢柔纵。
在官網(wǎng)上可以查看詳細(xì)的版本列表
如果在右側(cè)gradle的tool view里看到tasks里有intellij的選項(xiàng)
雙擊runIdea或者命令行輸入gradle runIdea
缔杉,即可構(gòu)建插件