AndroidStudio插件開發(fā)(Hello World篇)

轉(zhuǎn)載請注明出處:【huachao1001的簡書:http://www.reibang.com/users/0a7e42698e4b/latest_articles】

工欲善其事必先利其器米丘,自打從Eclipse轉(zhuǎn)戰(zhàn)AndroidStudio以來绒怨,還沒徹底擺脫Eclipse仿野。打算從開發(fā)AndroidStudio插件開始烙荷,徹底擺脫Eclipse。AndroidStudio基于IntelliJ平臺手幢,因此检眯,開發(fā)AndroidStudio插件其本質(zhì)只是開發(fā)IntelliJ平臺的插件关炼。通常我們開發(fā)的IntelliJ平臺插件主要分為如下幾類:

  1. 自定義編程語言的支持(Custom language support):包括語法高亮、文件類型識別贸桶、代碼格式化舅逸、代碼查看和自動補全等等
  2. 框架集成(Framework integration):其實就是類似基于IntelliJ開發(fā)一個IDE出來,比如AndroidStudio 將Android SDK集成進IntelliJ皇筛。其他的插件如Java EE中的Spring琉历、Struts等framework集成到IntelliJ。使用戶在IntelliJ上面使用特定的框架更方便水醋。
  3. 工具集成(Tool integration):對IntelliJ定制一些個性化或者是實用的工具旗笔。
  4. 附加UI(User interface add-ons):對標準的UI界面進行修改,如在編輯框里加一個背景圖片等拄踪。

1. 下載IntelliJ IDEA

在開發(fā)IntelliJ插件時蝇恶,我們使用的是IntelliJ IDEA自身來開發(fā)。為什么不用AndroidStudio來開發(fā)呢惶桐?主要是AndroidStudio是面向Android開發(fā)的艘包,在針對IntelliJ插件的各種環(huán)境都沒有,當(dāng)然耀盗,你也可以自己下載插件開發(fā)環(huán)境然后在AndroidStudio上去配置想虎。但是個人覺得過于麻煩,IntelliJ IDEA集成了插件開發(fā)環(huán)境叛拷,下載后可以直接拿來開發(fā)插件舌厨。IntelliJ IDEA下載地址如下:

https://www.jetbrains.com/idea/

2. 創(chuàng)建項目

選擇“File>New>Project...”,將Project選擇為IntelliJ Platform Plugin,然后再點擊Next忿薇。如下圖所示:

選擇IntelliJ Platform Plugin

填寫Project名稱及項目保存路徑裙椭,其中Project Name可以認為是插件名稱躏哩。點擊Finish,如下圖所示揉燃。

填寫Project name

完成后扫尺,創(chuàng)建的項目結(jié)構(gòu)如下所示:

項目結(jié)構(gòu)

我們比較關(guān)心的主要是src目錄和resources/META-INF/plugin.xml文件。src目錄存放的是插件對應(yīng)的Java源碼炊汤,resources/META-INF/plugin.xml是配置Action的文件正驻,關(guān)于Action后面講,現(xiàn)在暫時可以將resources/META-INF/plugin.xml看成是插件的配置文件抢腐。

3. 創(chuàng)建Action

我們在IntelliJ自定義的插件可以添加到菜單項目(如右鍵菜單中)或者是放在工具欄中姑曙。當(dāng)用戶點擊時觸發(fā)一個動作事件,IntelliJ則會回調(diào)AnAction類的actionPerformed函數(shù)迈倍。因此我們只需重寫actionPerformed函數(shù)即可伤靠。
src目錄中創(chuàng)建包名:com.huachao.plugin,然后,在com.huachao.plugin中創(chuàng)建java類啼染,類為FirstPlugin.java

創(chuàng)建Java類

FirstPlugin繼承AnAction類宴合,并重寫actionPerformed函數(shù)。

package com.huachao.plugin;

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;

/**
 * Created by HuaChao on 2016/12/24.
 */
public class FirstPlugin extends AnAction {
    @Override
    public void actionPerformed(AnActionEvent event) {
        Project project = event.getData(PlatformDataKeys.PROJECT);
        Messages.showMessageDialog(project, "Hello World!", "Information", Messages.getInformationIcon());
    }
}


4. 修改plugin.xml

上一節(jié)我通過繼承AnAction類來定義Action迹鹅,現(xiàn)在我們需要將我們自定義的插件放入到工具類或者是菜單子項中形纺,這就是通過plugin.xml指定。打開resources/META-INF/plugin.xml文件徒欣,IntelliJ幫我們自動生成內(nèi)容如下:

<idea-plugin version="2">
    <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="145.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>

每個標簽的具體作用在注釋中解釋的很詳細逐样,我們現(xiàn)在只關(guān)心<actions>標簽,暫時先忽略其他標簽打肝。在<actions>標簽中添加<action>子標簽脂新,如下所示:


<actions>

    <action id="HelloWorld.FirstPlugin" class="com.huachao.plugin.FirstPlugin" text="Hello World" description="A test menu ">
        <add-to-group group-id="HelpMenu" anchor="first"/>
    </action>

</actions>

<action>標簽屬性的簡單說明:

id:作為<action>標簽的唯一標識。一般以<項目名>.<類名>方式粗梭。
class:即我們自定義的AnAction類
text:顯示的文字争便,如我們自定義的插件放在菜單列表中,這個文字就是對應(yīng)的菜單項
description:對這個AnAction的描述

另外還有<add-to-group>標簽断医,這個標簽指定我們自定義的插件應(yīng)該放入到哪個菜單下面滞乙。在IntelliJ IDEA菜單欄中有很多菜單如File、Edit鉴嗤、View斩启、Navigate、Code醉锅、......兔簇、Help等。他們的ID一般是菜單名+Menu的方式。比如垄琐,我們想將我們自定義的插件放到Help菜單中边酒,作為Help菜單的子選項。那么在<add-to-group>標簽中指定group-id="HelpMenu"狸窘。<add-to-group>標簽的anchor屬性用于描述位置墩朦,主要有四個選項:firstlast翻擒、before氓涣、after。他們的含義如下:

first:放在最前面
last:放在最后
before:放在relative-to-action屬性指定的ID的前面
after:放在relative-to-action屬性指定的ID的后面

relative-to-action也是<add-to-group>的屬性韭寸。

5. 運行

完成plugin.xml的修改后柬批,點擊運行氨距。會發(fā)現(xiàn),運行時是自動再啟動新的IntelliJ IDEA铣焊。而新啟動的IntelliJ IDEA由于沒有可打開的項目會停留在如下界面:

啟動界面

為了能查看到我們的插件椰拒,可以點擊Create New Project或者是導(dǎo)入項目晶渠,總之,讓它正確進入到開發(fā)界面就好燃观。

接下來褒脯,點擊help菜單,會看到如下:

查看插件

點擊·"Hello World"項缆毁,運行如下:

HelloWorld

6. 其他

6.1 自動配置plugin.xml

前面我們通過收到創(chuàng)建Java類番川,然后基礎(chǔ)AnAction類的方式創(chuàng)建Action。并且最后還需要收到配置plugin.xml脊框。其實可以無需手動編寫颁督,直接通過New>Action的方式創(chuàng)建,如下圖所示浇雹。

new Action

打開的圖形化創(chuàng)建界面如下:

New Action

可以看到沉御,需要填寫的部分跟我們plugin.xml中的一一對應(yīng)。

6.2 卸載插件

當(dāng)我們按照上面的方面再創(chuàng)建一個插件時昭灵,發(fā)現(xiàn)上一次的插件還會出現(xiàn)吠裆。而且我們創(chuàng)建的新的插件不會出現(xiàn),這是什么原因呢烂完?這主要是试疙,我們沒有修改插件名稱,并且沒有修改版本抠蚣。這樣的話自然就沒有覆蓋原先的插件了效斑。因此我們有2種方法,第一種就是將原來的插件卸載,第二種就是將新建的插件名稱與原先的區(qū)分開來(在plugin.xml中 <name>標簽中指定)缓屠。第二種方法比較簡單奇昙,我們看看第一種方法。

首先敌完,點擊“File>Settings>Plugins”储耐,如下圖。

卸載插件

找到插件名稱滨溉,這里也就是“Plugin display name here”,因為一開始我們沒有修改插件名稱什湘,這個名詞是自動生成的。然后點擊Uninstall晦攒,最后重啟或者是關(guān)閉IntelliJ IDEA完成卸載闽撤。

6.3 打包插件并在AndroidStudio中安裝

回到主題,我們開發(fā)的插件是希望運行在AndroidStudio中脯颜。因此少不了在IntelliJ中打包和在AndroidStudio中安裝的過程哟旗。點擊“Build>Prepare All Plugin Modules For Deployment”,如下圖:

打包插件

這時在HelloWorld項目中多了一個HelloWorld.jar文件栋操,如下圖:

jar包

這個文件即為我們導(dǎo)出的插件闸餐。接下來打開AndroidStudio,點擊“File>Settings>Plugins”

安裝插件

點擊“install plugin from disk...”,將HelloWorld.jar包加入即可完成安裝矾芙。

我在安裝過程中出現(xiàn)如下錯誤(Plugin display name here為插件名稱):

Error

從錯誤提示上看舍沙,是不兼容錯誤√尴埽回到plugin.xml拂铡,從中找到一行:

 <idea-version since-build="145.0"/>

這是指定IntelliJ IDEA為2016年1月發(fā)布的版本(點擊這里查看對應(yīng)的版本),顯然,我的AndroidStudio還沒使用那么新的IntelliJ IDEA葱绒,因此把145修改小一點就好和媳,比如我修改為105.0,重新打包再安裝哈街。運行如下:

Hello Wrold

點擊后:

運行結(jié)果

參考資料:http://www.jetbrains.org/intellij/sdk/docs/index.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末留瞳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骚秦,更是在濱河造成了極大的恐慌她倘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件作箍,死亡現(xiàn)場離奇詭異硬梁,居然都是意外死亡,警方通過查閱死者的電腦和手機胞得,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門荧止,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事跃巡∥:牛” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵素邪,是天一觀的道長外莲。 經(jīng)常有香客問我,道長兔朦,這世上最難降的妖魔是什么偷线? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮沽甥,結(jié)果婚禮上声邦,老公的妹妹穿的比我還像新娘。我一直安慰自己摆舟,他們只是感情好亥曹,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盏檐,像睡著了一般歇式。 火紅的嫁衣襯著肌膚如雪驶悟。 梳的紋絲不亂的頭發(fā)上胡野,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音痕鳍,去河邊找鬼硫豆。 笑死,一個胖子當(dāng)著我的面吹牛笼呆,可吹牛的內(nèi)容都是我干的熊响。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诗赌,長吁一口氣:“原來是場噩夢啊……” “哼汗茄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铭若,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洪碳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叼屠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞳腌,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年镜雨,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫂侍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挑宠,靈堂內(nèi)的尸體忽然破棺而出菲盾,到底是詐尸還是另有隱情,我是刑警寧澤痹栖,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布亿汞,位于F島的核電站,受9級特大地震影響揪阿,放射性物質(zhì)發(fā)生泄漏疗我。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一南捂、第九天 我趴在偏房一處隱蔽的房頂上張望吴裤。 院中可真熱鬧,春花似錦溺健、人聲如沸麦牺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剖膳。三九已至,卻和暖如春岭辣,著一層夾襖步出監(jiān)牢的瞬間吱晒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工沦童, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仑濒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓偷遗,卻偏偏與公主長得像墩瞳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子氏豌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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