创建自定义 gradle 插件的三种方法
要创建 Gradle 插件,我们需要编写一个实现 Plugin 接口的类。将插件应用于项目时,Gradle 将创建插件类的实例,并调用该实例的 Plugin.apply()方法。项目对象作为参数传递,插件可以使用该参数配置项目。
开发语言
gradle 插件比较主流的开发语言是 groovy,因为 gradle 就是用 groovy 写的。
除了 groovy 还可以用来开发 gradle 插件的语言有:
- java
- kotlin
- 其它基于 jvm 语言
因为 groovy 是基于 jvm 的,所以同样基于 jvm 的也可以用来写 gradle 插件。但 java 和 kotlin 是静态语言,意味着需要不停地判断类型和强转,相比之下,groovy 作为动态语言就没有这个问题。通常,使用 java 或 kotlin(静态类型)实现的插件比使用 groovy 实施的插件性能更好。
自定义插件概述
自定义 gradle 插件一共有三种方式:Build script、 buildSrc project、Standalone project。
接下来我们分部来看,它们是如何实现的。
Build script:
这种插件脚本的源码放置在模块内的 build.gradle 中,好处就是插件脚本会被自动编译并添加进模块的 classpath 中,我们完全不用做任何事情。但是,这种插件脚本只能在声明的这个 build.gradle 中使用,其他模块是没办法复用这个插件的。
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('hello') {
group = "test"
description = "gradle build script demo,shares only in this build.gradle"
doLast {
println "Hello from the GreetingPlugin"
}
}
}
}
// Apply the plugin
apply plugin: GreetingPlugin
如上面这个插件 GreetingPlugin,我们是在 app 的 build.gradle 中声明定义的。
然后,在控制台运行下: gradle app:tasks,或者直接看Android Studio的Gradle窗口,可以看到如下结果:
通过例子可以看到,Build script 创建插件,其实和直接定义一个 task 没有多大区别,但这种插件对其他模块是不可见的。
buildSrc project:
这种创建插件的方式,要求源码放置在 rootProjectDir/buildSrc/src/main/java 目录 (或者 rootProjectDir/buildSrc/src/main/groovy 或者 rootProjectDir/buildSrc/src/main/kotlin 目录,可以根据你使用的脚本开发语言来确定)。Gradle 将负责编译和测试插件,并使其在构建脚本的类路径中可用。该插件对构建使用的每个构建脚本都是可见的。但是,它在构建外部不可见,因此你不能在定义该构建的外部重用该插件。
本例中,创建 Gradle 插件文件,路径如下:src/main/groovy/com/budaye/BuildSrcPlugin.groovy。
BuildSrcPlugin.groovy 的内容如下:
package com.budaye
import org.gradle.api.*;
class BuildSrcPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('hi') {
group = "buildsrc-test"
description = "gradle build script demo"
doLast {
println "Hello from the BuildSrcPlugin"
}
}
}
}
在 app 项目中使用插件
插件我们已经定义好了,接下来就可以在 app 项目的 build.gradle,使用该插件:
// Apply the plugin
apply plugin: com.budaye.BuildSrcPlugin;
执行和输出如下:
Standalone project:
以上两种方法只能在当前项目中使用,那么,如果我们想要在其他项目中使用,怎么做呢?
这时,就需要为插件创建一个独立项目,这个项目产生并发布了成一个 JAR,我们可以在多个版本中使用它并与他人共享。通常,此 JAR 可能包含一些插件,或将几个相关的任务类捆绑到一个库中,或两者的某种组合。
我们分步来看如何创建一个独立的 Gradle 插件项目。
1. 在 Android Studio 中新建一个 Project,然后建立一个 Android Module(类型不重要,因为默认文件会删除),然后删除掉目录下除了 src/main 和 build.gradle 之外的其他内容,再 build.gradle 内容清空。
2. 在 src/main/ 目录下创建一个 groovy 目录,用于存放 Gradle 插件代码。
3. 在 Android Module 的 build.gradle 中添加 gradle sdk和 groovy 语言支持:
apply plugin: 'groovy'
dependencies {
//gradle sdk
implementation gradleApi()
//groovy sdk
implementation localGroovy()
}
4. 实现具体的 Gradle 插件代码:
package com.budaye
import org.gradle.api.*;
class HelloGradlePlugin implements Plugin<Project> {
void apply(Project project) {
startApply();
project.task('hello') {
group = "budaye"
description = "gradle build script demo"
doLast {
println "Hello from the HelloGradlePlugin"
}
}
}
private void startApply(){
println '------------------------'
println 'apply HelloGradlePlugin'
println '------------------------'
}
}
5. 创建 properties 文件,以便让 Gradle 找到 HelloGradlePlugin 类。
目录结构如下:
文件内容如下:
implementation-class=com.budaye.HelloGradlePlugin
6. 发布插件
为了在其他地方使用该插件,必须要先进行插件发布。
在 build.gradle 中添加如下内容:
apply plugin: 'maven-publish'
publishing {
publications {
mavenJava(MavenPublication) {
//定义插件的在本地 maven 中的 id
groupId 'com.budaye'
artifactId 'pluginDemo'
//定义插件的在本地 maven 中的版本号
version '1.0.0'
from components.java
}
}
}
publishing {
repositories {
maven {
// 发布位置
url uri('/Users/apple/Documents/localMaven')
}
}
}
控制台窗口,输入以下命令进行插件发布:
gradlew publish
发布成功后,你就可以在本地路径中看到生成的插件了:
好了,发布过程以及完成了,接下来就可以在其他项目中使用这个 Gradle 插件了。
自定义 Gradle 插件的使用
- 在工程的根目录的 build.gradle 中添加库地址:
repositories {
google()
jcenter()
maven {//local maven repo path
url uri('/Users/apple/Documents/localMaven')
}
}
- 在 Module 的 build.gradle 中 apply 这个插件:
apply plugin: 'com.budaye.HelloGradlePlugin'
- 同步(Sync)之后,就可以看到自定义插件的任务了。
**PS:更多精彩内容,请查看 --> 《Android 性能优化》
**PS:更多精彩内容,请查看 --> 《Android 性能优化》
**PS:更多精彩内容,请查看 --> 《Android 性能优化》