自定义Android Gradle插件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/binbinqq86/article/details/81033746

转载请注明出处:https://blog.csdn.net/binbinqq86/article/details/81033746

前言

gradle插件可以帮助我们干很多事情,类似一个工具,可以根据你自己想要的效果去定制自己的插件,本文就讲解一下怎么去实现自己的一个插件。根据官网描述,自定义插件一共有三种方式:

  • Build script——gradle文件,构建脚本内,不过这种只能在文件内使用
  • buildSrc project——buildSrc工程,可以在自己的工程内随意使用,但是其他工程就无法使用
  • Standalone project——单独项目的插件,可以随意一个工程去引用,前提是需要发布到本地仓库或者maven私服

下面我们就三种方式分别去看一下怎么实现~

gradle文件内

gradle文件内,就是自己新建一个,或者在项目或者工程的build.gradle里面去写一个类,来继承org.gradle.api.Plugin,并实现里面的apply方法。废话不多说,直接上代码:

apply plugin: Plugin2
class Plugin2 implements Plugin<Project>{

    @Override
    void apply(Project target) {
        println("this is a plugin in the file 'build.gradle'...")
    }
}

我们build一下:
这里写图片描述
可以看到输出了里面的内容,这样就完成了一个最简单的插件开发,当然这里没有去做任何事情,只是打印一句话,后续我们会去开发一个比较实用的打包加固签名apk的插件,这里只是学会怎么去做插件,但是这是插件只能在这个文件内引用,这样局限性就比较大了,所以一般不采用此方式。

buildSrc工程

这种方式需要在工程下新建一个module,名字必须为buildSrc,我们看一下目录结构:
这里写图片描述

这种结构就是groovy工程,在android studio里面创建一个library的module,然后删除main下面的java文件夹,新建一个groovy文件夹,新建包,groovy文件,新建resources/META-INF/gradle-plugins,然后在该文件夹下创建一个以.properties结尾的文件,前面部分就是我们要引用的插件名称,文件内容如下:

implementation-class=com.tb.plugin.TbPlugin

这就是告诉这个插件对应的groovy具体的类。我们再来看看TbPlugin文件:

package com.tb.plugin

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

class TbPlugin implements Plugin<Project>{

    @Override
    void apply(Project project) {
        println('this is a buildSrc plugin...')
    }
}

因为groovy完全兼容java,但是又进行了扩展,所以我们如果不会groovy语言,也可以直接使用java去写代码,注意插件必须继承Plugin接口,然后就可以在apply方法去做自己想做的小工具了。。。

最后再来看一下build.gradle文件:

apply plugin: 'groovy'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

也是很简单的几句话,引入groovy插件,依赖gradle的api,groovy的api,然后就可以尽情的书写代码了。到此,buildSrc方式的自定义插件就结束了,来看一下怎么引用吧~

//4.buildSrc下的插件
//此处插件id大小写,中下划线均可***
//apply plugin: ‘com.tb.plugin-buildSrc’
//该方式可以不需要resources文件夹,直接引用插件全类名即可
//apply plugin: com.tb.plugin.TbPlugin

通过以上两种方式都可以很方便的引用插件,如果是通过类全名,可以连resources文件夹都不需要了,简单吧!最后看一下运行结果:

这里写图片描述

单独的一个工程

上面这种方式也有局限性,就是只能在自己的工程里使用,如果想写一个插件,到处都可以用,那样才是我们的最终目的,这就需要单独建立一个工程,我们在工程里新建一个module:

这里写图片描述

目录结构跟上面也基本上没有差别,唯一不同的是build.gradle文件,我们来看一下:

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

dependencies {
    compile gradleApi()
    compile localGroovy()
}

group='com.tb.plugin'
version='1.0.0'
archivesBaseName='module-plugin'

uploadArchives{
    repositories {
        mavenDeployer{
            repository(url: uri('../tbModulePlugin'))
        }
    }
}

可以看到,不同的地方就是这种方式,因为需要其他工程也可以引用,所以就需要我们去发布成jar包,可以发布到本地,也可以直接把jar包放到lib下面,也可发布到maven仓库,可以是私服,如果想给所有人都能用,也可以发布到jcenter仓库,关于maven的发布的相关知识,可以参考我的另外一篇文章:Android和Maven仓库那些事本文就简单说一下怎么发布到本地maven仓库。

首先我们需要引入maven插件,然后指定maven发布需要的三个要素:groupId,artifactId,version。这三个也是后面我们引用的时候需要指定的东西,通过这三个要素,maven就可以找到我们指定的插件,第一个就是分组的id,一般是公司域名倒过来,第二个是工程名,也可以不写,默认就是项目名,第三个是版本号。最后我们发布到当前父目录,也就是根工程目录下的tbPlugin文件夹下,我们点击gradle窗口,找到该task,双击执行:
这里写图片描述

这里写图片描述
可以看到如上输出,当然也可以使用gradle命令去执行,然后我们去tbPlugin文件夹看看:
这里写图片描述

可以看到,目录结构就是我们前面定义的groupId,artifactId,version,里面有我们需要的jar文件,这样就可以在其他工程进行本地的引入了:
在工程的build.gradle文件添加如下依赖和仓库地址:
这里写图片描述

然后就可以在其他module去引用了,也可在其他工程去引用,实质就是引用这个jar包。

apply plugin: ‘com.tb.plugin.module’

build一下,看看结果:
这里写图片描述

打印出了我们的this is a module plugin…

最后

至此三种自定义插件的方式就讲完了,是不是很简单~其实不止可以使用groovy去写插件,还可以用java、kotlin等等你会的语言去写,只需要我们在插件目录的build.gradle文件加入相应的插件即可,比如java:
这里写图片描述

这里我们引入了java-gradle-plugin这个插件,他自动包含了java插件,但是可以用脚本的方式去定义插件名和id,省去了resources文件夹和properties文件,然后我们就可以像写java一样去写插件了,再比如kotlin:
这里写图片描述
我们只需要把groovy插件换成kotlin就可以用kotlin去编写插件了,是不是很随意!哈哈~

这里有两点需要说明一下:

  • 为什么引用的时候需要放到buildscript里面,而不是allprojects里面
  • 为什么采用的是classpath而不是compile或者api或者implementation

问题一:这是因为buildscript里面的dependencies是gradle脚本使用的,而allprojects里面的dependencies是给所有的项目使用的,而这里我们写的是插件,是给gradle用的,所以需要放到这里,千万不可混淆。

问题二:同样也是因为gradle,classpath是gradle脚本用的,而另外的则是给项目使用的。

关于插件的应用,可以参考我的另外一篇文章:Android用Gradle实现一行命令全自动混淆加固签名渠道包的生成

最后放上源码下载,不明白的朋友可以在下方留言~

展开阅读全文

没有更多推荐了,返回首页