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,一经查实,立即删除!

相关文章

学好Java的10个建议

1.克服惯性  将大块任务细分为微任务。  2.关注大牛  你想学的或许是一门新的编程语言、应用框架或者是新的工具&#xff0c;一旦你确定了想要的是什么&#xff0c;就立刻去收集相应的优秀群体所做的一些优质的工作成果。这些可以从YouTube、Vimeo、HackerNews、各种博客…

中英文对照 —— 机械

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

电子邮件链接mailto_“ 3个链接”电子邮件的历史记录以及曾经发送的每个链接的存档...

电子邮件链接mailtoby Quincy Larson昆西拉尔森(Quincy Larson) “ 3个链接”电子邮件的历史记录以及曾经发送的每个链接的存档 (The history of the “3 links” email and an archive of every link ever sent) It was March 2016. The freeCodeCamp community was growing.…

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

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

2015国内征信机构大数据整合能力对比

自2001年起&#xff0c;大陆地区现代企业征信业进入在竞争中发展的阶段&#xff0c;信用问题开始得到社会各界的广泛关注&#xff0c;许多政府和民间投资的企业征信机构携带大量资本如雨后春笋般出现。 随着企业征信行业环境不断改善&#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…

express-cli入门_使用Express.js入门

express-cli入门by Victor Ofoegbu由Victor Ofoegbu 使用Express.js入门 (Getting off the ground with Express.js) 使用Node.js框架编写Web应用 (Writing web apps with the Node.js framework) A common moment of truth is when you develop a lot of applications that n…

《疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践》学习笔记

《疯狂前端开发讲义jQueryAngularBootstrap前端开发实践》学习笔记 二〇一九年二月十三日星期三2时28分54秒 前提&#xff1a;本书适合有初步HTML、CSS、JavaScript基础的读者&#xff0c;或对企业应用前端开发不太熟悉的开发人员。 第1章&#xff1a;前端开发与Ajax技术 要点&…

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

在可预见的未来&#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…

详解华为与三星专利之争 律师称可能会打持久战

华为技术有限公司(下称“华为”)起诉三星&#xff0c;在近期中国企业起诉外企的“潮流”中掀起不小的漩涡。 “叫好声”认为&#xff0c;这是已经拥有专利积累的中国企业在国际舞台上的一次“实力亮相”&#xff0c;这件事本身就是中国制造业的胜利&#xff1b;“阴谋论者”认为…

租金 预测_如何预测租金并优化租赁期限,从而节省资金

租金 预测by Zhen Liu刘震 如何预测租金并优化租赁期限&#xff0c;从而节省资金 (How to Predict Rent and Optimize Your Lease Duration So You Can Save Money) In my last post, we talked about how to pick the best month to sign the lease based on seasonality. No…

java system load_关于java的System.load 和 System.loadLibrary

关于两者的区别(参见http://blog.csdn.net/ring0hx/article/details/3242245)System.load 参数为库文件的绝对路径&#xff0c;可以是任意路径。System.loadLibrary方法load的为相对路径&#xff0c;即在java.library.path定义下的lib文件&#xff0c;文件名会更具不同的系统实…

东进技术南亚创捷

深圳市东进技术在其海外市场拓展中取得又一骄人战绩&#xff0c;于四月下旬与印度One97通信公司签订了长期战略合作协议&#xff0c;One97将全面采用东进的全系列产品。同时签订的一期采购计划&#xff0c;总装机端口数约3万线。该合约主要涉及东进技术的领先主打产品——Keygo…

如何在5分钟内通过身份验证构建RESTful API —全部从命令行(第1部分)

by Niharika Singh由Niharika Singh 如何在5分钟内通过身份验证构建RESTful API —全部从命令行(第1部分) (How to Build a RESTful API with Authentication in 5 minutes — all from your command line (Part 1)) If the title of this article excites you, then my frien…

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…