[译] 编写AndroidStudio插件(一):创建一个基本插件

2,922 阅读8分钟

原文:Write an Android Studio Plugin Part 1: Creating a basic plugin
作者:Marcos Holgado
译者:却把清梅嗅

《编写AndroidStudio插件》系列是 IntelliJ IDEA 官方推荐的学习插件IDE开发博客专栏,希望对有需要的读者有所帮助。

早在10月的时候,我就在Droidcon UK 2018上针对如何在Android Studio上创建自己的插件,以及如何使所有相关操作自动化进行了讨论。因为当时我并没有很多时间对其进行详细介绍,所以这个系列诞生了。

我们要干什么?

本文我们将编写一个非常基本的插件,这次内容也许并不多,但重要的是,我们将学习插件以及创建插件所需的知识。我们还将创建一个新的Action,该Action将显示一个带有消息的弹出框。

这只是一个非常长的系列文章的第一部分,我将深入研究并为我们的插件扩展更多功能。 您将看到的所有代码都在下方的GitHub仓库中:

marcosholgado/plugin-medium

随着进度的提升,虽然master会一直保持最新的代码,但我还将对每篇文章保留单独的分支。想要如此做,您可以随时返回查看Part1分支。

第一步:安装 IntelliJ IDEA CE

要创建我们的插件,我们将使用IntelliJ IDEA社区版。其主要原因是因为社区版是免费的,且非常容易使用,我们还可以利用gradle-intellij-plugin让这个过程变得更加轻松。

我将使用并非IntelliJ IDEA CE最新稳定版本的IntelliJ IDEA CE 2018.1.6。原因是因为Android Studio 3.2.1基于此IntelliJ版本,我不也想使用任何可能与Android Studio不兼容的新功能。

您可以从此处下载IntelliJ IDEA CE 2018.1.6:

www.jetbrains.com/idea/downlo…

译者注:上述链接会跳转最新的 IDEA Preview 版本,读者可根据自己喜好进行下载。

第二步:创建一个新的插件项目

和往常一样,创建一个新的项目。

选择GradleIntelliJ Platform Plugin,我们唯一要做的,就是确定我们将使用哪种语言。本文我将选择KotlinJava)。

这之后,我们需要定义三个属性。

  • GroupId — 新项目的groupId,如果您计划在本地部署项目,则可忽略此字段;
  • ArtifactId - 新项目的名称;
  • Version - 新项目的版本,默认情况下,此字段是自动指定的。

因为我不打算发布此插件,所以只将myplugin用作GroupIdArtifactId,读者可按需自行定制。

在下一个弹窗,我将不做任何更改,仅保留默认选项。如果您想了解更多有关此步骤的信息,请访问这里

最后一步就是给我们的插件起个名字。

恭喜你!您刚刚创建了一个新插件,不仅适用于Android Studio,而且还适用于基于IntelliJ的任何其他IDE——尽管您的插件还没有做其它任何事情。

第三步:Gradle 和 plugin.xml

现在,我们已经创建了项目,我们将快速浏览两个文件:plugin.xmlbuild.gradle

我们从plugin.xml开始。该文件包含一些插件相关的元数据,以及我们必须注册插件不同元素的位置。在必要的时候,我们将更深入地研究此文件中的某些内容。

另一个文件是build.gradle,我们已经熟悉它了,所以我不解释它的作用。这是您将获得的默认build.gradle文件(版本不同,内容会略有不同):

plugins {
    id 'org.jetbrains.intellij' version '0.3.12'
    id 'org.jetbrains.kotlin.jvm' version '1.3.10'
}

group 'myplugin'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
intellij {
    version '2018.2.2'
}
patchPluginXml {
    changeNotes """
      Add change notes here.<br>
      <em>most HTML tags may be used</em>"""
}

一切似曾相识,因为我们习惯了Android项目。当我们开始添加更多依赖项时,我们将折回该文件,依此类推,但目前我只关注两件事。

首先,您可以看到我们的 依赖项 使用了compile而不是implementation/api,主要原因是gradle-intellij-plugin尚不支持implementation/api

译者注:最新版本的 IDEA 插件已支持。

不过,如果您需要kapt进行任何类型的注解处理,则可以使用kapt(说的就是你,Dagger)。与任何Android项目中一样,您可以使用所需的任何库,但使用时务必小心,因为这不是Android项目。

其次,我们有一个新的部分称为intellij。 在这里,我们将在需要时添加更多属性,如插件依赖性等。现在,我们唯一拥有的属性是version,它指定了应该用作依赖性的IDEA的发行版本。

在继续之前,我将向intellij部分添加另一个属性。 我们现在拥有的插件只能在IntelliJ IDEA CE上调试。 如果我们想立即调试插件的行为,一个新的IntelliJ实例将被启动,我们将不得不在那里进行调试/测试。显然我们想在Android Studio上测试我们的插件,以便告诉gradle-intellij-plugin我们要使用Android Studio,我们必须添加一个新属性。

最终该部分声明如下:

intellij {
    version '2018.1.6'
    alternativeIdePath '/Applications/Android Studio.app'
}

通过使用AlternativeIdePath并指向本地安装的Android Studio,我们告诉gradle-intellij-plugin每当运行插件或对其进行调试时都使用Android Studio,而不是使用默认的IntelliJ IDE

如果您迫不及待要其他文章来查看可使用的其他属性,请访问这里以获取更多信息。

第四步:编写第一个Action

我们可以在插件中使用不同的元素,我们将在以后的文章中看到所有这些元素,但现在我们将重点介绍最常用的:actions

当您单击工具栏或菜单项时,基本上就是一个动作,就这么简单,下列图片中您看到的所有内容都是Actions展示的:

通过Actions,我们可以将自己的项目应用到Android Studio的菜单和工具栏上,这些Action被组织成Group,这些Group可以包含其他Group,依此类推。

要创建一个新的Action,我们必须让这个类继承AnAction并重写actionPerformed方法。

class MyAction: AnAction() {

    override fun actionPerformed(e: AnActionEvent) {
        val noti = NotificationGroup("myplugin", NotificationDisplayType.BALLOON, true)
        noti.createNotification("My Title",
                                "My Message",
                                NotificationType.INFORMATION,
                                null
                               ).notify(e.project)
    }
}

在这里,我们创建了一个简单的Action,它将显示一个带有标题和消息的弹窗。我们要做的最后一件事是将此Action添加到我们的plugin.xml文件中。

<actions>
    <group id="MyPlugin.TopMenu"
           text="_MyPlugin"
           description="MyPlugin Toolbar Menu">
        <add-to-group group-id="MainMenu" anchor="last"/>
        <action id="MyAction"
                class="actions.MyAction"
                text="_MyAction"
                description="MyAction"/>
    </group>
</actions>

我们的Action必须属于一个Group,因此,首先,我创建了一个IDMyPlugin.TopMenu的新Group。 我还将该Group添加到MainMenu Group,它是您可以在任何IntelliJ IDE上看到的主要工具栏。我将其位置锚定为最后一个,这样我们的Group将处于该Group的最后位置。 最后,我将Action添加到MyPlugin.TopMenu Group中,以便我们可以从那里访问它。

如果您想知道我如何知道MainMenu ID的存在,只需命令+单击MainMenu ID,它将带您进入一个名为PlatformActions.xml的文件,该文件包含绝大多数Action(类似于VcsActions.xml) 和IDE中的Group

我们可以对ActionGroup执行许多不同的操作,例如添加分隔符或复用它们。我将在以后的文章中对其进行探讨,但现在您可以在这里查看它们。

第五步:运行它!

就这样,我们刚刚编写了一个非常简单的插件。现在我们可以使用run按钮运行它,也可以对其进行调试。这将创建一个新的Android Studio实例,它将安装我们的插件。另一个选项是运行buildPlugin gradle任务,该任务将生成一个.jar文件,您可以将其作为插件安装在Android Studio或任何其他IntelliJ IDE上。

安装插件并运行Android Studio后,您现在可以在主工具栏上看到包含MyAction的新MyPlugin group

在单击MyAction之后,将显示一个新的弹窗,其包含您定义的标题和消息。请记住在log日志窗口上启用 Show balloons,否则,您将不会看到弹窗,而是一个日志事件。

第一部分就是这样。在第二部分,我们将研究如何使用组件存储数据并保存插件的状态。同时,如果您有任何疑问,请访问twitter或发表评论。

如果您想观看我在Droidcon UK上发表的演讲,请点击这里


《编写AndroidStudio插件》译文系列

关于译者

Hello,我是 却把清梅嗅 ,如果您觉得文章对您有价值,欢迎 ❤️,也欢迎关注我的 博客 或者 GitHub

如果您觉得文章还差了那么点东西,也请通过 关注 督促我写出更好的文章——万一哪天我进步了呢?