AndroidStudio插件開發(Hello World篇)

轉載請注明出處:【huachao1001的簡書:http://www.lxweimin.com/users/0a7e42698e4b/latest_articles】

工欲善其事必先利其器,自打從Eclipse轉戰AndroidStudio以來,還沒徹底擺脫Eclipse。打算從開發AndroidStudio插件開始,徹底擺脫Eclipse。AndroidStudio基于IntelliJ平臺,因此,開發AndroidStudio插件其本質只是開發IntelliJ平臺的插件。通常我們開發的IntelliJ平臺插件主要分為如下幾類:

  1. 自定義編程語言的支持(Custom language support):包括語法高亮、文件類型識別、代碼格式化、代碼查看和自動補全等等
  2. 框架集成(Framework integration):其實就是類似基于IntelliJ開發一個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

在開發IntelliJ插件時,我們使用的是IntelliJ IDEA自身來開發。為什么不用AndroidStudio來開發呢?主要是AndroidStudio是面向Android開發的,在針對IntelliJ插件的各種環境都沒有,當然,你也可以自己下載插件開發環境然后在AndroidStudio上去配置。但是個人覺得過于麻煩,IntelliJ IDEA集成了插件開發環境,下載后可以直接拿來開發插件。IntelliJ IDEA下載地址如下:

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

2. 創建項目

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

選擇IntelliJ Platform Plugin

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

填寫Project name

完成后,創建的項目結構如下所示:

項目結構

我們比較關心的主要是src目錄和resources/META-INF/plugin.xml文件。src目錄存放的是插件對應的Java源碼,resources/META-INF/plugin.xml是配置Action的文件,關于Action后面講,現在暫時可以將resources/META-INF/plugin.xml看成是插件的配置文件。

3. 創建Action

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

創建Java類

FirstPlugin繼承AnAction類,并重寫actionPerformed函數。

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

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

<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>

每個標簽的具體作用在注釋中解釋的很詳細,我們現在只關心<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:顯示的文字,如我們自定義的插件放在菜單列表中,這個文字就是對應的菜單項
description:對這個AnAction的描述

另外還有<add-to-group>標簽,這個標簽指定我們自定義的插件應該放入到哪個菜單下面。在IntelliJ IDEA菜單欄中有很多菜單如File、Edit、View、Navigate、Code、......、Help等。他們的ID一般是菜單名+Menu的方式。比如,我們想將我們自定義的插件放到Help菜單中,作為Help菜單的子選項。那么在<add-to-group>標簽中指定group-id="HelpMenu"<add-to-group>標簽的anchor屬性用于描述位置,主要有四個選項:firstlastbeforeafter。他們的含義如下:

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

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

5. 運行

完成plugin.xml的修改后,點擊運行。會發現,運行時是自動再啟動新的IntelliJ IDEA。而新啟動的IntelliJ IDEA由于沒有可打開的項目會停留在如下界面:

啟動界面

為了能查看到我們的插件,可以點擊Create New Project或者是導入項目,總之,讓它正確進入到開發界面就好。

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

查看插件

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

HelloWorld

6. 其他

6.1 自動配置plugin.xml

前面我們通過收到創建Java類,然后基礎AnAction類的方式創建Action。并且最后還需要收到配置plugin.xml。其實可以無需手動編寫,直接通過New>Action的方式創建,如下圖所示。

new Action

打開的圖形化創建界面如下:

New Action

可以看到,需要填寫的部分跟我們plugin.xml中的一一對應。

6.2 卸載插件

當我們按照上面的方面再創建一個插件時,發現上一次的插件還會出現。而且我們創建的新的插件不會出現,這是什么原因呢?這主要是,我們沒有修改插件名稱,并且沒有修改版本。這樣的話自然就沒有覆蓋原先的插件了。因此我們有2種方法,第一種就是將原來的插件卸載,第二種就是將新建的插件名稱與原先的區分開來(在plugin.xml中 <name>標簽中指定)。第二種方法比較簡單,我們看看第一種方法。

首先,點擊“File>Settings>Plugins”,如下圖。

卸載插件

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

6.3 打包插件并在AndroidStudio中安裝

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

打包插件

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

jar包

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

安裝插件

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

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

Error

從錯誤提示上看,是不兼容錯誤。回到plugin.xml,從中找到一行:

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

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

Hello Wrold

點擊后:

運行結果

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容