轉(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平臺插件主要分為如下幾類:
- 自定義編程語言的支持(Custom language support):包括語法高亮、文件類型識別贸桶、代碼格式化舅逸、代碼查看和自動補全等等
- 框架集成(Framework integration):其實就是類似基于IntelliJ開發(fā)一個IDE出來,比如AndroidStudio 將Android SDK集成進IntelliJ皇筛。其他的插件如Java EE中的Spring琉历、Struts等framework集成到IntelliJ。使用戶在IntelliJ上面使用特定的框架更方便水醋。
- 工具集成(Tool integration):對IntelliJ定制一些個性化或者是實用的工具旗笔。
- 附加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下載地址如下:
2. 創(chuàng)建項目
選擇“File>New>Project...”,將Project選擇為IntelliJ Platform Plugin,然后再點擊Next忿薇。如下圖所示:
填寫Project名稱及項目保存路徑裙椭,其中Project Name可以認為是插件名稱躏哩。點擊Finish,如下圖所示揉燃。
完成后扫尺,創(chuàng)建的項目結(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
將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
屬性用于描述位置墩朦,主要有四個選項:first
、last
翻擒、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"項缆毁,運行如下:
6. 其他
6.1 自動配置plugin.xml
前面我們通過收到創(chuàng)建Java類番川,然后基礎(chǔ)AnAction類的方式創(chuàng)建Action。并且最后還需要收到配置plugin.xml脊框。其實可以無需手動編寫颁督,直接通過New>Action的方式創(chuàng)建,如下圖所示浇雹。
打開的圖形化創(chuàng)建界面如下:
可以看到沉御,需要填寫的部分跟我們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文件栋操,如下圖:
這個文件即為我們導(dǎo)出的插件闸餐。接下來打開AndroidStudio,點擊“File>Settings>Plugins”
點擊“install plugin from disk...”,將HelloWorld.jar包加入即可完成安裝矾芙。
我在安裝過程中出現(xiàn)如下錯誤(Plugin display name here為插件名稱):
從錯誤提示上看舍沙,是不兼容錯誤√尴埽回到plugin.xml拂铡,從中找到一行:
<idea-version since-build="145.0"/>
這是指定IntelliJ IDEA為2016年1月發(fā)布的版本(點擊這里查看對應(yīng)的版本),顯然,我的AndroidStudio還沒使用那么新的IntelliJ IDEA葱绒,因此把145修改小一點就好和媳,比如我修改為105.0,重新打包再安裝哈街。運行如下:
點擊后: