Gradle自定义插件(Android)

Gradle插件使用在日常开发中已经很熟悉,那么我们怎么去自定义我们的插件?

自定义插件

自定义插件基于源码放置可以分为3种:

一、Build Script方式

这种插件脚本的源码放置在模块内的 build.gradle 中,好处就是插件脚本会被自动编译并添加进模块的 classpath 中,我们完全不用做任何事情。但是,这种插件脚本只能在声明的这个 build.gradle 中使用,其他模块是没办法复用这个插件的。

//app build.gradle
apply plugin: BuildScriptPlugin
class BuildScriptPlugin implements Plugin {
    void apply(Project project) {
        project.task('hello') {
            group = "test-plugin"
            doLast {
                println "Hello"
            }
        }
    }
}

这里group为右侧组名称,向这个组添加一个名为hello的task

优势:
1、在当前build.gradle文件编写,不需要其他配置即可使用
劣势:
1、在一个文件里面写代码多,不易维护
2、插件代码只能在当前文件中生效,无法复用

二、BuildSrc project方式

Gradle插件是使用Groovy进行开发的,而Groovy其实是可以兼容Java的。Android Studio其实除了开发Android App外,完全可以胜任开发Gradle插件这一工作,下面来讲讲具体如何开发。

  • 新建一个Android项目。
  • 新建一个Android Module项目,类型选择Android Library。
  • 将新建的Module中除了build.gradle文件外的其余文件全都删除,然后删除build.gradle文件中的所有内容。
  • 在新建的module中新建文件夹src,接着在src文件目录下新建main文件夹,在main目录下新建groovy目录,这时候groovy文件夹会被Android识别为groovy源码目录。除了在main目录下新建groovy目录外,你还要在main目录下新建resources目录,同理resources目录会被自动识别为资源文件夹。在groovy目录下新建项目包名,就像Java包名那样。resources目录下新建文件夹META-INF,META-INF文件夹下新建gradle-plugins文件夹。这样,就完成了gradle 插件的项目的整体搭建,之后就是小细节了。目前,项目的结构是这样的。


    buildSrc project
这里说一下各个目录的作用:
[groovy]:

此目录下为插件源码目录
此处测试代码:
CustomPluginTest.groovy

package com.ann

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

class CustomPluginTest implements Plugin {

    @Override
    void apply(Project project) {
        //增加闭包名称,闭包为customPlugin,是 CustomPluginTestExtension类型,因此CustomPluginTestExtension类型中的JaveBean类型的属性可以任意设置
        project.extensions.add("customPlugin", CustomPluginTestExtension)
        project.task("showPersonInfo") << {
            println("姓名:" + project.customPlugin.name)
            println("年龄:" + project.customPlugin.age)
            println("地址:" + project.customPlugin.address)
        }
    }
}

CustomPluginTestExtension.groovy

package com.ann
class CustomPluginTestExtension{
    def name = "init"
    def age = "init"
    def address = "init"
}
[resources]:

此为资源目录,在上图中gradle-plugins文件夹新建了一个ann-test.properties文件,ann-test文件名称也是以后再build.gradle文件中apply plugin: 'ann-test'的名称,如果一个库有多个插件就建立多个此文件

#implementation-class=为固定格式,等号后面是具体类地址
implementation-class=com.ann.CustomPluginTest
[buildSrc build.gradle]:
apply plugin: 'groovy'
apply plugin: 'maven-publish'

/**
 * 编写自定义插件配置
 */
dependencies {
    compile gradleApi()
    compile localGroovy()
}

repositories {
    mavenCentral()
}
[app build.gradle]:

重新编译后,会在app中出现新task:showPersonInfo


image.png

优势:插件代码可以被多个libiary使用
劣势:这种适用于只在本项目使用的情况

三、Standalone project 方式

这种方法就是使用单独的一个工程/模块创建我们的 Gradle 插件,这种方法会构建和发表一个JAR文件,可以提供给多工程构建和其他开发者共同使用。然后publish到仓库,通过apply plugin: 'com.android.application' 这种方式使用,实现了多项目,多module复用。

在开发方面和方式二一样,不一样的地方是:
1、module名称可以自定义
2、module的build.gradle 文件中加入发布代码

[buildSrc build.gradle]:
apply plugin: 'groovy'
apply plugin: 'maven-publish'

/**
 * 编写自定义插件配置
 */
dependencies {
    compile gradleApi()
    compile localGroovy()
}

repositories {
    mavenCentral()
}

/**
 * 发布配置,这里发布到本地
 */
publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId 'ann.gradle.plugin'
            artifactId 'customplugin-extension'
            version '1.0.0-SNAPSHOT'
            from components.java
        }
    }

    repositories {
        maven {
            // change to point to your repo, e.g.
            url uri('../repo')
        }
    }
}
发布到本地

编译后,右侧gradle任务栏module【我这里是buildSrc,可以自定义】中会多一个publish,执行此任务,左侧项目中会多一个repo仓库文件夹,

使用:

  • 在工程的根目录的 build.gradle 中添加如下内容:
buildscript {
    repositories {
        maven {
            url uri('./repo')
        }
    }
    dependencies {
        classpath 'ann.gradle.plugin:customplugin-extension:1.0.0-SNAPSHOT'
    }
}
  • 然后,在app的 build.gradle 中 apply 这个插件:
apply plugin: 'ann-test'
customPlugin{
    name = "bobo"
    age = "25"
    address = "广东珠海"
}

这里是发布到本地仓库,实际使用当中是发布到外部仓库中,详细就不在这里说。
更多插件发布内容,请查看官网:Maven Publishing

你可能感兴趣的:(Gradle自定义插件(Android))