编译时注解项目实践之自定义 Gradle 插件

上篇文章介绍了自定义注解处理,到这里Extra项目已经可以用起来了,我们只需要按照下面的方式就可以集成

1
2
3
4
dependencies {
compile "me.loody:extra:x.x.x"
annotationProcessor "me.loody:extra-compiler:x.x.x"
}

有没有更简单的方法呢?当然有,就是自定义一个 Gradle 插件来帮助我们申明依赖,当然 Gradle 插件的作用远不止这些

自定义 Gradle 插件

自定义 Gradle 插件可以分为三个步骤

  1. 配置 build.gradle
  2. 创建 Groovy 脚本
  3. 创建 resources 文件

配置 build.gradle

首先我们新建一个 Android Library工程,将根目录下的 build.gradle 配置如下

1
2
3
4
5
6
7
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
}

创建 Groovy 脚本

接下来创建一个 ExtraPlugin.groovy 文件,通过实现 gradle 的Plugin接口,实现apply方法即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class ExtraPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
Project extra = project.rootProject.findProject("extra")
Project extra_compiler = project.rootProject.findProject("extra-compiler")
if (extra && extra_compiler) {
project.dependencies {
compile extra
annotationProcessor extra_compiler
}
} else {
String extraVersion = "0.1.1"
String extraCompilerVersion = "0.1.1"
ExtraPropertiesExtension ext = project.rootProject.ext
if (ext.has("extraVersion")) {
extraVersion = ext.get("extraVersion")
}
if (ext.has("extraCompilerVersion")) {
extraCompilerVersion = ext.get("extraCompilerVersion")
}
project.dependencies.add("compile", "me.loody:extra:${extraVersion}")
project.dependencies.add("annotationProcessor", "me.loody:extra-compiler:${extraCompilerVersion}")
}
}
}

创建 resources 文件

最后创建resources相关文件,目录结构如下
extra-gradle-plugin

me.loody.extra.properties 的内容如下

1
implementation-class=me.loody.extra.ExtraPlugin

有没有感觉跟自定义注解处理器很像!

使用

使用自定义插件的方法是在主项目的build.gradle文件中,通过apply指令来加载自定义的插件,脚本如下所示:

1
apply plugin: 'me.loody.extra'

其中plugin的名字,就是前面创建 me.loody.extra.properties 中的名字——me.loody.extra,通过这种方式,就加载了自定义的插件