目录

  • 1. 前期准备
  • 2. 创建项目
  • 2.1 步骤
  • 2.1 可能出现的问题
  • 3. 项目文件介绍
  • 3.1 plugin.xml
  • 2.2 build.gradle
  • 4. 开始开发
  • 4.1 Action 动作
  • 4.1.1 自定义Action
  • 4.1.2 注册自定义Action
  • 4.1.3 Action显示效果
  • 4.2 自定义显示界面
  • 4.2.1 自定义DialogWrapper
  • 4.2.2 编写Swing GUI
  • 4.2.3 完成自定义显示界面
  • 4.2.4 问题点解决
  • 5. 导出插件


1. 前期准备

Android Studio是基于IntelliJ Platform平台的,开发插件需要下载IntelliJ IEDA,本文并不介绍开发环境的搭建与配置,开发插件前需要准备如下内容。

文章参考资料:官方文档

2. 创建项目

2.1 步骤

File -> New -> Project -> Gradle -> 选择支持内容 -> Next -> 填写项目信息 -> Finish

android library插件 android插件开发_android library插件


android library插件 android插件开发_自定义_02

2.1 可能出现的问题

可能会出现 Java heap space 的错误,程序超过了JVM堆设置的最大值。

A problem occurred configuring root project 'xxx'.
> A build operation failed.
      Java heap space
   > Java heap space

解决方式

在Project 的 gradle.properties文件中添加代码

org.gradle.jvmargs=-Xmx4096m
  • -Xms:初始值
  • -Xmx:最大值
  • -Xmn:最小值

3. 项目文件介绍

3.1 plugin.xml

~/src/main/resources/META-INF/plugin.xml 是插件的配置文件。

android library插件 android插件开发_Inteill 插件_03

官方介绍
Plugin Configuration File - plugin.xml

标签的含义

  • < id >:插件ID,唯一标志。
  • < name >:插件名称。
  • < vendor >:插件发布者的相关信息。
  • < description >:插件的描述内容。
  • < depends >:添加其它插件或模块的依赖。
  • < extensions >:注册插件扩展。
  • < actions >:注册插件操作动作,查看4.1。

2.2 build.gradle

由于是采用Gradle构建的项目,所以此插件项目中也有 build.gradle 文件。

android library插件 android插件开发_android library插件_04


可以看到项目中引入了一个插件 gradle-intellij-plugin,它是用于构建 IntelliJ IDEA插件的插件。可以通过该插件,对我们开发的插件进行一些配置。

intellij {
    // 对应的IDEA版本号
    version '2019.1'
}
runIde {
    // 默认运行插件是启动IntelliJ IDEA,如果想直接启动Android Studio 指定运行的ide路径。
    // windows
    ideDirectory 'C:/Program Files/Android/Android Studio'
//    // macOS
//    ideDirectory '/Applications/Android Studio.app/Contents'
}

IntelliJ IDEA 版本号:IntelliJ IDEA Build Number Ranges Android Studio对应的 IDEA版本号:mac 在 Android Studio About中查看,windows 在 help/about中查看。
更多配置信息请查看: gradle-intellij-plugin

4. 开始开发

4.1 Action 动作

插件可以通过注册Action 在IDE菜单和工具栏中添加操作,其实就是IDE中添加了一个按钮,然后响应按钮点击事件。例如Android Studio中的Build - Clean Project 按钮就是一个Action。

4.1.1 自定义Action

main 文件夹下新建kotlin文件夹(若采用java开发,则创建java文件夹),创建ADBAction类。

class ADBAction : AnAction() {
    //用户执行操作时会调用此方法。
    override fun actionPerformed(e: AnActionEvent) {
        //展示一个信息弹窗
        Messages.showMessageDialog("adb message", "adb title", Messages.getInformationIcon() )
    }
}

4.1.2 注册自定义Action

鼠标选中在自定义Action类,使用快捷键ALT + Enter(快捷键可能有所不同)注册Action。

android library插件 android插件开发_Inteill 插件_05


android library插件 android插件开发_Android Studio_06

  • Action ID :Action 唯一标志
  • Class Name:Action对应的类名.
  • Name :显示名称
  • Description:对Action的描述
  • Add to Group:选择添加到哪个组里面
  • Anchor:指定放置位置

完成后可以看到 plugin.xml文件,< actions > 标签下多了如下内容

<actions>
        <action id="ADBAction" class="ADBAction" text="ADB Action" description="ADB action">
            <add-to-group group-id="ToolsMenu" anchor="last"/>
            <keyboard-shortcut keymap="$default" first-keystroke="alt 1" second-keystroke="alt 2"/>
        </action>
    </actions>

4.1.3 Action显示效果

点击运行按钮,运行插件程序查看效果。

android library插件 android插件开发_Android Studio_07


android library插件 android插件开发_Android Studio_08

4.2 自定义显示界面

4.2.1 自定义DialogWrapper

上文中的对话框为自带的Dialog样式,如果需要修改显示画面,就需要进行自定义。
kotlin文件夹下,新建MessageDialog 继承于DialogWrapper

class MessageDialog : DialogWrapper(true) {
    override fun createCenterPanel(): JComponent {
        TODO("Not yet implemented")
    }
}

可以看到,需要返回一个 JComponent 对象,插件的显示界面就是由Java Swing开发。

4.2.2 编写Swing GUI

main 文件夹下新建java文件夹,然后右键 New -> Swing UI Designer -> GUI Form,新建MyMessageDialog,并添加一些控件。

android library插件 android插件开发_Inteill 插件_09


此时 MyMessageDialog.java 中的代码如下

public class MyMessageDialog {
    public JTextField textField1;
    public JTextField textField2;
    public JPanel root;
}

4.2.3 完成自定义显示界面

修改 MessageDialog.kt 中的代码。

class MessageDialog(
    private val text1: String,
    private val text2: String
) : DialogWrapper(true) {
    init {
        //Dialog的一些初始化操作
        init()
    }

    override fun createCenterPanel(): JComponent {
        return MyMessageDialog().apply {
            //修改UI布局内容
            textField1.text = text1
            textField2.text = text2
        }.root
    }
}

ADBAction 中修改调用方式

class ADBAction : AnAction() {
    //用户执行操作时会调用此方法。
    override fun actionPerformed(e: AnActionEvent) {
        //展示一个自定义对话框
        MessageDialog("adb message1", "adb message2").show()
    }
}

显示效果

android library插件 android插件开发_自定义_10

4.2.4 问题点解决

运行时发现,运行在 IntelliJ IDEA 中时插件可以正常运行,但运行在Android Studio 中时,出现如下错误。

java.lang.NullPointerException
com.android.tools.idea.diagnostics.AndroidStudioSystemHealthMonitor.getActionName()

解决方式,类不能直接放在 java 或 kotlin 包下,还得自己在新建一个包,最终文件结构如下。

android library插件 android插件开发_Inteill 插件_11

5. 导出插件

正式发布可查看官方文档:使用Gradle发布插件 如果只是单纯的想导出插件,可以进行如下操作

gradlew buildPlugin

/build/distributions 中可查看到插件.zip文件,然后在 Android Studio -> File -> Setting -> Plugins -> Install Plugin from Disk 中安装插件。

android library插件 android插件开发_Inteill 插件_12