Android Studio Plugin 插件開(kāi)發(fā)教程(一) —— 開(kāi)發(fā)你的第一個(gè)插件

項(xiàng)目源碼

https://github.com/boredream/AndroidDatabaseGeneratorPlugin

系列教程

Android Studio Plugin 插件開(kāi)發(fā)教程(一) —— 開(kāi)發(fā)你的第一個(gè)插件

Android Studio Plugin 插件開(kāi)發(fā)教程(二) —— 插件SDK中的常用對(duì)象介紹

Android Studio Plugin 插件開(kāi)發(fā)教程(三) —— 制作一個(gè)自動(dòng)生成數(shù)據(jù)庫(kù)代碼的插件

Android Studio Plugin 插件開(kāi)發(fā)教程(四) —— 為自動(dòng)生成數(shù)據(jù)庫(kù)代碼的插件添加UI


本教程基于官方文檔編寫(xiě),原版地址如下
官方文檔 http://www.jetbrains.org/intellij/sdk/docs/welcome.html

搭建環(huán)境:
下載IntelliJ Idea客戶端并安裝
https://www.jetbrains.com/idea/download/

一、配置SDK

打開(kāi)IDE后,選擇 File | Project Structure
在配置窗口中點(diǎn)擊 New... 新增SDK,選擇 IntelliJ Platform Plugin SDK
(如果第一次打開(kāi)IDE,選擇右下角 Configure | Project Defaults | Project Structure 打開(kāi)配置窗口)

Project Structure

彈出頁(yè)面中,選擇默認(rèn)IntelliJ IDEA文件夾,確認(rèn)
Project Structure

二、新建Plugin Project

在打開(kāi)的IntelliJ IDEA 中選擇 File | New | Project
左側(cè)菜單選擇IntelliJ Platform Plugin項(xiàng)目,SDK選擇剛才新配置的,下一步
其中 Groovy、Python等啥其他附加的內(nèi)容無(wú)需勾選
最后輸入項(xiàng)目名稱確定,完成創(chuàng)建

New Project

三、配置插件項(xiàng)目

創(chuàng)建好的Plugin項(xiàng)目中,會(huì)默認(rèn)生成一個(gè) plugin.xml 的配置文件
其中可以修改該插件項(xiàng)目的相關(guān)配置信息,比如插件名稱、插件版本號(hào)等,如下圖

Paste_Image.png

各標(biāo)簽意義具體為:

  • <id> 插件id,類似于Android項(xiàng)目的包名,不能和其他插件項(xiàng)目重復(fù),所以推薦使用com.xxx.xxx的格式
  • <name> 插件名稱,別人在官方插件庫(kù)搜索你的插件時(shí)使用的名稱
  • <version> 插件版本號(hào)
  • <vendor> 插件發(fā)布者信息,可以添加郵箱鏈接
  • <description> 插件描述信息,在這里可以介紹你的插件內(nèi)容,支持HTML標(biāo)簽
  • <change-notes> 插件版本變更日志,支持HTML標(biāo)簽
  • <idea-version> 對(duì)IntelliJ IDEA軟件支持本插件版本號(hào)
    分為since-build最低版本 和 until-build最高版本,兩個(gè)屬性可以任選一或者同時(shí)使用
    官網(wǎng)有詳細(xì)介紹 http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html
    大體規(guī)則為 since-build <= 支持版本 < until-build
  • <extensions> 自定義擴(kuò)展,暫時(shí)用不到
  • <actions> 具體的插件動(dòng)作,后面會(huì)介紹

配置中填寫(xiě)的信息,會(huì)在別人搜索你插件的時(shí)候展現(xiàn)介紹
File | Settings | Plugins 中查看已有插件,或者再點(diǎn)擊Browse respositories中瀏覽插件中心里其他人發(fā)布的插件
當(dāng)選中一個(gè)插件時(shí),右側(cè)就可以看到plugin.xml中配置的信息了
同樣,這里也可以進(jìn)行插件的刪除和添加安裝操作,每次操作都需要重啟軟件后才能生效

Plugins

四、開(kāi)始編寫(xiě)插件

插件是依附于IDE的,為其提供一些小功能,比如Android Studio中,
Code | Generate | Getter and Setter 這個(gè)自動(dòng)生成get和set方法的,其實(shí)就算是個(gè)插件

Getter and Setter

當(dāng)然,這些都是Android Studio中默認(rèn)自帶的,我們可以根據(jù)需要開(kāi)發(fā)新的插件

項(xiàng)目創(chuàng)建好時(shí)有一個(gè)src文件夾,可以在其中File | New ...新建文件,
主要有這么幾種針對(duì)插件的特殊文件類型

  • GUI Form:表單界面
  • Dialog:對(duì)話框
  • XXXComponent:作用域類,其中又分為Application、Project、Module分為作用于不同范圍
  • Action:處理插件交互行為的類

其中最主要的是Action類
之前例子中提到了,生成getter setter方法的功能是在菜單欄中的Code | Generate | Getter and Setter選擇的
那么我們自己創(chuàng)建的插件選項(xiàng)在哪里呢?屬于哪個(gè)菜單呢?

這里在創(chuàng)建Action類的時(shí)候就可以指定操作入口,Action的創(chuàng)建的對(duì)話框如下


New Action
  • Action ID: 動(dòng)作ID,推薦用“插件名.XXAction”的格式
  • Class Name:編寫(xiě)Action的類文件名
  • Name:動(dòng)作在菜單選項(xiàng)中展示的名字
  • Description:動(dòng)作描述
  • Groups:定義這個(gè)動(dòng)作選項(xiàng)所屬的組,比如EditMenu就對(duì)應(yīng)IDE菜單欄上的Edit,CodeMenu就對(duì)應(yīng)菜單欄上的Code
  • Actions:是當(dāng)前選中Groups下已有的Action動(dòng)作,比如上圖示如果我們選擇CodeMenu就會(huì)展示Code中已有的幾個(gè)選項(xiàng)
  • Anchor:用來(lái)指定動(dòng)作選項(xiàng)在Groups中的位置,F(xiàn)rist就是最上面、Last是最下面,也可以設(shè)在某個(gè)選項(xiàng)的上/下方
  • Keyboard Shortcuts:調(diào)用插件Action的快捷鍵,可以不填,要注意熱鍵沖突

創(chuàng)建好Action后,會(huì)自動(dòng)在plugin.xml配置文件的actions標(biāo)簽中新增一個(gè)對(duì)應(yīng)的Action動(dòng)作信息

<actions>
    <!-- Add your actions here -->
    <action id="DatabaseGenerator.GenAction" class="DatabaseGenerateAction" text="Database Generator"
            description="auto generate db code, such as Table / CRUD sql ...">
      <add-to-group group-id="CodeMenu" anchor="last"/>
    </action>
  </actions>

注意

  • 這里的信息我們都可以再次修改,但是class name修改時(shí)要注意和類文件名匹配
  • <add-to-group group-id>可以修改添加多個(gè),即在不同菜單中都可以選擇使用
  • 同一個(gè)group下多個(gè)action的id不能重復(fù)

src下創(chuàng)建好的Action類會(huì)默認(rèn)繼承 AnAction,然后實(shí)現(xiàn) actionPerformed 方法,
我們仿造官方文檔中的例子,在方法中添加如下代碼,讓點(diǎn)擊這個(gè)Action的時(shí)候彈出一個(gè)輸入框

public class DatabaseGeneratorAction extends AnAction {
    @Override
    public void actionPerformed(AnActionEvent e) {
        Project project = e.getData(PlatformDataKeys.PROJECT);
        String txt = Messages.showInputDialog(project,
                "What is your name?",
                "Input your name",
                Messages.getQuestionIcon());
        Messages.showMessageDialog(project,
                "Hello, " + txt + "!\n I am glad to see you.", 
                "Information",
                Messages.getInformationIcon());
    }
}

寫(xiě)好代碼后,run運(yùn)行項(xiàng)目~
此時(shí)會(huì)自動(dòng)啟動(dòng)一個(gè)新的IntelliJ IDEA項(xiàng)目,這個(gè)新項(xiàng)目里就會(huì)包含我們剛編寫(xiě)的插件選項(xiàng)了

如果想調(diào)試Android代碼,可以先在IntelliJ中的Project Structure里配置好Android環(huán)境,然后run插件項(xiàng)目運(yùn)行新的IntelliJ時(shí)建一個(gè)Android Project就好了

新運(yùn)行起來(lái)的IDE中就可以看到菜單欄里的 Code 最底部就出現(xiàn)了一個(gè)Database Generator選項(xiàng)

plugin

點(diǎn)擊就會(huì)觸發(fā)我們編寫(xiě)的功能

plugin run

plugin run

如果你覺(jué)得你的插件不好找,也可以自行在根目錄上新建一個(gè)和Code、Edit等同級(jí)的group,需要在配置文件里新建一個(gè)group,然后<add-to-group>指定其添加到MainMenu主菜單上

<actions>
   <!-- Add your actions here -->
   <group id="BoredreamPlugin.PluginSet" text="BdPlugin" description="the plugin set by boredream">
      <add-to-group group-id="MainMenu" anchor="last"  />
      <action id="DatabaseGenerator.GenAction" class="DatabaseGenerateAction" text="Database Generator" description="A test menu item" />
   </group>
</actions>

這個(gè)時(shí)候再run插件就會(huì)發(fā)現(xiàn)它單獨(dú)建立了一個(gè)group

group

但是要慎用~ 畢竟每個(gè)插件都加一個(gè)group那主菜單欄就亂死了,不像藏在二級(jí)菜單里會(huì)低調(diào)的多

五、打包

(這里我們先把整個(gè)流程介紹完,更復(fù)雜的插件開(kāi)發(fā)會(huì)下一篇介紹)
比較簡(jiǎn)單,直接在頂部主菜單欄中選擇 Build | Prepare Plugin Module XXX For Deployment即可
打包前要注意把 plugin.xml 配置文件中的相關(guān)信息填寫(xiě)完整

group

當(dāng)提示完成后,會(huì)在項(xiàng)目根目錄下生成一個(gè) XXX.jar 的包

jar

類似于安卓打包生產(chǎn)的apk,這個(gè)時(shí)候你就可以把它丟給別人使用了

六、發(fā)布

不過(guò)安卓的apk發(fā)布,通常會(huì)有一個(gè)應(yīng)用市場(chǎng)比如Google Play,應(yīng)用寶啥的
IntelliJ的插件也有一個(gè)市場(chǎng),是官方提供的,可以在平臺(tái)上發(fā)布自己的插件
地址https://plugins.jetbrains.com/

publish plugin

打開(kāi)插件中心,注冊(cè)好賬號(hào),然后選擇Upload Plugin
將你生成的插件jar包上傳,然后選擇分類,最后確認(rèn)完成上傳

此時(shí)雖然完成上傳,但是最好要完善一下Plugin Detail信息,方便別人對(duì)你的插件有更詳細(xì)的了解
還要再設(shè)置一下插件的支持IDE范圍,否則別人可能在Android Studio插件庫(kù)里搜不到你的plugin!!!

IntelliJ開(kāi)發(fā)的插件是針對(duì)所有IntelliJ旗下產(chǎn)品的,而他們之間的插件庫(kù)市場(chǎng)是非相通的
所以發(fā)布插件的時(shí)候一定要指定你的插件是那些IDE可以使用的,比如要支持AndroidStudio
完善Plugin Detail信息的時(shí)候,會(huì)有一個(gè)選項(xiàng) Supported products 即支持產(chǎn)品范圍
默認(rèn)是 勾選了“使用插件中的配置里指定的產(chǎn)品范圍”
這種使用插件項(xiàng)目里的配置方式,需要你在plugin.xml中添加<depends>標(biāo)簽說(shuō)明,比較麻煩
<depends>用法參考 http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html

不過(guò)你也可以取消勾選,直接在上傳中心這里設(shè)置產(chǎn)品范圍,推薦這種方式~
IntelliJ的倆是默認(rèn)的,然后我們?cè)俟催xAndroid Studio,最后save保存更新

Paste_Image.png

七、安裝使用

打開(kāi)你常用的Android Studio開(kāi)始安裝使用這些插件吧,方式有兩種

  1. 從插件中心直接下載安裝
    IDE中選擇 File | Settings | Plugins ,彈出對(duì)話框中選 Browse respositories 瀏覽插件庫(kù)
    搜索你自己發(fā)布的插件,然后安裝~ 安裝完成后重啟Android Studio即可開(kāi)始使用插件了

  2. 從本地安裝插件jar包
    這種需要用到插件項(xiàng)目生成的jar包,
    選擇Browse respositories選項(xiàng)旁邊的 Install plugin from disk,然后找到j(luò)ar文件選中OK即可

Install Plugin

注意,新發(fā)布到市場(chǎng)的插件可能暫時(shí)搜不到,有延遲~

好了,介紹結(jié)束~

開(kāi)始編寫(xiě)你的第一個(gè)插件吧!!!

后續(xù)教程還會(huì)帶著大家一起開(kāi)發(fā)一個(gè)具體的實(shí)用插件,敬請(qǐng)期待~


最后安利下自己的插件,自動(dòng)布局文件的相關(guān)代碼,懶人必備!還不用引入第三方的注入框架!
https://github.com/boredream/BorePlugin
歡迎star和follow

Layout Creator
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,263評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,946評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,708評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,409評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,774評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,641評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,872評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,650評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容