- 实现
Gradle中插件可以分为两类:脚本插件和对象插件。
脚本插件: 脚本插件就是一个普通的gradle构建脚本,比如a.gradle 在a.gradle脚本中定义一系列的task。另一个构建脚 本b.gradle通过
apply from:'a.gradle'
即可引用这个脚本插件。
对象插件:是指实现了org.gradle.api.Plugin接口的类,实现Plugin接口的apply(T target)
这个方法。
编写对象插件主要有三种方式:
1.直接在gradle脚本文件中
2.在buildSrc目录下
3.在独立的项目下
推荐一个说的比较简单明白的博客: https://www.jianshu.com/p/5b99e3af4d6b
这个博客的问题是只介绍到 把插件上传到本地仓库。
我们 使用的打点神策的插件 'com.sensorsdata.analytics.android', 上传到了https://dl.bintray.com/zouyuhan/maven的
com.sensorsdata.analytics.android:android-gradle-plugin2:2.0.1路径下。
我们发布到Jcenter仓库
上传一个例子,插件的主要结构
编写 对象插件
package cn.test.gradle
import org.gradle.api.Plugin
import org.gradle.api.Project
public class PluginImpl implements Plugin<Project> {
void apply(Project project) {
project.gradle.addListener(new TimeListener())
}
}
resources/META-INF/gradle-plugins目录下的 yd.test.plugin.properties , 前面的 yd.test.plugin就是我们
apply plugin: 'yd.test.plugin' 的这个部分的名字来源。
build.gradle文件内容全部删除之后添加上
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
group='cn.test.gradle'
version='4.0.0'
使用插件的时候 classpath 'cn.test.gradle:plugintest:4.0.0' 中 n.test.gradle是group ,plugintest是artifactId即module名,4.0.0是版本。
在项目根目录下的build.gradle文件 buildscript 中加入
dependencies {
classpath 'com.android.tools.build:gradle:3.1.4'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
classpath 'com.github.dcendents:android-maven-plugin:1.2'
}
在项目根路径下新建bintray.gradle文件。 添加下面的内容
apply plugin: 'com.jfrog.bintray'
apply plugin: 'maven-publish'
def projectName = "testplugin"
def mavenDesc = 'yangdan desc'
def baseUrl = 'https://github.com/hellocat99'
def siteUrl = baseUrl
def gitUrl = "${baseUrl}/yourGitUrl"
def issueUrl = "${baseUrl}/yourGitIssueUrl"
def licenseIds = ['Apache-2.0']
def licenseNames = ['The Apache Software License, Version 2.0']
def licenseUrls = ['http://www.apache.org/licenses/LICENSE-2.0.txt']
def inception = '2016'
def username = 'lizhangqu'
install {
repositories {
mavenInstaller {
pom.project {
// Description
name projectName
description mavenDesc
url siteUrl
// Archive
groupId 'cn.test.gradle'
artifactId 'plugintest'
version '3.0.0'
// License
inceptionYear inception
licenses {
licenseNames.eachWithIndex { ln, li ->
license {
name ln
url licenseUrls[li]
}
}
}
developers {
developer {
name username
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
task sourcesJar(type: Jar) {
from sourceSets.main.allGroovy
classifier = 'sources'
}
task javadocJar(type: Jar, dependsOn: groovydoc) {
from groovydoc.destinationDir
classifier = 'javadoc'
}
artifacts {
archives javadocJar
archives sourcesJar
}
bintray {
user = BINTRAY_USER
key = BINTRAY_KEY
configurations = ['archives']
pkg {
repo = 'maven'
name = projectName
desc = mavenDesc
websiteUrl = siteUrl
issueTrackerUrl = issueUrl
vcsUrl = gitUrl
labels = ['gradle', 'plugin', 'time']
licenses = licenseIds
publish = true
publicDownloadNumbers = true
}
}
在gradle.properties文件中加入BINTRAY_USER和BINTRAY_KEY。
BINTRAY_USER是 jcenter的账户名
BINTRAY_KEY 是jcenter的API Key
在插件的build.gradle文件中apply该grade文件:
apply from: '../bintray.gradle'
右侧的gradle的toolbar 先运行other下的install这个task,再执行bintrayUpload这个task,如果不出意外,就上传了,之后不要忘记到后台add to jcenter。成功add到jcenter之后就会有link to jcenter的字样
我们希望的是打印构建过程中各task执行的时间
package cn.test.gradle
import org.gradle.BuildListener
import org.gradle.BuildResult
import org.gradle.api.Task
import org.gradle.api.execution.TaskExecutionListener
import org.gradle.api.initialization.Settings
import org.gradle.api.invocation.Gradle
import org.gradle.api.tasks.TaskState
import org.gradle.util.Clock
import java.util.Date
class TimeListener implements TaskExecutionListener, BuildListener {
private Clock clock
private times = []
@Override
void beforeExecute(Task task) {
clock = new Clock(new Date().getTime())
}
@Override
void afterExecute(Task task, TaskState taskState) {
long endTime = new Date().getTime()
def ms = endTime - clock.getStartTime()
times.add([ms, task.path])
task.project.logger.warn "${task.path} spend ${ms} ms"
}
@Override
void buildFinished(BuildResult result) {
println "Task spend time:"
for (time in times) {
if (time[0] >= 50) {
printf "%7sms %s\n", time
}
}
}
@Override
void buildStarted(Gradle gradle) {}
@Override
void projectsEvaluated(Gradle gradle) {}
@Override
void projectsLoaded(Gradle gradle) {}
@Override
void settingsEvaluated(Settings settings) {}
}