AndroidStudio插件
- AndroidStudio插件是什么?其實全部開發(fā)開發(fā)者都用過AndroidStudio插件,并且了解到插件的便捷性。比如:GsonFormat、Translation等,這些插件都是在AS為我們提供更便捷的服務(wù),讓我們程序員能懶則懶。
- 那我們經(jīng)常會想,這些插件到底怎么創(chuàng)建的呢?又是怎么上傳到AS 的Plugin上提供廣大開發(fā)者下載來使用的呢?好奇害死貓,那么我們下文就開始介紹如何創(chuàng)建屬于自己的AS插件。
開發(fā)工具
IDEA
Intelli IDEA CE這款開發(fā)工具相信大家都不陌生,很多用IDEA都看不起我們AS的開發(fā)者(開個玩笑)。這里主要是IDEA支持我們來開發(fā)AS插件,所以我們第一步就是要下載社區(qū)辦的IDEA。下載地址
創(chuàng)建項目(Mac系統(tǒng)安裝講解)
-
下載完IDEA,在Mac系統(tǒng)進(jìn)行安裝到Application上,這里我們需要創(chuàng)建一個Intelli Platform Plugin項目,該項目正是我們今天開發(fā)AS插件的第一步。
第一步 -
第一次安裝之后,在創(chuàng)建Plugin項目你會遇到找不到Project SDK的情況,不要慌不要急,我們只需要選擇Application里面的IDEA的Content路徑即可,IDEA自身部分即是SDK。點擊add Intelli Platform Plugin SDK……
第二步 繼第二步之后,我們就可以點擊next,輸入項目的名字和路徑后,點擊finish完成創(chuàng)建。(這里我沒遇到難點就不截圖了)
配置
- 點擊IDEA -> Preferences -> Plugins -> Marketplace -> 搜索 Plugin DevKit -> 點擊安裝,重啟IDEA。
-
創(chuàng)建一個Action行為,在src的目錄下右鍵 -> new -> Plugin DevKit -> Action。
創(chuàng)建Action -
配置想要創(chuàng)建的Action信息。
Action ID: 動作ID,推薦用“插件名.XXAction”的格式
Class Name:編寫Action的類文件名
Name:動作在菜單選項中展示的名字
Description:動作描述
Groups:定義這個動作選項所屬的組,比如EditMenu就對應(yīng)IDE菜單欄上的Edit,CodeMenu就對應(yīng)菜單欄上的Code
Actions:是當(dāng)前選中Groups下已有的Action動作,比如上圖示如果我們選擇CodeMenu就會展示Code中已有的幾個選項
Anchor:用來指定動作選項在Groups中的位置,F(xiàn)rist就是最上面、Last是最下面,也可以設(shè)在某個選項的上/下方
Keyboard Shortcuts:調(diào)用插件Action的快捷鍵,可以不填,要注意熱鍵沖突
image.png - 查看生成的AnAction類,里面的AnActionEvent可以拿到Project屬性,可以進(jìn)行Project配置等操作。
public class JoliveBuildAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
Project project = e.getProject();
Logger.init("JoLiveBuild", Logger.DEBUG);
……
}
}
UI搭建
-
根據(jù)自身需求,我這里需要彈出Dialog來填寫項目配置等信息保存本地,如果需要彈出popupWIndow類型的,可以參考文章最后的參考文獻(xiàn)。src -> 右鍵new -> Swing UI Designer -> Create Dialog Class。
創(chuàng)建Dialog -
輸入完你的Dialog的類名,src目錄下就會看到看到一個創(chuàng)建好的Dialog(class類+form文件)。
Dialog文件形態(tài) -
如果你不太熟悉Swing的UI布局,可以先自行百度搜索下,了解下大概幾種布局類型。了解完后,到form文件里面可以進(jìn)行控件的拖拽,類似AS的xml一樣,支持拖拽來添加子控件。但注意的一點就是要改變對應(yīng)的Layout Manager(為啥了解布局類型,就是為了改這里的參數(shù)),大概如下所示。
最終輸出 - 布局完成后,就開始設(shè)置Button的點擊事件,然后對應(yīng)的點擊事件觸發(fā)哪些命令被執(zhí)行。這里就不把業(yè)務(wù)代碼放上去,相關(guān)基礎(chǔ)知識繼續(xù)往下看。
基礎(chǔ)知識
- 存儲本地變量:大家肯定都有個疑問,當(dāng)我想保持變量值到本地,讓用戶只需要輸入一次變量值的時候,插件如何保持變量值到本地。
//存
PropertiesComponent.getInstance().setValue(KEY, VALUE);
//取
PropertiesComponent.getInstance().getValue(KEY, DEFAULT_VALUE)
- 如何執(zhí)行腳本:大家在命令行中都知道如何執(zhí)行一條python or shell語句了,那在Java代碼中如何執(zhí)行一條python or shell語句呢?主要這里就要了解下Runtime.getRuntime().exec(String command, String[] envp, File dir)。
command: 需要執(zhí)行的命令。
envp:當(dāng)前執(zhí)行命令的環(huán)境變量設(shè)置。
dir:當(dāng)前執(zhí)行命令在哪個文件下。
public boolean callJolive(String dir) {
String cmd = "python yybuilder.py build --projects Jolive --autopublish";
BufferedReader input = null;
boolean isSuccess = false;
try {
File file = new File(dir);
if (!checkUpdate(file)) {
return false;
}
Process process = Runtime.getRuntime().exec(cmd, null, file);
input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
while ((line = input.readLine()) != null) {
Logger.info(line);
}
input.close();
isSuccess = true;
} catch (Exception e) {
Logger.error("執(zhí)行失敗");
e.printStackTrace();
} finally {
}
return isSuccess;
}
- 腳本信息如何顯示出來:那竟然可以執(zhí)行腳本命令了,我們又會想做的更好,如何把命令行返回信息提示到IDE相對于的log進(jìn)行輸出呢?
//獲取腳本輸出的流信息
Process process = Runtime.getRuntime().exec(cmd, null, file);
input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
while ((line = input.readLine()) != null) {
//調(diào)用Logger進(jìn)行輸出
Logger.info(line);
}
//主要輸出信息類
public class Logger {
private static String NAME;
private static int LEVEL = 0;
public static final int DEBUG = 3;
public static final int INFO = 2;
public static final int WARN = 1;
public static final int ERROR = 0;
//初始化,我放在Action那里:Logger.init("JoLiveBuild", Logger.DEBUG);
public static void init(String name, int level) {
NAME = name;
LEVEL = level;
NotificationsConfiguration.getNotificationsConfiguration().register(NAME, NotificationDisplayType.NONE);
}
public static void debug(String text) {
if (LEVEL >= DEBUG) {
Notifications.Bus.notify(
new Notification(NAME, NAME + " [DEBUG]", text, NotificationType.INFORMATION));
}
}
public static void info(String text) {
if (LEVEL > INFO) {
Notifications.Bus.notify(
new Notification(NAME, NAME + " [INFO]", text, NotificationType.INFORMATION));
}
}
public static void warn(String text) {
if (LEVEL > WARN) {
Notifications.Bus.notify(
new Notification(NAME, NAME + " [WARN]", text, NotificationType.WARNING));
}
}
public static void error(String text) {
if (LEVEL > ERROR) {
Notifications.Bus.notify(
new Notification(NAME, NAME + " [ERROR]", text, NotificationType.ERROR));
}
}
}
打Jar包
-
首先在打Jar時候,要到META-INF下的xml文件,修改幾個地方。
打包配置信息 -
點擊IDEA的菜單 -> Build -> Prepare Plugin Module xxxx For Deployment。等一會就會在你的project的根目錄中生成jar包了。
打jar包 -
jar包的所在目錄。
jar包所在路徑
AndroidStudio導(dǎo)入插件
-
AndroidStudio -> Preferences -> Plugin -> 點擊小齒輪 -> Install Plugin From Disk… -> 選擇上面的Jar包 -> open。之后你就可以在Plugin的Install里面找到自己開發(fā)的插件了,或者點擊AndroidStudio的菜單欄的build,也可以找到自己的插件,點擊后就可以彈出交互彈窗了,做到這一步是不是心情都躁動起來了,原來插件開發(fā)這么容易。
AndroidStudio打開插件 -
最終插件執(zhí)行腳本的log輸出效果。
log輸出
參考文獻(xiàn):https://blog.csdn.net/zhaoyanjun6/article/details/78113868











