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 ...
随机推荐
- 性能测试一:jmeter基础入门
JMeter,一个100%的纯Java桌面应用,由Apache组织的开放源代码项目,它是功能和性能测试的工具.具有高可扩展性.支持Web(HTTP/HTTPS).SOAP.FTP.JAVA等多种协议的 ...
- python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)
先来讲一个例子 老师有生日,怎么组合呢? class Birthday: # 生日 def __init__(self,year,month,day): self.year = year self.m ...
- Windows任务计划 & Linux crontab定时自动任务
如何在windows服务器上面创建定时任务https://blog.csdn.net/shiyong1949/article/details/52779359 Windows 10系统下如何设置计划任 ...
- python访问百度地图接口并返回信息
import urllib.parse import urllib.request data = urllib.parse.urlencode({'address': '广东省湛江市霞山区', 'ou ...
- python全栈开发day38-css三种引入方式、基础选择器、高级选择器、补充选择器
一.昨日内容回顾 div:分割整个网站,很多块 (1)排版标签 (2)块级标签 独占一行 可以设置高和宽,如果不设置宽高,默认是父盒子的宽 span: (1) 小区域 (2)文本标签 (3)在一行内显 ...
- mysql explain优化
简介 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化.EXPLAIN 命令用法十分简单, 在 S ...
- 练习题|MySQL
MySQL主要内容: 1.数据库介绍.类型.特性2.MySQL数据库安装.连接.启动.停止3.表字段类型介绍.主键约束.表创建语句4.常用增删改查语句.分组.聚合5.外键管理.unique字段.表结构 ...
- 洛谷 P4779 【dijkstra】+(堆优化)+(链式前向星) (模板题)
<题目链接> 题目描述 给定一个 N 个点, M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入格式: 第一行为三个正整数 N,M, ...
- python的time模块总结
python的time模块与random模块 目录 time模块 time模块 三种时间表示 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp) : 通常来说,时间戳表示的是 ...
- Quartz配置
1. Quartz主要配置 属性名称 是否必选 类型 默认值 说明 org.quartz.scheduler.instanceName 否 String QuartzScheduler Schedul ...