AndroidStudio插件
- AndroidStudio插件是什么?其实全部开发开发者都用过AndroidStudio插件,并且了解到插件的便捷性。比如:GsonFormat、Translation等,这些插件都是在AS为我们提供更便捷的服务,让我们程序员能懒则懒。
- 那我们经常会想,这些插件到底怎么创建的呢?又是怎么上传到AS 的Plugin上提供广大开发者下载来使用的呢?好奇害死猫,那么我们下文就开始介绍如何创建属于自己的AS插件。
开发工具
IDEA
Intelli IDEA CE这款开发工具相信大家都不陌生,很多用IDEA都看不起我们AS的开发者(开个玩笑)。这里主要是IDEA支持我们来开发AS插件,所以我们第一步就是要下载社区办的IDEA。下载地址
创建项目(Mac系统安装讲解)
-
下载完IDEA,在Mac系统进行安装到Application上,这里我们需要创建一个Intelli Platform Plugin项目,该项目正是我们今天开发AS插件的第一步。
第一步
-
第一次安装之后,在创建Plugin项目你会遇到找不到Project SDK的情况,不要慌不要急,我们只需要选择Application里面的IDEA的Content路径即可,IDEA自身部分即是SDK。点击add Intelli Platform Plugin SDK……
第二步
-
继第二步之后,我们就可以点击next,输入项目的名字和路径后,点击finish完成创建。(这里我没遇到难点就不截图了)
配置
- 点击IDEA -> Preferences -> Plugins -> Marketplace -> 搜索 Plugin DevKit -> 点击安装,重启IDEA。
-
创建一个Action行为,在src的目录下右键 -> new -> Plugin DevKit -> Action。
创建Action
-
配置想要创建的Action信息。
Action ID: 动作ID,推荐用“插件名.XXAction”的格式
Class Name:编写Action的类文件名
Name:动作在菜单选项中展示的名字
Description:动作描述
Groups:定义这个动作选项所属的组,比如EditMenu就对应IDE菜单栏上的Edit,CodeMenu就对应菜单栏上的Code
Actions:是当前选中Groups下已有的Action动作,比如上图示如果我们选择CodeMenu就会展示Code中已有的几个选项
Anchor:用来指定动作选项在Groups中的位置,Frist就是最上面、Last是最下面,也可以设在某个选项的上/下方
Keyboard Shortcuts:调用插件Action的快捷键,可以不填,要注意热键冲突
image.png
- 查看生成的AnAction类,里面的AnActionEvent可以拿到Project属性,可以进行Project配置等操作。
public class JoliveBuildAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
Project project = e.getProject();
Logger.init("JoLiveBuild", Logger.DEBUG);
……
}
}
UI搭建
-
根据自身需求,我这里需要弹出Dialog来填写项目配置等信息保存本地,如果需要弹出popupWIndow类型的,可以参考文章最后的参考文献。src -> 右键new -> Swing UI Designer -> Create Dialog Class。
创建Dialog
-
输入完你的Dialog的类名,src目录下就会看到看到一个创建好的Dialog(class类+form文件)。
Dialog文件形态
-
如果你不太熟悉Swing的UI布局,可以先自行百度搜索下,了解下大概几种布局类型。了解完后,到form文件里面可以进行控件的拖拽,类似AS的xml一样,支持拖拽来添加子控件。但注意的一点就是要改变对应的Layout Manager(为啥了解布局类型,就是为了改这里的参数),大概如下所示。
最终输出
- 布局完成后,就开始设置Button的点击事件,然后对应的点击事件触发哪些命令被执行。这里就不把业务代码放上去,相关基础知识继续往下看。
基础知识
- 存储本地变量:大家肯定都有个疑问,当我想保持变量值到本地,让用户只需要输入一次变量值的时候,插件如何保持变量值到本地。
//存
PropertiesComponent.getInstance().setValue(KEY, VALUE);
//取
PropertiesComponent.getInstance().getValue(KEY, DEFAULT_VALUE)
- 如何执行脚本:大家在命令行中都知道如何执行一条python or shell语句了,那在Java代码中如何执行一条python or shell语句呢?主要这里就要了解下Runtime.getRuntime().exec(String command, String[] envp, File dir)。
command: 需要执行的命令。
envp:当前执行命令的环境变量设置。
dir:当前执行命令在哪个文件下。
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("执行失败");
e.printStackTrace();
} finally {
}
return isSuccess;
}
- 脚本信息如何显示出来:那竟然可以执行脚本命令了,我们又会想做的更好,如何把命令行返回信息提示到IDE相对于的log进行输出呢?
//获取脚本输出的流信息
Process process = Runtime.getRuntime().exec(cmd, null, file);
input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
while ((line = input.readLine()) != null) {
//调用Logger进行输出
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导入插件
-
AndroidStudio -> Preferences -> Plugin -> 点击小齿轮 -> Install Plugin From Disk… -> 选择上面的Jar包 -> open。之后你就可以在Plugin的Install里面找到自己开发的插件了,或者点击AndroidStudio的菜单栏的build,也可以找到自己的插件,点击后就可以弹出交互弹窗了,做到这一步是不是心情都躁动起来了,原来插件开发这么容易。
AndroidStudio打开插件
-
最终插件执行脚本的log输出效果。
log输出
参考文献:https://blog.csdn.net/zhaoyanjun6/article/details/78113868
网友评论