AS 自定义 Gradle plugin 插件 案例 MD

Markdown版本笔记我的GitHub首页我的博客我的微信我的邮箱
MyAndroidBlogsbaiqiantaobaiqiantaobqt20094baiqiantao@sina.com

AS 自定义 Gradle plugin 插件 案例 MD


目录

目录
AS 中自定义 Gradle plugin
编写插件
传递参数
发布插件到仓库
使用插件

AS 中自定义 Gradle plugin

参考1
参考2

结合 AndroidStudio,自定义Gradle plugin可以完成很多功能,比如:添加编译依赖、进行Aspecj编译、自动生成混淆配置。

项目中引入自定义 Gradle plugin 一般有三种方法:

  • 直接写在 build.gradle 中,这种方式的缺点是无法复用插件代码,在其他项目中还得复制一遍代码
  • plugin 源码放到 rootProjectDir/buildSrc/src/main/groovy 目录下(没用过)
  • plugin 打包后发布到 maven 仓库, 然后项目通过依赖的形式引入

下面介绍的是第 3 种方式

编写插件

1、创建插件 module
新建一个Android工程,在这个工程里面新建一个Android Library,先起名叫 cooker-plugin 吧,我们将会用这个 library 写 Gradle plugin

2、建立 plugin 的目录结构
把这个 cooker-plugin 中除了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 插件的项目的整体搭建,之后就是小细节了。目前,项目的结构是这样的:

3、声明 plugin 信息
src/main/resources/META-INF/gradle-plugins 里声明 plugin 信息,比如新建cooker-plugin.properties文件(文件名 cooker-plugin 是插件名称),在其中指定插件的实现类的全路径类名:

implementation-class=com.helen.plugin.CookerPlugin

4、配置 build.gradle
在 build.gradle 中声明用 groovy 开发

apply plugin: 'groovy'dependencies {compile gradleApi()compile localGroovy()
}repositories {mavenCentral()
}

5、编写插件逻辑
插件代码放在 src/main/groovy 下,实现 plugin,其实就是实现 Plugin<Project> 接口

package com.helen.pluginimport org.gradle.api.Plugin
import org.gradle.api.Projectclass CookerPlugin implements Plugin<Project> {@Overridevoid apply(Project project) {println "这里实现plugin的逻辑!"project.task('cooker-test-task').doLast { variant ->println "自定义任务-doLast"}.doFirst { variant ->println "自定义任务-doFirst"}}
}

6、生成 plugin 插件
在 cooker-plugin 项目中,build 一下

任务完成以后,就能在build/libs下生成对应的 plugin 插件了

现在这个插件就能使用了,可以发布在本地仓库或者 Maven 仓库

传递参数

接下来我们介绍如何获得自定义的参数

1、新建 PluginExtension.groovy,用于定义我们可以支持的参数:

class PluginExtension {def param1 = "param1 defaut"def param2 = "param2 defaut"def param3 = "param3 defaut"
}

我们希望能传入嵌套的参数,所以再新建一个 PluginNestExtension.groovy:

class PluginNestExtension {def nestParam1 = "nestParam1 defaut"def nestParam2 = "nestParam2 defaut"def nestParam3 = "nestParam3 defaut"
}

2、新建一个 CustomTask.groovy,继承 DefaultTask 类,使用 @TaskAction 注解标注实现的方法:

class CustomTask extends DefaultTask {@TaskActionvoid output() {println "param1 is ${project.pluginExt.param1}"println "param2 is ${project.pluginExt.param2}"println "param3 is ${project.pluginExt.param3}"println "nestparam1 is ${project.pluginExt.nestExt.nestParam1}"println "nestparam2 is ${project.pluginExt.nestExt.nestParam2}"println "nestparam3 is ${project.pluginExt.nestExt.nestParam3}"}
}

这里我们只是做了拿到了参数,然后做最简单的输出操作,使用 ${project.pluginExt.param1}${project.pluginExt.nestExt.nestParam1} 等拿到使用者设置的值。

3、在 apply 方法中建立映射关系:

project.extensions.create('pluginExt', PluginExtension)
project.pluginExt.extensions.create('nestExt', PluginNestExtension)
project.task('customTask', type: CustomTask)

4、定义外部参数,这里我们定义了param1,param2,nestParam1,nestParam2,而param3和nestParam3保持默认。

pluginExt {param1 = 'app param1'param2 = 'app param2'nestExt {nestParam1 = 'app nestParam1'nestParam2 = 'app nestParam2'}
}

这样之后,在执行customTask时就会输出使用者对自定义的参数设置的值

发布插件到仓库

发布到仓库的方式有很多,下面只介绍利用 mavenDeployer 插件发布在本地仓库

1、引入 mavenDeplayer 插件
修改 cooker-plugin 的 build.gradle,添加如下内容:

apply plugin: 'maven'//添加maven plugin,用于发布我们的jar
uploadArchives {repositories {mavenDeployer {pom.groupId = 'com.helen.plugin'pom.artifactId = 'cooker-plugin'pom.version = 1.0repository(url: uri('../release'))   //文件发布目录(相对当前 build.gradle 的路径)}}
}

2、用 uploadArchices 发布
运行 uploadArchives 就能在设置的仓库路径中生成 cooker-plugin 了

使用插件

1、在 build.gradle 中引入 cooker-plugin

buildscript {repositories {jcenter()maven {url uri('release') //cooker-plugin 所在的仓库,这里是本地目录(相对当前 build.gradle 的路径)}}dependencies {classpath 'com.android.tools.build:gradle:3.2.1'classpath 'com.helen.plugin:cooker-plugin:1.0'  //引入cooker-plugin}
}
apply plugin: 'cooker-plugin'

2、我们编译 App 的时候 cooker-plugin 就会介入了
每次 clean/build 时, 在 Gradle Console 可以看到我们的 log

这里实现plugin的逻辑!

3、使用 cooker-plugin 中定义的 task
前面demo中,我们新建了两个task: cooker-test-taskcustomTask, 我们可以通过两种方式运行这两个task,一种方式是双击 app > other 分类下的 task 名,一种是通过 gradlew 命令

cooker-test-task 打印的日志:

Executing tasks: [cooker-test-task]这里实现plugin的逻辑!
:app:cooker-test-task
自定义任务-doFirst
自定义任务-doLast

customTask 打印的日志:

Executing tasks: [customTask]这里实现plugin的逻辑!
:app:customTask
param1 is app param1
param2 is app param2
param3 is param3 defaut
nestparam1 is app nestParam1
nestparam2 is app nestParam2
nestparam3 is nestParam3 defaut

到此为止, 自定义Gradle plugin的基本过程就介绍完了。

2019-2-11

转载于:https://www.cnblogs.com/baiqiantao/p/10362507.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中英文对照 —— 机械

0. 汽车 relay&#xff1a;继电器&#xff0c;clutch&#xff1a;离合&#xff1b; motor&#xff1a;发动机&#xff08;马达&#xff09;&#xff1b;档位&#xff1a; park&#xff1a;停车挡braking&#xff1a;制动&#xff08;也就是刹车&#xff09;空挡&#xff1a;neu…

机票垂直搜索引擎的性能优化

机票垂直搜索引擎的性能优化 原文:机票垂直搜索引擎的性能优化一、行业背景与垂直搜索我们先了解一下机票的行业背景&#xff0c;下图是由中航信统计的数据&#xff0c;蓝色的曲线代表平均每公里的票价&#xff0c;红色曲线指的是客运量。从2011年到2016年&#xff0c;无论是国…

Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇

前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解&#xff0c;主要是想提炼下通用装备系统结构和类体系。前两天又读了另一个插件 C# Inventory-uGui v2.0.1的源码&#xff08;应该也是老外写的&#xff09;&#xf…

Java项目问题_Java项目出现的问题01----学习

0 运行环境MyEcplise2016Tomcat8.01今天在html的表格提交跳转时发现&#xff0c;想要提交到自己写servlet程序中&#xff0c;却发现总是出错http://localhost:8080/Test4/Test4/fail.html多出一个项目路径/Test4&#xff0c;但是程序没有任何问题&#xff0c;最后发现是在Ecpli…

混合云:公共云和私有云之间取得平衡的方式?

在可预见的未来&#xff0c;混合云是现实的&#xff0c;但真正的收获是试图找出企业最终朝向公共或私人资源是否平衡。 你在与任何技术供应商沟通时&#xff0c;也许会涉及到数据中心&#xff0c;但大多会提到云计算的三种方式&#xff1a;私有云&#xff0c;公共云&#xff0c…

腾腾流氓,云云更流氓(问微信怎样接入支付宝支付),手贱的赶紧点,你会感谢我的...

草原上的两匹马&#xff01; 打从当年微信开始布局公众号之初时&#xff0c;估计就已经想到了与支付宝正面冲突的场面&#xff0c;所以微信先来个瞒天过海&#xff0c;在春晚搞了个微信红包&#xff0c;那叫一个火呀&#xff0c;此时的云云隐隐感觉到些许不安。 早期的微信开发…

java中的string是什么_什么是String

2017-07-28String和StringBufString namenew String("HuangWeiFeng");System。out。println(name"is my name");看似已经很精简了&#xff0c;其实并非如此。为了生成二进制的代码&#xff0c;要进行如下的步骤和操作&#xff1a;(1) 生成新的字符串 new S…

MD5与SHA1

一、MD5 MD5消息摘要算法&#xff08;英语&#xff1a;MD5 Message-Digest Algorithm&#xff09;&#xff0c;一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确保信…

java基本类型的默认值及其取值范围

转载于:https://www.cnblogs.com/billyu/p/5843845.html

tair client java_TFS(Taobao File System)Java Client 使用经验

TFS Java客户端的说明tfs-client-java版本选择&#xff1a;---------------------------------------tfs-client-java的版本有&#xff1a;release-2.0.0/tfs-with-large-2.1.1/tfs-client-java-2.1.3/release-2.2.2/release-2.2.3/release-2.2.4/release-2.2.6/最终我选用了tf…

DevExpress WinForms使用教程:图表控件 - 内置深入查询

【DevExpress WinForms v18.2下载】在最新发布的DevExpress WinForms v18.2中&#xff0c;DevExpress WinForms和ASP.NET图表控件引入嵌套系列模板的概念&#xff0c;是您能在不编写自定义代码的情况下深入查询图表。 Chart控件的嵌入式痕迹导航元素显示导航层次结构中各个数据…

AlfaLaval公司采用低速通风技术冷却数据中心

日前&#xff0c;瑞典热交换专家AlfaLaval公司推出了遵循低速通风原则的一系列数据中心冷却解决方案&#xff0c;其方案需要大量的风扇&#xff0c;而使空气以相当慢的速度流动&#xff0c;取得了与计算机机房空调&#xff08;CRAC&#xff09;一样有效的制冷效果。 该公司表示…

1.2 如何在visual studio 中建立C#程序

这一节简单介绍一下怎么在visual studio 2015中建立第一个C#程序&#xff0c;我使用的是2015版的visual studio&#xff0c;不同版本可能有一些差异&#xff0c;不过大体上是相同的&#xff0c;这些信息仅供新手参考&#xff0c;大牛请自动跳过。 首先双击visual studio 2015的…

javascript在html中的延迟与异步

1.相同点&#xff1a;延迟与异步都会同时加载script 2.不同点&#xff1a;延迟是script加载完成后&#xff0c;待HTML执行完毕后&#xff0c;才会接着执行script&#xff1b; 异步是script加载完成后&#xff0c;接着就执行该程序&#xff0c;HTML等到script完全执行完毕后&…

三星全速进军物联网 所有产品都将内置互联功能

韩媒报道&#xff0c;近日消息传出&#xff0c;三星电子的家电部门&#xff0c;当前生产的产品都将内建Wi-Fi。相关高层表示&#xff0c;此种做法可替更先进的功能预作准备&#xff0c;因为家电寿命较长&#xff0c;至少可用五年。目前为止&#xff0c;三星家电只有部分具备Wi-…

Python ValueError: IO operation on closed file

ValueError IO operation on closed file表示处理了已经被关闭的数据&#xff0c;在python 中 with语句的上下文会帮助处理&#xff0c;也就是说&#xff0c;当python的处理代码不对齐的时候会出现这种情况。例子如下&#xff1a; header那一行&#xff0c;突出&#xff0c;也就…

java面向字符的输入流_详细解读Java编程中面向字符的输入流

字符流是针对字符数据的特点进行过优化的&#xff0c;因而提供一些面向字符的有用特性&#xff0c;字符流的源或目标通常是文本文件。 Reader和Writer是java.io包中所有字符流的父类。由于它们都是抽象类&#xff0c;所以应使用它们的子类来创建实体对象&#xff0c;利用对象来…

任务信号量

在实际任务间的通信中&#xff0c;一个或多个任务发送一个信号量或者消息给另一个任务是比常见的&#xff0c;而一个任务给多个任务发送信号量和消息相对比较少。前面所讲的信号量和消息队列均是单独的内核对象&#xff0c;是独立于任务存在的。这两章要讲述的任务信号量和任务…

域名服务商GoDaddy第四季度扭亏为盈

2月18日消息&#xff0c;据财经网站MarketWatch报道&#xff0c;域名服务提供商GoDaddy周三公布了第四季度财报。公司期内利润与营收均好于预期&#xff0c;给出的营收指导亦符合预测水平。 财报显示&#xff0c;第四季度中GoDaddy营收同比增长14%&#xff0c;为4.254亿美元&am…

devexpress java_DevExpress使用心得一:换肤

最近要用到界面控件DevExpress。一句话&#xff1a;很好很强大&#xff0c;比起VS自带的winform界面&#xff0c;种类和花样要多了不少。然而&#xff0c;强力的功能带来了庞大的信息量&#xff0c;所以我打算通过一些小模块来和大家一起对它进行探讨和研究。今天先研究一下它的…