使用 Gradle 构建 Android Studio 插件

1,014 阅读4分钟

作为一个 Android 开发者,我每天都在使用 Android Studio。在编码时我经常在思考:我能否让 Android Studio 变得更加强大?例如,能否一键拉取库模块的源码并将其引入构建?能否支持基于 AI 的更为智能的代码提示?能否支持自定义的领域特定语言? 实际上,Android Studio 插件将另上述想法均变为现实。本文将详细介绍如何使用 Gradle 开发 Android Studio 插件。如果你也是一个致力于提升工作效率的 Android 开发者,那么就继续阅读下去吧!

准备环境

开发 Android Studio 插件唯一需要准备的工具便是 Intellij IDEA(付费版本与社区版本均可)。你可以通过 Jetbrains 官网下载到 Intellij IDEA 的最新版本。本文将使用 Intellij IDEA Community Edition 2021.2 做演示。

创建工程

打开 Intellij IDEA,按照如下步骤创建工程:

  1. 点击 File - New - Project...

1.png

  1. 在 New Project 页,选择 Gradle,并且勾选 Java 和 Intellij Platform Plugin,然后点击 Next

2.png

  1. 填写工程的名称,点击 Finish

3.png

配置工程

完成上一节后,Intellij IDEA 自动为我们创建了一个使用 Gradle 构建的 Intellij Plugin 项目。该项目的主要配置信息位于根目录的 build.gradle 中:

5.png 可以看到,Jetbrains 通过 Gradle 插件 org.jetbrains.intellij 完成了项目的配置。 该 Gradle 插件提供了丰富的配置项帮助开发者实现各种个性化的配置。你可以在其官方仓库的 README 中查看完整的配置项

由于本文旨在帮助 Android 开发者开发针对 Android Studio 的插件,本节将主要介绍 Android Studio 插件的常用配置。

intellij 配置

Intellij 版本

build.gradle 中,默认的 Intellij 版本与创建工程的一致。而 Android Studio 对应的 Intellij 版本往往与之不同。 我们可以通过在 Android Studio 点击 Android Studio - About Android Studio 查看其对应的 Intellij 版本:

4.png

例如上图中标识的 Intellij 相关信息为:

Build #AI-203.7717.56.2031.7583922, built on July 27, 2021

其对应的 Intellij 版本便是 203.7717.56。 此外,Android Studio 是基于社区版本的 Intellij IDEA 的,故我们还需要添加 type 字段为 IC

...
intellij {
  version = '203.7717.56'
  type = 'IC' 
}
...

添加 android plugin 依赖

Android Studio 实际上是通过为 Intellij IDEA 添加插件的形式提供了 Android 特定的特性。如果我们想要用到一些 Android Studio 提供的 Android 相关的开放接口,便需要添加对于该插件的依赖,从而可以在访问到这些接口:

...
intellij {
  version = '203.7717.56'
  type = 'IC' 
  plugins = ['android']

}
...

runIde 配置

intellij 的 Gradle 插件提供了一个任务 runIde 用于帮助开发者在 IDE 中直接调试插件。Android 开发者可以将其中的 IDE 路径配置为本地的 Android Studio 的路径,从而直接在本地的 Android Studio 进行调试:

...
runIde {
  ideDir = project.file('/Applications/Android Studio.app/Contents')
}
...

注意:runDir 的值需要为 File 类型(这一点 JetBrains 的文档中并未提及)。

plugin.xml 配置

默认场景下,不同的插件运行于不同的 classloader 中,这样不同的插件可以使用不同版本的相同的库而不会相互影响。 但当开发者想要通过调用 android 插件的接口来获取一些 Android 特定信息(例如 android gradle plugin 的版本)时,这样的默认机制显然会使得获取信息失败。 开发者可以通过在 plugin.xml 中声明 depends 来使得当前插件与 depends 中声明的插件运行于相同的 classloader 中。 对于 android 插件,我们可以在 plugin.xml 中声明:

<idea-plugin>
    ...
    <depends>org.jetbrains.android</depends>
    ...
</idea-plugin>

这样,我们便可以在运行时获得该插件提供的数据并正确调用该插件提供的方法。

构建与运行

使用 GUI

创建项目时,Intellij IDEA 便为我们自动创建好了对应的运行配置,如下图:

6.png

可以通过点击 Run 按钮运行插件工程,Debug 按钮调试插件工程。

点击按钮后,会默认启动一个 Intellij IDEA 用以运行插件,如果你按照前文所属配置了 runIde 任务的话,便会启动本地的 Android Studio 运行插件。

使用命令行

通过右侧 Gradle 面板的 Tasks 可以看到 intellij 组下面有一系列 IDE 插件相关的 Gradle 任务。 7.png 我们可以通过 ./gradlew buildPlugin 来构建插件工程,产物的默认输出路径为 /build/distributions。 我们可以通过 ./gradlew runPlugin 来运行插件工程。

更多

至此,我们便使用 Gradle 完成了插件工程的配置、构建和运行。关于如何开发 Android Studio 插件,你可以参考 Jetbrains 的官方文档:Intellij Platform SDK。我也将在后续更新其中的有趣部分以及如何发布一个 Android Studio 插件。

关注我来了解更多吧。