美文网首页
IntelliJ IDEA/Android Studio插件开发

IntelliJ IDEA/Android Studio插件开发

作者: WuRichard | 来源:发表于2019-01-02 10:54 被阅读20次

    IntelliJ IDEA/Android Studio插件开发入门指南


    基于IntelliJ平台的产品都可以通过添加插件来丰富其原有的功能,JetBrains团队也我们提供了丰富的API来进行插件开发,所有的插件都可以在JetBrains Plugin Repository找到。常见的插件类型有:

    • 自定义语言支持(如Java、Kotlin)
    • 框架集成
    • 工具集成
    • 用户界面插件

    这些类型插件的介绍以及功能就不一一细说了,官网也有比较详细的介绍。
    简单来说,IDEA也好Android Studio也好(以下统一称为IDE),它们为插件提供了运行环境,通过各种插件的配合来实现不同的功能。下面就先介绍开发IDEA插件前需要哪些准备。

    • 安装IDEA,如果想在开发插件的过程中进行Debug,那么还需要把IDEA的源码下载下来(Github源码地址)
    • 配置IntelliJ Platform SDK,也就是开发插件所需的SDK,类似开发Android应用时需要Android SDK,并且插件都是运行在JVM上的,所以也需要配置JDK的路径
    • 指定Sandbox Home目录,Sandbox Home目录用于存放插件项目实例的一些配置文件。在macOS系统中默认存放路径是/Users/{用户名}/Library/Caches/IdeaIC2018.2/plugins-sandbox

    配置SDK,如果你把IDEA源码也下载了,那么还需要配置一下源码的路径


    添加SDK.jpg 选择源码路径.jpg

    环境搭建好了,那么接下来我们就创建一个简易的插件工程,依次点击File->New->Project然后在弹出框左栏选择Gradle,然后在右侧一栏勾选IntelliJ Platform Plugin(如果想要使用Kotlin进行开发就把Kotlin那一项也勾选上)

    新建插件项目.jpg

    项目创建好后长这样:


    项目结构.jpg

    创建Action

    插件可以自定义IDE的UI,在菜单或工具栏中新加入一个Item。SDK提供了一个类AnAction,这个类的actionPerformed方法在你每次在菜单栏中选中或在工具栏中点击对应项时都会被调用。创建一个Action只需要两步:

    • 定义派生于AnAction的类
    • 注册Action

    当然你也可以定义一组派生于AnAction的类

    定义Action

    下面的代码是我仿照官方例子定义的一个Action,只是把Java改成了Kotlin实现

    class TextBoxes : AnAction("Text _Boxes") {
    
        override fun actionPerformed(e: AnActionEvent) {
            val project = e.getData(PlatformDataKeys.PROJECT)//这个Project是不是很熟悉?它其实跟Gradle中的Project意义是一样的
            val 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())//这两段代码其实很简单,都不用解释了
        }
    }
    
    注册Action

    定义好Action之后当然就需要告知IDE你有哪些Action啦,所以就需要对这些Action进行注册,注册的方式有两种(是不是似曾相识的感觉?)。

    • plugin.xml文件的<actions>标签中进行注册
    • 在代码中进行注册
    在plugin.xml文件中进行注册

    跟Android开发中在AndroidManifest.xml文件中注册组件非常相像,我们只需要按照IntelliJ平台的规范在plugin.xml文件的<actions>部分内容进行修改:

    <actions>
      <group id="MyPlugin.SampleMenu" text="_Sample Menu" description="Sample menu">
        <add-to-group group-id="MainMenu" anchor="last"  />
           <!--把这组Action加到"MainMenu"中-->
           <action id="Myplugin.Textboxes" class="Mypackage.TextBoxes" text="Text _Boxes" description="A test menu item" />
      </group>
    </actions>
    

    下面对plugin.xml的规范做一些介绍:

    <!-- Actions -->
        <actions>
        <!-- <action>对Action进行注册,
             "id"定义了这个Action的唯一识别id,
             "class"用于指定该Action对应类的全路径,
             "text"定义这个Action在菜单栏或者工具栏中显示的文本,前面加_表示在该字符下加下划线,
             "use-shortcut-of" 可选项 指定使用和某一个Action一样的快捷键
             "description" 可选项 对Action的描述(当你的鼠标指针停留在该item时就会显示该内容)
             "icon"没啥好说的-->
        <action id="VssIntegration.GarbageCollection" class="com.foo.impl.CollectGarbage" text="Collect _Garbage" description="Run garbage collector" icon="icons/garbage.png">
            <!-- <add-to-group>节点表示指定Action被加入到已存在的一个组中,
                 "group-id"表示加入的组的id,
                 "anchor"指定Action相对于组中其他Action的位置,可以指定的值有"first", "last", "before", "after"
                 "relative-to-action"如果把"anchor"的值设置为"before"或者"after"时,必须为该属性赋值,表示相对于某一个Action的位置-->
            <add-to-group group-id="ToolsMenu" relative-to-action="GenerateJavadoc" anchor="after"/>
            <!-- <keyboard-shortcut>指定Action的快捷键
                 "second-keystroke"指定Action次选快捷键
                 "keymap"指定Action的快捷键映射到哪一个系统中,可以设定的值作为常量定义在
                 com.intellij.openapi.keymap.KeymapManager类中-->
            <keyboard-shortcut first-keystroke="control alt G" second-keystroke="C" keymap="$default"/>
            <!-- 指定鼠标快捷键 -->
            <mouse-shortcut keystroke="control button3 doubleClick" keymap="$default"/>
        </action>
    

    使用代码进行注册

    使用代码注册其实也没什么少介绍的,贴一段官方代码大家就大致了解了,就是调用相应的api去做一些配置

    public class MyPluginRegistration implements ApplicationComponent {
      // Returns the component name (any unique string value).
      @NotNull public String getComponentName() {
        return "MyPlugin";
      }
    
    
      // If you register the MyPluginRegistration class in the <application-components> section of
      // the plugin.xml file, this method is called on IDEA start-up.
      public void initComponent() {
        ActionManager am = ActionManager.getInstance();
        TextBoxes action = new TextBoxes();
    
        // Passes an instance of your custom TextBoxes class to the registerAction method of the ActionManager class.
        am.registerAction("MyPluginAction", action);
    
        // Gets an instance of the WindowMenu action group.
        DefaultActionGroup windowM = (DefaultActionGroup) am.getAction("WindowMenu");
    
        // Adds a separator and a new menu command to the WindowMenu group on the main menu.
        windowM.addSeparator();
        windowM.add(action);
      }
    
      // Disposes system resources.
      public void disposeComponent() {
      }
    }
    

    上面两种注册方式是不是都感觉挺麻烦,在AS中我们创建一个Activity的时候可以通过File->New->Activity来帮我们创建一个Activity,并且已经帮我们注册到AndroidManifest.xml中,甚至是布局文件也创建好了,那么IDEA能做到吗?答案是肯定的,而且步骤也大同小异:

    快速创建Action.jpg

    接下来我们点击运行或Debug即可看到运行效果

    运行效果1.jpg 运行效果2.jpg 运行效果3.jpg

    到这里相信你也了解了怎么样去创建并运行一个简单的IDEA插件了,整个过程是不是和开发一个Android应用非常相像呢,其实都可以把他们看成是开发一个带UI界面的JVM应用程序,当你开发好一个插件之后,需要将其上传到远程仓库中以供他人使用,整个流程和发布一个第三方库也是大同小异。

    相关文章

      网友评论

          本文标题:IntelliJ IDEA/Android Studio插件开发

          本文链接:https://www.haomeiwen.com/subject/ploalqtx.html