項(xiàng)目源碼
https://github.com/boredream/AndroidDatabaseGeneratorPlugin
系列教程
Android Studio Plugin 插件開(kāi)發(fā)教程(一) —— 開(kāi)發(fā)你的第一個(gè)插件
Android Studio Plugin 插件開(kāi)發(fā)教程(二) —— 插件SDK中的常用對(duì)象介紹
Android Studio Plugin 插件開(kāi)發(fā)教程(三) —— 制作一個(gè)自動(dòng)生成數(shù)據(jù)庫(kù)代碼的插件
Android Studio Plugin 插件開(kāi)發(fā)教程(四) —— 為自動(dòng)生成數(shù)據(jù)庫(kù)代碼的插件添加UI
本教程基于官方文檔編寫(xiě),原版地址如下
官方文檔 http://www.jetbrains.org/intellij/sdk/docs/welcome.html
搭建環(huán)境:
下載IntelliJ Idea客戶端并安裝
https://www.jetbrains.com/idea/download/
一、配置SDK
打開(kāi)IDE后,選擇 File | Project Structure
在配置窗口中點(diǎn)擊 New... 新增SDK,選擇 IntelliJ Platform Plugin SDK
(如果第一次打開(kāi)IDE,選擇右下角 Configure | Project Defaults | Project Structure 打開(kāi)配置窗口)
彈出頁(yè)面中,選擇默認(rèn)IntelliJ IDEA文件夾,確認(rèn)
二、新建Plugin Project
在打開(kāi)的IntelliJ IDEA 中選擇 File | New | Project,
左側(cè)菜單選擇IntelliJ Platform Plugin項(xiàng)目,SDK選擇剛才新配置的,下一步
其中 Groovy、Python等啥其他附加的內(nèi)容無(wú)需勾選
最后輸入項(xiàng)目名稱確定,完成創(chuàng)建
三、配置插件項(xiàng)目
創(chuàng)建好的Plugin項(xiàng)目中,會(huì)默認(rèn)生成一個(gè) plugin.xml 的配置文件
其中可以修改該插件項(xiàng)目的相關(guān)配置信息,比如插件名稱、插件版本號(hào)等,如下圖
各標(biāo)簽意義具體為:
- <id> 插件id,類似于Android項(xiàng)目的包名,不能和其他插件項(xiàng)目重復(fù),所以推薦使用com.xxx.xxx的格式
- <name> 插件名稱,別人在官方插件庫(kù)搜索你的插件時(shí)使用的名稱
- <version> 插件版本號(hào)
- <vendor> 插件發(fā)布者信息,可以添加郵箱鏈接
- <description> 插件描述信息,在這里可以介紹你的插件內(nèi)容,支持HTML標(biāo)簽
- <change-notes> 插件版本變更日志,支持HTML標(biāo)簽
-
<idea-version> 對(duì)IntelliJ IDEA軟件支持本插件版本號(hào)
分為since-build最低版本 和 until-build最高版本,兩個(gè)屬性可以任選一或者同時(shí)使用
官網(wǎng)有詳細(xì)介紹 http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html
大體規(guī)則為 since-build <= 支持版本 < until-build - <extensions> 自定義擴(kuò)展,暫時(shí)用不到
- <actions> 具體的插件動(dòng)作,后面會(huì)介紹
配置中填寫(xiě)的信息,會(huì)在別人搜索你插件的時(shí)候展現(xiàn)介紹
在 File | Settings | Plugins 中查看已有插件,或者再點(diǎn)擊Browse respositories中瀏覽插件中心里其他人發(fā)布的插件
當(dāng)選中一個(gè)插件時(shí),右側(cè)就可以看到plugin.xml中配置的信息了
同樣,這里也可以進(jìn)行插件的刪除和添加安裝操作,每次操作都需要重啟軟件后才能生效
四、開(kāi)始編寫(xiě)插件
插件是依附于IDE的,為其提供一些小功能,比如Android Studio中,
Code | Generate | Getter and Setter 這個(gè)自動(dòng)生成get和set方法的,其實(shí)就算是個(gè)插件
當(dāng)然,這些都是Android Studio中默認(rèn)自帶的,我們可以根據(jù)需要開(kāi)發(fā)新的插件
項(xiàng)目創(chuàng)建好時(shí)有一個(gè)src文件夾,可以在其中File | New ...新建文件,
主要有這么幾種針對(duì)插件的特殊文件類型
- GUI Form:表單界面
- Dialog:對(duì)話框
- XXXComponent:作用域類,其中又分為Application、Project、Module分為作用于不同范圍
- Action:處理插件交互行為的類
其中最主要的是Action類
之前例子中提到了,生成getter setter方法的功能是在菜單欄中的Code | Generate | Getter and Setter選擇的
那么我們自己創(chuàng)建的插件選項(xiàng)在哪里呢?屬于哪個(gè)菜單呢?
這里在創(chuàng)建Action類的時(shí)候就可以指定操作入口,Action的創(chuàng)建的對(duì)話框如下
- Action ID: 動(dòng)作ID,推薦用“插件名.XXAction”的格式
- Class Name:編寫(xiě)Action的類文件名
- Name:動(dòng)作在菜單選項(xiàng)中展示的名字
- Description:動(dòng)作描述
- Groups:定義這個(gè)動(dòng)作選項(xiàng)所屬的組,比如EditMenu就對(duì)應(yīng)IDE菜單欄上的Edit,CodeMenu就對(duì)應(yīng)菜單欄上的Code
- Actions:是當(dāng)前選中Groups下已有的Action動(dòng)作,比如上圖示如果我們選擇CodeMenu就會(huì)展示Code中已有的幾個(gè)選項(xiàng)
- Anchor:用來(lái)指定動(dòng)作選項(xiàng)在Groups中的位置,F(xiàn)rist就是最上面、Last是最下面,也可以設(shè)在某個(gè)選項(xiàng)的上/下方
- Keyboard Shortcuts:調(diào)用插件Action的快捷鍵,可以不填,要注意熱鍵沖突
創(chuàng)建好Action后,會(huì)自動(dòng)在plugin.xml配置文件的actions標(biāo)簽中新增一個(gè)對(duì)應(yīng)的Action動(dòng)作信息
<actions>
<!-- Add your actions here -->
<action id="DatabaseGenerator.GenAction" class="DatabaseGenerateAction" text="Database Generator"
description="auto generate db code, such as Table / CRUD sql ...">
<add-to-group group-id="CodeMenu" anchor="last"/>
</action>
</actions>
注意
- 這里的信息我們都可以再次修改,但是class name修改時(shí)要注意和類文件名匹配
- <add-to-group group-id>可以修改添加多個(gè),即在不同菜單中都可以選擇使用
- 同一個(gè)group下多個(gè)action的id不能重復(fù)
src下創(chuàng)建好的Action類會(huì)默認(rèn)繼承 AnAction,然后實(shí)現(xiàn) actionPerformed 方法,
我們仿造官方文檔中的例子,在方法中添加如下代碼,讓點(diǎn)擊這個(gè)Action的時(shí)候彈出一個(gè)輸入框
public class DatabaseGeneratorAction 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());
}
}
寫(xiě)好代碼后,run運(yùn)行項(xiàng)目~
此時(shí)會(huì)自動(dòng)啟動(dòng)一個(gè)新的IntelliJ IDEA項(xiàng)目,這個(gè)新項(xiàng)目里就會(huì)包含我們剛編寫(xiě)的插件選項(xiàng)了
如果想調(diào)試Android代碼,可以先在IntelliJ中的Project Structure里配置好Android環(huán)境,然后run插件項(xiàng)目運(yùn)行新的IntelliJ時(shí)建一個(gè)Android Project就好了
新運(yùn)行起來(lái)的IDE中就可以看到菜單欄里的 Code 最底部就出現(xiàn)了一個(gè)Database Generator選項(xiàng)
點(diǎn)擊就會(huì)觸發(fā)我們編寫(xiě)的功能
如果你覺(jué)得你的插件不好找,也可以自行在根目錄上新建一個(gè)和Code、Edit等同級(jí)的group,需要在配置文件里新建一個(gè)group,然后<add-to-group>指定其添加到MainMenu主菜單上
<actions>
<!-- Add your actions here -->
<group id="BoredreamPlugin.PluginSet" text="BdPlugin" description="the plugin set by boredream">
<add-to-group group-id="MainMenu" anchor="last" />
<action id="DatabaseGenerator.GenAction" class="DatabaseGenerateAction" text="Database Generator" description="A test menu item" />
</group>
</actions>
這個(gè)時(shí)候再run插件就會(huì)發(fā)現(xiàn)它單獨(dú)建立了一個(gè)group
但是要慎用~ 畢竟每個(gè)插件都加一個(gè)group那主菜單欄就亂死了,不像藏在二級(jí)菜單里會(huì)低調(diào)的多
五、打包
(這里我們先把整個(gè)流程介紹完,更復(fù)雜的插件開(kāi)發(fā)會(huì)下一篇介紹)
比較簡(jiǎn)單,直接在頂部主菜單欄中選擇 Build | Prepare Plugin Module XXX For Deployment即可
打包前要注意把 plugin.xml 配置文件中的相關(guān)信息填寫(xiě)完整
當(dāng)提示完成后,會(huì)在項(xiàng)目根目錄下生成一個(gè) XXX.jar 的包
類似于安卓打包生產(chǎn)的apk,這個(gè)時(shí)候你就可以把它丟給別人使用了
六、發(fā)布
不過(guò)安卓的apk發(fā)布,通常會(huì)有一個(gè)應(yīng)用市場(chǎng)比如Google Play,應(yīng)用寶啥的
IntelliJ的插件也有一個(gè)市場(chǎng),是官方提供的,可以在平臺(tái)上發(fā)布自己的插件
地址:https://plugins.jetbrains.com/
打開(kāi)插件中心,注冊(cè)好賬號(hào),然后選擇Upload Plugin
將你生成的插件jar包上傳,然后選擇分類,最后確認(rèn)完成上傳
此時(shí)雖然完成上傳,但是最好要完善一下Plugin Detail信息,方便別人對(duì)你的插件有更詳細(xì)的了解
還要再設(shè)置一下插件的支持IDE范圍,否則別人可能在Android Studio插件庫(kù)里搜不到你的plugin!!!
IntelliJ開(kāi)發(fā)的插件是針對(duì)所有IntelliJ旗下產(chǎn)品的,而他們之間的插件庫(kù)市場(chǎng)是非相通的
所以發(fā)布插件的時(shí)候一定要指定你的插件是那些IDE可以使用的,比如要支持AndroidStudio
完善Plugin Detail信息的時(shí)候,會(huì)有一個(gè)選項(xiàng) Supported products 即支持產(chǎn)品范圍
默認(rèn)是 勾選了“使用插件中的配置里指定的產(chǎn)品范圍”
這種使用插件項(xiàng)目里的配置方式,需要你在plugin.xml中添加<depends>標(biāo)簽說(shuō)明,比較麻煩
<depends>用法參考 http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
不過(guò)你也可以取消勾選,直接在上傳中心這里設(shè)置產(chǎn)品范圍,推薦這種方式~
IntelliJ的倆是默認(rèn)的,然后我們?cè)俟催xAndroid Studio,最后save保存更新
七、安裝使用
打開(kāi)你常用的Android Studio開(kāi)始安裝使用這些插件吧,方式有兩種
從插件中心直接下載安裝
IDE中選擇 File | Settings | Plugins ,彈出對(duì)話框中選 Browse respositories 瀏覽插件庫(kù)
搜索你自己發(fā)布的插件,然后安裝~ 安裝完成后重啟Android Studio即可開(kāi)始使用插件了從本地安裝插件jar包
這種需要用到插件項(xiàng)目生成的jar包,
選擇Browse respositories選項(xiàng)旁邊的 Install plugin from disk,然后找到j(luò)ar文件選中OK即可
注意,新發(fā)布到市場(chǎng)的插件可能暫時(shí)搜不到,有延遲~
好了,介紹結(jié)束~
開(kāi)始編寫(xiě)你的第一個(gè)插件吧!!!
后續(xù)教程還會(huì)帶著大家一起開(kāi)發(fā)一個(gè)具體的實(shí)用插件,敬請(qǐng)期待~
最后安利下自己的插件,自動(dòng)布局文件的相關(guān)代碼,懶人必備!還不用引入第三方的注入框架!
https://github.com/boredream/BorePlugin
歡迎star和follow