一、前言
用過 Android Studio 進(jìn)行開發(fā)的人一般都使用過插件,因為使用插件可以大大提高我們的開發(fā)效率。例如我們常用的插件有:
- GsonFormat:將 json 數(shù)據(jù)轉(zhuǎn)換成實體類。
- Android Butterknife Zelezny:一鍵生成 ButterKnife 注解。
都知道插件很好用,那這些插件是怎么制作的呢?這篇文章就講下怎么制作一個 Android Studio 插件。
二、準(zhǔn)備工作
- 首先需要下載開發(fā)工具 IntelliJ IDEA,點擊下載。
- 下載后點擊安裝,安裝成功打開界面是這樣的:

- 點擊 Create New Project 創(chuàng)建一個新的項目,因為是開發(fā)插件,所以這里選擇 IntelliJ Platform Plugin,然后選擇項目的 SDK,點擊到 “Next” 下一步。具體如下圖所示:

- 最后填寫項目名稱,選擇項目的存儲路徑,點擊 “Finish” 即可。具體如下圖所示:

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

其中 plugin.xml 為插件的一些相關(guān)信息,src 用來存放編寫的代碼。
三、編寫插件
1. 填寫插件相關(guān)信息
插件相關(guān)信息需要在 plugin.xml 文件中填寫,具體如下圖所示:

每個標(biāo)簽的意思為:
- id:插件 id,需要唯一值
- name:插件名稱
- version:插件版本號
- vendor:插件作者信息
- description:插件描述
- change-notes:插件版本更新日志
- idea-version:對 IntelliJ IDEA 軟件支持本插件版本號,默認(rèn)即可
- depends:指定你的插件是哪些 IDE 可以使用。
例如我這里的表示 IntelliJ IDEA 與 Android Studio 可以使用,如果只想在 Android Studio 使用,則寫成 <depends>com.intellij.modules.androidstudio</depends>,具體寫法可參考 Plugin Compatibility with IntelliJ Platform Products - extensions:擴(kuò)展,用不到可以不改
- actions:插件動作,后面創(chuàng)建 Action 的時候會自動配置
這些信息會在搜索該插件的時候展示,例如搜索 GsonFormat :

2. 新建 Action
不能直接在 src 文件夾下新建 Action(原因見文末注意事項),包括后面我們插件的功能代碼也不能直接放在 src 文件夾下,而是在 src 文件夾下新建一個包(方法與 Android Studio 一樣),然后在這個包下新建 Action。即在包上右鍵點擊如下選項:

然后填寫 Action 相關(guān)信息,如下圖所示:

- Action ID: 代表該 Action 的唯一 ID,一般的格式為:pluginName.ID
- Class Name:Action 的類名
- Name:插件在菜單上顯示的名字
- Description:這個 Action 的描述
- Groups:指定該插件在 IDE 菜單欄上的位置,如下選擇 EditMenu(Edit)表示該插件在 IDE 菜單欄上的 Edit 處
- Anchor:指定插件在 Groups 中的哪個選項,F(xiàn)rist 表示在第一個選項
- Keyboard Shortcuts:使用插件的快捷鍵
點擊 “OK” 后會創(chuàng)建一個剛剛命名的 ShowDialog 類繼承 AnAction 并實現(xiàn) actionPerformed 方法,而且在 plugin.xml 文件中會自動配置我們剛剛填寫的 Action 信息。如下圖所示:

3. 編寫 Action
我們仿照 官方例子,在 actionPerformed 方法中添加如下代碼,表示點擊插件的時候彈出一個dialog
public class ShowDialogAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
Project project = e.getData(PlatformDataKeys.PROJECT);
String txt= Messages.showInputDialog(project, "What is your name?", "Input your name", Messages.getQuestionIcon());
Messages.showMessageDialog(project, "Hello, " + txt + "!\n I am glad to see you.", "Information", Messages.getInformationIcon());
}
}
4. 使用插件
Action 代碼完成后,點擊 Run Plugin 運行項目,會自動啟動一個新的 IntelliJ IDEA 項目,在這個項目中就可以使用我們剛剛制作的插件了。如下圖所示:



四、生成插件
點擊菜單欄上的 Build -> Prepare Plugin Module 'xxx' For Deployment 即可,如下圖所示:

運行完成會在項目的根目錄生成一個 xxx.jar 的文件,這個就是最終生成的插件文件,如下圖所示:

五、安裝插件
打開 Andorid Studio,點擊菜單欄上的 File -> Settings -> Plugins -> Install plugin from disk,然后選擇我們剛剛生成的 jar 文件,如下圖所示:

然后點擊 “OK”,重啟 Andorid Studio 后即可像上面那樣使用插件。
六、上傳插件
前面生成的插件只能從本地選擇安裝,要想從插件庫直接下載安裝則需要將插件上傳到插件庫-JetBrains Plugins Repository,打開插件庫,注冊賬號(這里可直接使用 Github 賬號授權(quán)登錄),登錄后選擇 Upload plugin,填寫相關(guān)信息,點擊 Upload 即可上傳。如下圖所示:

- License:開源許可協(xié)議,我這里選擇 Apache license 2.0
- Category:插件分類,我這里選擇 Android
出現(xiàn)如下界面表示上傳成功,但只是上傳成功,還需要等審核通過才能在插件庫搜索到。

點擊上圖的鏈接,跳轉(zhuǎn)到插件詳情,點擊編輯可完善插件信息。具體如下圖所示:

如果在 plugin.xml 文件中沒有指定插件是哪些 IDE 可以使用,也可以在這里指定。具體如下:(這種方式我試過審核沒有通過,所以我自己用的是在 plugin.xml 文件中指定的方式)
進(jìn)入編輯界面滑到最底部可以看到 Supported products,即支持的產(chǎn)品。這里默認(rèn)是 勾選了 “Determine supported products by dependencies in plugin.xml”,表示根據(jù) plugin.xml 文件中的配置項來確定支持的產(chǎn)品。

這里我們不使用配置 plugin.xml 文件的方式,而是在這里手動選擇。即去掉默認(rèn)勾選,然后選中 Android Studio,表示插件支持在 Android Studio 中使用,其他 3 項 IntelliJ 是默認(rèn)勾選的不用管,最后點擊保存即可。

等審核通過后,我們就可以在插件庫搜索到啦!如下圖所示:

七、注意事項
使用插件出現(xiàn) NullPointerException
- 問題
寫好插件,然后使用 Android Studio 安裝插件并使用,提示
java.lang.NullPointerException at com.android.tools.idea.diagnostics.AndroidStudioSystemHealthMonitor.getActionName - 解決
也就是前面 “2. 新建 Action” 那里說的,需要將所有的 Action 及其他 Java 文件都放到包下,而不是直接放在 src 目錄下。
在菜單欄上找不到插件
- 問題
寫完 Action,然后點擊 Run Plugin 運行項目后在菜單欄上找不到插件。 - 解決
在運行項目前需要填寫 plugin.xml 文件中的 id 與 name 標(biāo)簽,不能用默認(rèn)的。
其實這個有點詭異,一般不上傳到插件庫是可以不填的,但是我用平時常用的電腦反復(fù)測試的確是有這個問題,后來換另一部電腦竟然沒有這個問題了~,所以我也不知道是因為環(huán)境還是什么問題,反正你們遇到就跟我一樣解決就可以了。
八、總結(jié)
文章看起來好長好復(fù)雜呀!嗯,那是因為我是良心博主呀,每一步都給你們寫的清清楚楚,還帶截圖!其實按照我的步驟執(zhí)行下去,真的挺簡單的,也就以下幾步:
- 下載開發(fā)工具 IntelliJ IDEA 并安裝。
- 新建 IntelliJ Platform Plugin 項目,然后編寫插件,即新建 Action。
- 生成插件,然后在 Andorid Studio 中安裝即可使用。
插件源碼:ShowDialog