3种方法带你玩自定义Android Gradle插件
每日推荐
推荐一个热修复框架,无需重启应用,即可修复代码和资源,零私有api调用,适用于2.x~P。
https://github.com/ximsfei/Stark
本文作者
作者:binbinqq86
链接:
https://blog.csdn.net/binbinqq86/article/details/81033746
本文由作者授权发布。
gradle插件可以帮助我们干很多事情,类似一个工具,可以根据你自己想要的效果去定制自己的插件,本文就讲解一下怎么去实现自己的一个插件。
根据官网描述,自定义插件一共有三种方式:
https://docs.gradle.org/current/userguide/custom_plugins.html
Build script——gradle文件,构建脚本内,不过这种只能在文件内使用
buildSrc project——buildSrc工程,可以在自己的工程内随意使用,但是其他工程就无法使用
Standalone project——单独项目的插件,可以随意一个工程去引用,前提是需要发布到本地仓库或者maven私服
下面我们就三种方式分别去看一下怎么实现~
gradle文件内,就是自己新建一个,或者在项目或者工程的build.gradle里面去写一个类,来继承org.gradle.api.Plugin,并实现里面的apply方法。废话不多说,直接上代码:
apply plugin: Plugin2
class Plugin2 implements Plugin<Project>{
void apply(Project target) {
println("this is a plugin in the file 'build.gradle'...")
}
}
我们build一下:
可以看到输出了里面的内容,这样就完成了一个最简单的插件开发,当然这里没有去做任何事情,只是打印一句话,后续我们会去开发一个比较实用的打包加固签名apk的插件,这里只是学会怎么去做插件,但是这是插件只能在这个文件内引用,这样局限性就比较大了,所以一般不采用此方式。
这种方式需要在工程下新建一个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>{
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文件夹都不需要了,简单吧!最后看一下运行结果:
上面这种方式也有局限性,就是只能在自己的工程里使用,如果想写一个插件,到处都可以用,那样才是我们的最终目的,这就需要单独建立一个工程,我们在工程里新建一个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仓库。
https://blog.csdn.net/binbinqq86/article/details/81033716
首先我们需要引入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脚本用的,而另外的则是给项目使用的。
本文通过最简单的方式,介绍了如何使用3种方式开发 Studio 插件,关于实际的应用场景,后面会再给大家推送。
最后放上源码下载:
https://github.com/binbinqq86/groovy
推荐阅读:
扫一扫 关注我的公众号
如果你想要跟大家分享你的文章,欢迎投稿~
┏(^0^)┛明天见!