AndroidStudio插件基本流程

前言

雖是AndroidStudio插件開(kāi)發(fā),但由于AndroidStudio是基于IDEA的,所以AndroidStudio插件開(kāi)發(fā),其實(shí)也是IDEA插件開(kāi)發(fā)购桑。

插件開(kāi)發(fā)環(huán)境配置

IDEA官網(wǎng)下載IDEA。
IDEA分為社區(qū)版(Community Edition)和旗艦版(Ultimate Edition)

  • 社區(qū)版:完全免費(fèi)氏淑,代碼開(kāi)源勃蜘,但是缺少一些旗艦版中的高級(jí)特性。
  • 旗艦版:30天免費(fèi)假残,支持全部功能缭贡,代碼不開(kāi)源。
    AndroidStudio插件開(kāi)發(fā)下載Community 版本即可.下載后傻瓜式安裝辉懒,一直下一步.

創(chuàng)建Plugin工程

目前來(lái)說(shuō)阳惹,IDEA插件工程有兩種模式,第一種是直接在IDEA中創(chuàng)建插件開(kāi)發(fā)的項(xiàng)目眶俩,第二種是使用Gradle來(lái)構(gòu)建Intellij插件莹汤。下面兩種方式都會(huì)介紹下:

方式一:IDEA中新建plugin項(xiàng)目

  • 創(chuàng)建plugin項(xiàng)目:


    1.png
  • 在創(chuàng)建項(xiàng)目時(shí)選擇IntelliJ Platform Plugin
  • Project SDK需要選擇插件開(kāi)發(fā)特有的SDK(注意不是JDK),沒(méi)有相應(yīng)的SDK需要new一個(gè)
  • 可以根據(jù)自己需要開(kāi)發(fā)的插件選擇相應(yīng)的庫(kù)和框架(可選颠印,后期可再增加)

這時(shí)就完成了插件項(xiàng)目的創(chuàng)建纲岭,如下所示:


2.png

可以看到創(chuàng)建出的project非常的簡(jiǎn)單抹竹,僅在META-INF文件夾中有一個(gè)plugin.xml配置文件~plugin.xml配置文件會(huì)在后面具體介紹。

方式二:使用Gradle來(lái)構(gòu)建Intellij插件

作為一個(gè)Android開(kāi)發(fā)人員止潮,gradle的好處大家都懂窃判。

首選需要?jiǎng)?chuàng)建一個(gè)Gradle項(xiàng)目:
3.png

創(chuàng)建好的Gradle項(xiàng)目中會(huì)出現(xiàn)一堆與Gradle相關(guān)的文件夾和文件,這個(gè)時(shí)候只需要關(guān)注build.gradle即可喇闸。
  • 添加 IntelliJ build plugins倉(cāng)庫(kù)地址
plugins { 
    id 'org.jetbrains.intellij' version '0.3.1' 
}
  • 使用IntelliJ IDEA的插件
apply plugin: "org.jetbrains.intellij" 
apply plugin: 'java' 
apply plugin: 'idea
  • 設(shè)置運(yùn)行插件的IntelliJ的版本以及沙箱地址
intellij { 
    version = '***.**' //調(diào)試我們插件的版本 
    sandboxDirectory = project.rootDir.canonicalPath + "/.sandbox" //插件生成的臨時(shí)文件的地址袄琳,可以省略
}

兩種創(chuàng)建方式的差異

項(xiàng)目本身的差異

  • SDK的差異:
    • 使用IDEA創(chuàng)建的插件項(xiàng)目中SDK為 IDEA插件專用的SDK
    • 使用Gradle編譯的插件項(xiàng)目SDK為 JDK
  • idea.iml文件中type不同
    • 使用IDEA創(chuàng)建的插件項(xiàng)目中xxx.iml中type為PLUGIN_MODULE
    • 使用Gradle編譯的插件項(xiàng)目中xxx.iml中type為JAVA_MODULE

運(yùn)行方式的差異

  • 舊版本IDEA,對(duì)于創(chuàng)建的插件項(xiàng)目在運(yùn)行時(shí)需要?jiǎng)?chuàng)建一個(gè)plugin的運(yùn)行方式


    3.png
    • Use classpath of module:選擇當(dāng)前的module即可燃乍,這里需要注意如果xxx.iml文件中type不為PLUGIN_MODULE那么這里將會(huì)找不到該MODULE唆樊,會(huì)報(bào)Run Configuration Error: No plugin module specified for configuration錯(cuò)誤
    • JRE選擇插件SDK默認(rèn)JRE

最新版IDEA中創(chuàng)建插件項(xiàng)目時(shí)已經(jīng)自動(dòng)增加運(yùn)行方式,無(wú)需再創(chuàng)建

同樣對(duì)于使用Gradle編譯的插件項(xiàng)目橘沥,舊版本IDEA窗轩,需要?jiǎng)?chuàng)建gradle的運(yùn)行方式。并將Tasks設(shè)置為 :runIde

plugin.xml

IDEA插件的工程創(chuàng)建完畢后座咆,都會(huì)在META目錄下創(chuàng)建一個(gè)plugin.xml文件,類似Android的AndroidMainFest.xml仓洼,就是一些配置項(xiàng)
創(chuàng)建后文件中大概方式為

<idea-plugin>
  <id>com.your.company.unique.plugin.id</id>
  <name>Plugin display name here</name>
  <version>1.0</version>
  <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>

  <description><![CDATA[
      Enter short description for your plugin here.<br>
      <em>most HTML tags may be used</em>
    ]]></description>

  <change-notes><![CDATA[
      Add change notes here.<br>
      <em>most HTML tags may be used</em>
    ]]>
  </change-notes>

  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
  <idea-version since-build="173.0"/>

  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
       on how to target different products -->
  <!-- uncomment to enable plugin in all products
  <depends>com.intellij.modules.lang</depends>
  -->

  <extensions defaultExtensionNs="com.intellij">
    <!-- Add your extensions here -->
  </extensions>

  <actions>
    <!-- Add your actions here -->
  </actions>

</idea-plugin>
  • 大概解釋下其中各個(gè)標(biāo)簽作用

    • id:表示當(dāng)前插件的唯一id號(hào)
    • name:插件的名稱
    • version:插件的版本號(hào)
    • vendor:填寫開(kāi)發(fā)人的郵箱介陶,公司名稱
    • description:插件的描述,如果將插件上傳到IDEA的倉(cāng)庫(kù)后色建,在進(jìn)行下載的時(shí)候就會(huì)顯示該描述
    • idea-version:表示當(dāng)前插件所支持的所有Intellij Idea 的版本, 詳細(xì)信息可以參照這個(gè)對(duì)應(yīng)關(guān)系
    • extensions:這里一般會(huì)放一些我們自己的擴(kuò)展的東西哺呜,比如新增高亮顯示,新增語(yǔ)言支持都是需要在這里進(jìn)行擴(kuò)展
    • actions:新增的Action類需要在這里注冊(cè)箕戳,用于菜單欄擴(kuò)展

一些在此配置的id某残、name、versio陵吸、description等信息玻墅,即是在插件下載選擇頁(yè)時(shí)看到的信息

=============到此完成項(xiàng)目創(chuàng)建================

AnAction

當(dāng)我們想擴(kuò)展IDEA提供的菜單欄,那么就可以通過(guò)創(chuàng)建Action類來(lái)實(shí)現(xiàn)相應(yīng)的功能壮虫。

創(chuàng)建Action

創(chuàng)建Action有兩種方式:

  • 方式1:創(chuàng)建一個(gè)類澳厢,然后繼承AnAction類,通過(guò)重寫其actionPerformed()方法囚似,,最后需要在Plugin.xml中進(jìn)行配置
  • 方式2: 通過(guò)IDEA提供的界面進(jìn)行創(chuàng)建剩拢,并重寫其actionPerformed()方法,如下圖所示


    4.png

actionPerformed() 方法即為點(diǎn)擊對(duì)應(yīng)action菜單項(xiàng)回調(diào)執(zhí)行的方法

在用方式2生成時(shí)饶唤,會(huì)彈出如下截圖
8.jpg
屬性 描述
Action ID 這個(gè)Action的唯一標(biāo)示
Class Name 類名徐伐,即自定義繼承AnAction的子類名
Name 這個(gè)action在菜單上的名稱
Description 這個(gè)action描述信息
Groups group-id決定著當(dāng)前group或者action顯示在工具欄的具體地方,如果如圖所示募狂,CodeMenu代表在Code菜單下
Anchor anchor決定著該action或者group顯示在該工具欄的具體地方办素,first代表第一位
KeyboardShortcuts 代表喚起action的快捷方式角雷,同AndroidStudiowwS中我們?cè)O(shè)置各種快捷方式一樣,圖中設(shè)置 ?+?+A

點(diǎn)擊OK后對(duì)應(yīng)pligin.xml多出如下action元素摸屠,這些元素與我們創(chuàng)建時(shí)所填寫信息相對(duì)應(yīng)谓罗,我們?nèi)绻ㄟ^(guò)方式1創(chuàng)建action即需要寫這些配置,同理季二,我們通過(guò)方式2創(chuàng)建的action檩咱,后期也可以根據(jù)自身需要再手動(dòng)更改。


2.jpg

創(chuàng)建界面

這時(shí)我們就需要用到Java Swing的相關(guān)api了胯舷,我們知道連整個(gè)IDEA界面都是用Java Swing實(shí)現(xiàn)的刻蚯。
所以參加復(fù)雜的功能肯定離不開(kāi)Java Swing,這又是另外一片大海桑嘶。官方文檔在此 不做詳述炊汹。

在此我們僅實(shí)現(xiàn)簡(jiǎn)單的彈窗功能。在actionPerformed利用如下sdk封好的方法

   @Override
    public void actionPerformed(AnActionEvent anActionEvent) {
        // TODO: insert com.peyton.base64.action logic here
       Messages.showDialog("testContent","testTitle",new String[]{"OK"},-1,null);

    }

運(yùn)行及調(diào)試

開(kāi)發(fā)時(shí)點(diǎn)擊運(yùn)行按鈕逃顶,即可打開(kāi)另一個(gè)IDEA窗口(如果沒(méi)有則自己手動(dòng)創(chuàng)建一個(gè)項(xiàng)目)讨便,在該窗口中即是模擬插件安裝所在IDE,在該窗口中可調(diào)試以政、查看插件效果

發(fā)布及安裝

  • 生成jar或zip包 點(diǎn)擊Bulid菜單下的Prepare Plugin按鈕會(huì)在項(xiàng)目的根目錄生成插件的jar或zip包霸褒。如果插件無(wú)其它引用則為jar包,有其它等依賴則為zip包盈蛮。將該jar或zip包废菱,發(fā)給需要的人員,然后在setting-->Plugin-->Install plugin from disk 選擇對(duì)應(yīng)jar或zip包即可
1.jpg
  • 還可以把插件發(fā)布到倉(cāng)庫(kù)抖誉,讓其他人也能使用殊轴,進(jìn)入JetBrains官網(wǎng),注冊(cè)賬號(hào)袒炉,提交插件jar包旁理,填寫相關(guān)信息,等待審核就可以了梳杏。

最終運(yùn)行效果

test.gif

小拓展

自定義菜單組

以上只是簡(jiǎn)單將action放在ide一級(jí)菜單中韧拒,當(dāng)然我們還可以定義自己的菜單組,然后加入一級(jí)菜單中.我們?cè)趐lugin.xml中配置如下代碼,自定義二級(jí)菜單列表

...
 <actions>
    <!-- Add your actions here -->

    <group id="MyTestGroup" text="TestGroup" description="Just Test Group extension" popup="true">
      <!-- 中間有action刪減 -->
      <add-to-group group-id="RefactoringMenu" anchor="last"/>
      <action id="MyFirstAction" class="com.peyton.testproject.action.FristActinClass" text="ShowInMyGroup"
              description="展示基本dialog">
        <add-to-group group-id="RefactoringMenu" anchor="first"/>
        <keyboard-shortcut keymap="$default" first-keystroke="shift ctrl A"/>
      </action>
    </group>
  </actions>
...

效果則如圖


1.jpg
重寫update函數(shù)

為了響應(yīng)用戶的點(diǎn)擊事件十性,我們重寫了actionPerformed方法叛溢。在actionPerformed方法中執(zhí)行一些響應(yīng)的邏輯,比如彈出一個(gè)對(duì)話框劲适,在打開(kāi)的class中自動(dòng)生成相關(guān)的代碼等操作楷掉。

但是有時(shí)候我們定義的插件只在某些場(chǎng)景中才可以使用,比如說(shuō)我們編寫自動(dòng)生成代碼的插件時(shí)霞势,只有當(dāng)文件打開(kāi)且是相應(yīng)的類型時(shí)才能正常執(zhí)行烹植;如果不符合條件斑鸦,就應(yīng)該將插件按鈕置為不能點(diǎn)擊。

當(dāng)我們不希望用戶點(diǎn)擊我們定義的插件時(shí)草雕,我們可以將插件隱藏巷屿,讓用戶無(wú)法看到插件,只有當(dāng)符合插件執(zhí)行的環(huán)境時(shí)墩虹,才讓插件在菜單中顯示~

這時(shí)為了能讓用戶在點(diǎn)擊自定義插件對(duì)應(yīng)的菜單欄之前動(dòng)態(tài)判斷該插件是否能夠點(diǎn)擊嘱巾,只需要重寫update函數(shù)。

update什么時(shí)候被回調(diào)呢诫钓?在IDEA中有很多的菜單欄旬昭,比如help,Window菌湃,Tools等等问拘,當(dāng)點(diǎn)擊這些菜單欄使得Action菜單項(xiàng)顯示出來(lái)時(shí),就會(huì)回調(diào)update函數(shù)惧所。

update或actionPerformed函數(shù)被回調(diào)時(shí)骤坐,會(huì)傳入AnActionEvent對(duì)象,通過(guò)AnActionEvent對(duì)象我們可以判斷出當(dāng)前編輯框是否打開(kāi)等實(shí)時(shí)的IDEA環(huán)境狀況下愈。

本文只是講解一些插件創(chuàng)建的基本流程或油,具體需求,比如需要獲取當(dāng)前打開(kāi)窗口類型是否可編輯驰唬、當(dāng)前文件類型、文件結(jié)構(gòu)如文件名類名腔彰、變量等信息叫编,異步線程操作等信息,可參照 官網(wǎng)API 或者 IDEA社區(qū)版源代碼 進(jìn)行操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市霹抛,隨后出現(xiàn)的幾起案子搓逾,更是在濱河造成了極大的恐慌,老刑警劉巖杯拐,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霞篡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡端逼,警方通過(guò)查閱死者的電腦和手機(jī)朗兵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)顶滩,“玉大人余掖,你說(shuō)我怎么就攤上這事〗嘎常” “怎么了盐欺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵赁豆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我冗美,道長(zhǎng)魔种,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任粉洼,我火速辦了婚禮节预,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漆改。我一直安慰自己心铃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布挫剑。 她就那樣靜靜地躺著去扣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪樊破。 梳的紋絲不亂的頭發(fā)上愉棱,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音哲戚,去河邊找鬼奔滑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛顺少,可吹牛的內(nèi)容都是我干的朋其。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脆炎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梅猿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起秒裕,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袱蚓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后几蜻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體喇潘,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年梭稚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颖低。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哨毁,死狀恐怖枫甲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤想幻,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布粱栖,位于F島的核電站,受9級(jí)特大地震影響脏毯,放射性物質(zhì)發(fā)生泄漏闹究。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一食店、第九天 我趴在偏房一處隱蔽的房頂上張望渣淤。 院中可真熱鬧,春花似錦吉嫩、人聲如沸价认。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)用踩。三九已至,卻和暖如春忙迁,著一層夾襖步出監(jiān)牢的瞬間脐彩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工姊扔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惠奸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓恰梢,卻偏偏與公主長(zhǎng)得像佛南,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嵌言,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,790評(píng)論 25 707
  • 今天是周日共虑,準(zhǔn)備看籃球賽。期待一場(chǎng)精彩的球賽呀页。
    隨遇而安SZ閱讀 190評(píng)論 0 0
  • 精誠(chéng)所至 金石為開(kāi) ——再讀《追風(fēng)箏的人》 1 《追風(fēng)箏的人》后半部分主要講了成年的阿米爾從...
    向陽(yáng)花z閱讀 198評(píng)論 0 2
  • 圖引】看見(jiàn)你,還能說(shuō)什么? 只能把奢望勾銷拥坛! 落魄 在雨水里漂泊 橘黃說(shuō) 你應(yīng)該到大海里 挫敗 在小路上游蕩 拐杖...
    毛新建閱讀 268評(píng)論 0 2