原文: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
:
https://www.jetbrains.com/idea/download/previous.html
译者注:上述链接会跳转最新的 IDEA Preview 版本,读者可根据自己喜好进行下载。
第二步:创建一个新的插件项目
和往常一样,创建一个新的项目。
选择Gradle
和IntelliJ Platform Plugin
,我们唯一要做的,就是确定我们将使用哪种语言。本文我将选择Kotlin
(Java
)。
这之后,我们需要定义三个属性。
- GroupId — 新项目的groupId,如果您计划在本地部署项目,则可忽略此字段;
- ArtifactId - 新项目的名称;
- Version - 新项目的版本,默认情况下,此字段是自动指定的。
因为我不打算发布此插件,所以只将myplugin
用作GroupId
和ArtifactId
,读者可按需自行定制。
在下一个弹窗,我将不做任何更改,仅保留默认选项。如果您想了解更多有关此步骤的信息,请访问这里。
最后一步就是给我们的插件起个名字。
恭喜你!您刚刚创建了一个新插件,不仅适用于Android Studio
,而且还适用于基于IntelliJ
的任何其他IDE
——尽管您的插件还没有做其它任何事情。
第三步:Gradle 和 plugin.xml
现在,我们已经创建了项目,我们将快速浏览两个文件:plugin.xml
和build.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
,因此,首先,我创建了一个ID
为MyPlugin.TopMenu
的新Group
。 我还将该Group
添加到MainMenu Group
,它是您可以在任何IntelliJ IDE
上看到的主要工具栏。我将其位置锚定为最后一个,这样我们的Group
将处于该Group
的最后位置。 最后,我将Action
添加到MyPlugin.TopMenu Group
中,以便我们可以从那里访问它。
如果您想知道我如何知道MainMenu ID
的存在,只需命令+单击MainMenu ID
,它将带您进入一个名为PlatformActions.xml
的文件,该文件包含绝大多数Action
(类似于VcsActions.xml
) 和IDE
中的Group
。
我们可以对Action
和Group
执行许多不同的操作,例如添加分隔符或复用它们。我将在以后的文章中对其进行探讨,但现在您可以在这里查看它们。
第五步:运行它!
就这样,我们刚刚编写了一个非常简单的插件。现在我们可以使用run
按钮运行它,也可以对其进行调试。这将创建一个新的Android Studio
实例,它将安装我们的插件。另一个选项是运行buildPlugin gradle
任务,该任务将生成一个.jar
文件,您可以将其作为插件安装在Android Studio
或任何其他IntelliJ IDE
上。
安装插件并运行Android Studio
后,您现在可以在主工具栏上看到包含MyAction
的新MyPlugin group
。
在单击MyAction
之后,将显示一个新的弹窗,其包含您定义的标题和消息。请记住在log
日志窗口上启用 Show balloons,否则,您将不会看到弹窗,而是一个日志事件。
第一部分就是这样。在第二部分,我们将研究如何使用组件存储数据并保存插件的状态。同时,如果您有任何疑问,请访问twitter或发表评论。
如果您想观看我在Droidcon UK
上发表的演讲,请点击这里。
《编写AndroidStudio插件》译文系列
- 译: 编写AndroidStudio插件(一):创建一个基本插件
- 译: 编写AndroidStudio插件(二):持久化数据
- 译: 编写AndroidStudio插件(三): 更多配置
- 译: 编写AndroidStudio插件(四):整合Jira
- 译: 编写AndroidStudio插件(五):本地化和通知
关于译者
Hello,我是 却把清梅嗅 ,如果您觉得文章对您有价值,欢迎 ❤️,也欢迎关注我的 博客 或者 GitHub。
如果您觉得文章还差了那么点东西,也请通过 关注 督促我写出更好的文章——万一哪天我进步了呢?
- 我的Android学习体系
- 关于文章纠错
- 关于知识付费
- 关于《反思》系列