AS 自定义 Gradle plugin 插件 案例 MD
Markdown版本笔记 | 我的GitHub首页 | 我的博客 | 我的微信 | 我的邮箱 |
---|---|---|---|---|
MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
AS 自定义 Gradle plugin 插件 案例 MD
目录
AS 中自定义 Gradle plugin
结合 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.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class CookerPlugin implements Plugin<Project> {
@Override
void 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 {
@TaskAction
void 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.0
repository(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-task
和customTask
, 我们可以通过两种方式运行这两个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
AS 自定义 Gradle plugin 插件 案例 MD的更多相关文章
- java基础---->自定义gradle的插件
这里面简单的介绍一下gradle插件的编写. 自定义gradle插件 我们编写的gradle脚本一般是放在build.gradle文件中.所以首先创建一下build.gradle文件,下面的例子都是在 ...
- 自定义gradle plugin
最近开始接触gradle 正好有个需求apidoc
- 通过Gradle Plugin实现Git Hooks检测机制
背景 项目组多人协作进行项目开发时,经常遇到如下情况:如Git Commit信息混乱,又如提交者信息用了自己非公司的私人邮箱等等.因此,有必要在Git操作过程中的适当时间点上,进行必要的如统一规范.安 ...
- AS Gradle构建工具与Android plugin插件【大全】
Android plugin version 与 gradle version 的关系 Gradle是一种构建工具,它通过编写一个名为build.gradle的脚本文件对项目进行设置,再根据这个脚本对 ...
- Gradle的构建过程都不会?带你全面了解Android如何自定义Gradle 插件
目前 Android 工程的默认构建工具为 Gradle,我们在构建 APK 的时候往往会执行 ./gradlew assembleDebug 这样的命令.. 那么这个命令到底代表着什么含义呢?命令的 ...
- 手把手带你自定义 Gradle 插件 —— Gradle 系列(2)
请点赞加关注,你的支持对我非常重要,满足下我的虚荣心. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友 ...
- Gradle Groovy 基础语法 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 服务 AIDL 定向tag IPC Parcelable 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- gradle ssh 插件
org.hidetake.ssh Gradle SSH Plugin is a Gradle plugin which provides remote command execution and fi ...
随机推荐
- python for dl
算是python的简明教程吧,总结的不错: https://zhuanlan.zhihu.com/p/24162430 python for opencv: https://zhuanlan.zhih ...
- 双倍浮向(双倍边距)(只有IE6出现)
声明: web前端学习笔记,欢迎大神指点.联系QQ:1522025433. 描述:在IE6中,一个居左(或居右)浮动的元素放置进一个容器盒(box),并在浮动元素上使用了左边距(或右边距) 在ie6内 ...
- 网页异步加载之AJAX理解
AJAX AJAX介绍 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页的技术 AJAX ...
- JavaScriptDom操作与高级应用(八)
一:Dom操作基础与高级应用 Node接口也定义了一些所有节点类型都包含的属性和方法.
- Linux下安装JDK7和TomCat7
[BEGIN] 2016/9/9 14:20:49[root@rzhd jdk]# ll总用量 149916-rw-r--r-- 1 root root 153512879 9月 9 14:20 jd ...
- BZOJ3377 [Usaco2004 Open]The Cow Lineup 奶牛序列 其他
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3377 题意概括 给出一个序列,序列中的数字为1~k中的. 让你求最短的非子序列长度. 题解 我们把 ...
- python开发环境PyCharm安转注册
0x1 ,安装 0x2 , 调整时间到2038年. 0x3 ,申请30天试用 0x4, 退出pycharm 0x5, 时间调整回来. ##注册方法2### 注册方法:在注册时选择 License se ...
- UVA 10976 分数拆分【暴力】
题目链接:https://vjudge.net/contest/210334#problem/C 题目大意: It is easy to see that for every fraction in ...
- LSTM(长短期记忆网络)及其tensorflow代码应用
本文主要包括: 一.什么是LSTM 二.LSTM的曲线拟合 三.LSTM的分类问题 四.为什么LSTM有助于消除梯度消失 一.什么是LSTM Long Short Term 网络即为LSTM,是一种 ...
- [POI2011]Śmieci
[POI2011]Śmieci 题目大意: 一个\(n(n\le10^5)\)个点\(m(m\le10^6)\)条边的无向图,每条边有边权\(0/1\),试找出若干个环,使得每次翻转环上所有边的权值, ...