3种方法带你玩自定义Android Gradle插件

1

前言

gradle插件可以帮助我们干很多事情,类似一个工具,可以根据你自己想要的效果去定制自己的插件,本文就讲解一下怎么去实现自己的一个插件。

根据官网描述,自定义插件一共有三种方式:

https://docs.gradle.org/current/userguide/custom_plugins.html

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

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

2

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一下:

3种方法带你玩自定义Android Gradle插件

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

3

buildSrc工程

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

3种方法带你玩自定义Android Gradle插件

这种结构就是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方式的自定义插件就结束了,来看一下怎么引用吧~

// buildSrc下的插件

//此处插件id大小写,中下划线均可***

//apply plugin: ‘com.tb.plugin-buildSrc’

//该方式可以不需要resources文件夹,直接引用插件全类名即可

//apply plugin: com.tb.plugin.TbPlugin

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

3种方法带你玩自定义Android Gradle插件

4

单独的一个工程

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

3种方法带你玩自定义Android Gradle插件

目录结构跟上面也基本上没有差别,唯一不同的是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仓库。

https://blog.csdn.net/binbinqq86/article/details/81033716

首先我们需要引入maven插件,然后指定maven发布需要的三个要素:

groupId,artifactId,version。

这三个也是后面我们引用的时候需要指定的东西,通过这三个要素,maven就可以找到我们指定的插件,第一个就是分组的id,一般是公司域名倒过来,第二个是工程名,也可以不写,默认就是项目名,第三个是版本号。

最后我们发布到当前父目录,也就是根工程目录下的tbPlugin文件夹下,我们点击gradle窗口,找到该task,双击执行:

3种方法带你玩自定义Android Gradle插件

3种方法带你玩自定义Android Gradle插件

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

3种方法带你玩自定义Android Gradle插件

可以看到,目录结构就是我们前面定义的groupId,artifactId,version,里面有我们需要的jar文件,这样就可以在其他工程进行本地的引入了:

在工程的build.gradle文件添加如下依赖和仓库地址:

3种方法带你玩自定义Android Gradle插件

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

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

build一下,看看结果:

3种方法带你玩自定义Android Gradle插件

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

5

最后

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

3种方法带你玩自定义Android Gradle插件

这里我们引入了java-gradle-plugin这个插件,他自动包含了java插件,但是可以用脚本的方式去定义插件名和id,省去了resources文件夹和properties文件,然后我们就可以像写java一样去写插件了,再比如kotlin:

3种方法带你玩自定义Android Gradle插件

我们只需要把groovy插件换成kotlin就可以用kotlin去编写插件了,是不是很随意!哈哈~

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

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

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

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

本文通过最简单的方式,介绍了如何使用3种方式开发 Studio 插件,关于实际的应用场景,后面会再给大家推送。

最后放上源码下载:

https://github.com/binbinqq86/groovy

相关推荐