创建自定义 gradle 插件的三种方法

创建自定义 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窗口,可以看到如下结果:

创建自定义 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;

执行和输出如下:

创建自定义 gradle 插件的三种方法

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 类。

目录结构如下:

创建自定义 gradle 插件的三种方法

文件内容如下:

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 插件了。

自定义 Gradle 插件的使用

  1. 在工程的根目录的 build.gradle 中添加库地址:
    repositories {
        google()
        jcenter()
        maven {//local maven repo path
            url uri('/Users/apple/Documents/localMaven')
        }
    }
  1. 在 Module 的 build.gradle 中 apply 这个插件:
apply plugin: 'com.budaye.HelloGradlePlugin'
  1. 同步(Sync)之后,就可以看到自定义插件的任务了。

创建自定义 gradle 插件的三种方法


**PS:更多精彩内容,请查看 --> 《Android 性能优化》
**PS:更多精彩内容,请查看 --> 《Android 性能优化》
**PS:更多精彩内容,请查看 --> 《Android 性能优化》

上一篇:aptitude 更新Ubntu 操作


下一篇:NOI2018准备Day2