查看原文
其他

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

binbinqq86 鸿洋 2019-04-05

每日推荐


推荐一个热修复框架,无需重启应用,即可修复代码和资源,零私有api调用,适用于2.x~P。


https://github.com/ximsfei/Stark


本文作者


作者:binbinqq86

链接:

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

本文由作者授权发布。


1前言


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


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

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


  1. Build script——gradle文件,构建脚本内,不过这种只能在文件内使用

  2. buildSrc project——buildSrc工程,可以在自己的工程内随意使用,但是其他工程就无法使用

  3. Standalone project——单独项目的插件,可以随意一个工程去引用,前提是需要发布到本地仓库或者maven私服


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


2gradle文件内


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的插件,这里只是学会怎么去做插件,但是这是插件只能在这个文件内引用,这样局限性就比较大了,所以一般不采用此方式。


3buildSrc工程


这种方式需要在工程下新建一个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方式的自定义插件就结束了,来看一下怎么引用吧~


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


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



4单独的一个工程


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


5最后


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



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



我们只需要把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


推荐阅读

今日头条适配方案

Android 有近10种动画,你都知道吗?

推荐4个不错的开源项目


扫一扫 关注我的公众号

如果你想要跟大家分享你的文章,欢迎投稿~


┏(^0^)┛明天见!


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存