轉載請注明出處:【huachao1001的簡書:http://www.lxweimin.com/users/0a7e42698e4b/latest_articles】
工欲善其事必先利其器,自打從Eclipse轉戰AndroidStudio以來,還沒徹底擺脫Eclipse。打算從開發AndroidStudio插件開始,徹底擺脫Eclipse。AndroidStudio基于IntelliJ平臺,因此,開發AndroidStudio插件其本質只是開發IntelliJ平臺的插件。通常我們開發的IntelliJ平臺插件主要分為如下幾類:
- 自定義編程語言的支持(Custom language support):包括語法高亮、文件類型識別、代碼格式化、代碼查看和自動補全等等
- 框架集成(Framework integration):其實就是類似基于IntelliJ開發一個IDE出來,比如AndroidStudio 將Android SDK集成進IntelliJ。其他的插件如Java EE中的Spring、Struts等framework集成到IntelliJ。使用戶在IntelliJ上面使用特定的框架更方便。
- 工具集成(Tool integration):對IntelliJ定制一些個性化或者是實用的工具。
- 附加UI(User interface add-ons):對標準的UI界面進行修改,如在編輯框里加一個背景圖片等。
1. 下載IntelliJ IDEA
在開發IntelliJ插件時,我們使用的是IntelliJ IDEA自身來開發。為什么不用AndroidStudio來開發呢?主要是AndroidStudio是面向Android開發的,在針對IntelliJ插件的各種環境都沒有,當然,你也可以自己下載插件開發環境然后在AndroidStudio上去配置。但是個人覺得過于麻煩,IntelliJ IDEA集成了插件開發環境,下載后可以直接拿來開發插件。IntelliJ IDEA下載地址如下:
2. 創建項目
選擇“File>New>Project...”,將Project選擇為IntelliJ Platform Plugin,然后再點擊Next。如下圖所示:
填寫Project名稱及項目保存路徑,其中Project Name可以認為是插件名稱。點擊Finish,如下圖所示。
完成后,創建的項目結構如下所示:
我們比較關心的主要是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
將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
屬性用于描述位置,主要有四個選項: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
的修改后,點擊運行。會發現,運行時是自動再啟動新的IntelliJ IDEA。而新啟動的IntelliJ IDEA由于沒有可打開的項目會停留在如下界面:
為了能查看到我們的插件,可以點擊Create New Project
或者是導入項目,總之,讓它正確進入到開發界面就好。
接下來,點擊help菜單,會看到如下:
點擊·"Hello World"項,運行如下:
6. 其他
6.1 自動配置plugin.xml
前面我們通過收到創建Java類,然后基礎AnAction類的方式創建Action。并且最后還需要收到配置plugin.xml。其實可以無需手動編寫,直接通過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文件,如下圖:
這個文件即為我們導出的插件。接下來打開AndroidStudio,點擊“File>Settings>Plugins”
點擊“install plugin from disk...”,將HelloWorld.jar包加入即可完成安裝。
我在安裝過程中出現如下錯誤(Plugin display name here為插件名稱):
從錯誤提示上看,是不兼容錯誤。回到plugin.xml,從中找到一行:
<idea-version since-build="145.0"/>
這是指定IntelliJ IDEA為2016年1月發布的版本(點擊這里查看對應的版本),顯然,我的AndroidStudio還沒使用那么新的IntelliJ IDEA,因此把145修改小一點就好,比如我修改為105.0,重新打包再安裝。運行如下:
點擊后: