Gradle自定义插件(Android)

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

自定义插件

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

一、Build Script方式

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

//app build.gradle
apply plugin: BuildScriptPlugin
class BuildScriptPlugin implements Plugin<Project> {
    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<Project> {

    @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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容