Gradle 自定义插件

自定义插件概述

自定义Gradle插件主要有三种方式,分别是

  1. build.gradle中编写、
  2. buildSrc工程项目中编写、
  3. 独立项目中编写
    Groovy、Java、Kotlin都可以作为实现插件的语言,在本文的示例中,使用Groovy作为实现语言。

方法一:build.gradle中编写

在实际工作中我们很少会在build.gradle中编写自定义插件,

//使用插件
apply plugin: CustomPlugin

//自定义插件:实现Plugin类接口,重写apply方法
class CustomPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.task('CustomPluginTask') {
            doLast {
                println "大家好,我是一个自定义插件,在这里写下你的具体功能"
            }
        }
    }
}

Gradle 自定义插件

方法二:buildSrc工程项目

我是通过AndroidStudio创建的插件工程,假设你现在已经有了一个Android项目:

  1. 我们需要在项目根目录里建立下图的目录结构,Gradle会自动识别来完成编译和测试

Gradle 自定义插件

注意:上图的buildSrc下的build.gradle,也需要新建一个,目前内容为空就行

  1. 创建文件

    a. 在groovy目录下,新建一个包(包名随意),包内新建一个文件,必须以.groovy作为后缀名(文件名随意),这里起名为PluginImpl.groovy

    b. 在resources目录下新建一个META-INF文件夹,在META-INF文件夹下新建一个gradle-plugins文件夹,在gradle-plugins里创建一个.properties文件,他的文件名必须是a步骤里的那个包名
    Gradle 自定义插件

  2. 编写PluginImpl.groovy(注意修改成你的包名,其余照抄)

package com.demo.plugin

import org.gradle.api.Plugin
import org.gradle.api.Project

class PluginImpl implements Plugin<Project> {
    void apply(Project project) {
        project.task('testTask') << {
            println "Hello gradle plugin"
        }
    }
}

Gradle 自定义插件
4. .properties编写

只写一句话(注意修改为你的包名)

implementation-class=com.demo.plugin.PluginImpl

Gradle 自定义插件

  1. 至此自定义插件写完了,此刻目录结构为
    Gradle 自定义插件

使用这个自定义插件

// 引入buildSrc里的自定义插件
apply plugin: 'com.demo.plugin'

Gradle 自定义插件

方法三:独立项目中编写

无论是在build.gradle中编写自定义插件,还是buildSrc项目中编写自定义插件,都只能在自己的项目中进行使用。如果想要分享给其他人或者自己用,可以在一个独立的项目中编写插件,这个项目会生成一个包含插件类的JAR文件,有了JAR文件就很容易进行分享了。

编写插件

一、在androidstudio里新建一个module项目

新建一个android项目,在项目内部新建一个module(module名字可以随便起了,这里叫duliplugin),把这个module文件夹里的东西全部删掉,只留下build.gradle文件

二、建立目录结构

重复方法二的步骤,建立与方法二里一样的文件目录结构
Gradle 自定义插件

三、编辑groovy文件

(其实与方法二是一样的,注意事项看方法二)

package com.demo.plugin1

import org.gradle.api.Plugin
import org.gradle.api.Project

class PluginImpl implements Plugin<Project> {
    void apply(Project project) {
        project.task('testPlugin') {
            doLast {
                println "自定义插件ccc"
            }
        }
    }
}

Gradle 自定义插件

四、编辑properties文件

(其实与方法二是一样的,注意事项看方法二)

implementation-class=com.demo.plugin1.PluginImpl

Gradle 自定义插件

五、编写build.gradle文件

这里才是方法三的重点


apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
    compile localGroovy()
}
repositories {
    mavenCentral()
}
repositories {
    mavenCentral()
}

uploadArchives {
    repositories {
        mavenDeployer {
            //设置插件的GAV参数
            pom.groupId = 'com.demo.plugin1'//你的包名
            pom.artifactId = 'myPlugin'
            pom.version = '1.1.9'//版本号
            //文件发布到下面目录  ../是父目录
            repository(url: uri('../repo'))
        }
    }
}


然后看下图执行uploadArchives这个task得到jar包
Gradle 自定义插件

注意:
有时候打开项目卡Indexing paused due to batch updated上,插件工程会报错,找不到插件,可以删除插件工程里的.iml文件> ,重启Androidstudio

使用这个独立插件打出的jar包

  1. 在新的项目里使用这个独立插件的jar包,复制repo到新项目的根目录统计目录(也可以是其他路径,但注意引用仓库地址时候,要相应地更改)
  2. 编写项目的build.gradle文件
buildscript {
    ...
    repositories {
        ...
        maven {//本地Maven仓库地址
            url uri('../repo')
        }
    }
    dependencies {
       ...
        classpath 'com.demo.plugin1:myPlugin:1.1.9'
    }
}

Gradle 自定义插件

3.编写项目的app.gradle文件

apply plugin: 'com.demo.plugin1'

Gradle 自定义插件

  1. 同步之后,发现gradle里有了这个插件里的task,执行-输出-ok

Gradle 自定义插件

参考资料:

Gradle核心思想(六)自定义Gradle插件的三种方式