Gradle是一个强大的构建工具,能够给我们的项目带来极大的方便。Gradle插件是用groovy语言编写,而groovy完美兼容java代码,因此对于写java的童鞋来说,只需要很低的学习成本。接下来描述下,如何构建一个自定义的Gradle插件~
项目地址:https://github.com/xyzlf/CustomPlugin
自定义Gradle插件及使用
1、基本准备
1、首先,新建一个Android项目。
2、之后,新建一个Android Module项目,类型选择Android Library。
3、在新建的module中新建文件夹src,接着在src文件目录下新建main文件夹,在main目录下新建groovy目录,resources目录。在groovy目录下面新建包名,增加代码。resources目录下新建文件夹META-INF,META-INF文件夹下新建gradle-plugins文件夹。
这样,就完成了gradle 插件的项目的整体搭建,之后就是小细节了。目前,项目的结构是这样的。
结构如图:
2、修改Module下面的build.gradle(修改上图pluginlib下面的build.gradle)
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
group='com.xyzlf.plugin'
version='1.0.0'
uploadArchives {
//使用当前目录下面的maven仓库,仓库在当前目录的repo文件目录中
repositories {
mavenDeployer {
repository(url: uri('../repo'))
}
}
}
3、增加自定义插件groovy代码
(1)在groovy目录下,新建包名,如:com.xyzlf.pluginlib。
(2)增加插件代码PluginImpl.groovy及TimeListener.groovy
PluginImpl.groovy
package com.xyzlf.pluginlib
import org.gradle.api.Plugin
import org.gradle.api.Project
public class PluginImpl implements Plugin<Project> {
void apply(Project project) {
// project.task('testTask') << {
// println "Hello gradle plugin"
// }
project.gradle.addListener(new TimeListener())
}
}
TimeListener.groovy
package com.xyzlf.pluginlib
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
class TimeListener implements TaskExecutionListener, BuildListener {
private Clock clock
private times = []
@Override
void beforeExecute(Task task) {
clock = new org.gradle.util.Clock()
}
@Override
void afterExecute(Task task, TaskState taskState) {
def ms = clock.timeInMs
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) {}
}
(3)在resources/META-INF/gradle-plugins/目录下新建一个文件:xyzlf.plugin.time.properties.
注意: xyzlf.plugin.time就是应用的插件名, 如使用的地方引用:apply plugin: 'xyzlf.plugin.time'
内容如下:
implementation-class=com.xyzlf.pluginlib.PluginImpl
将Gradle插件发布到本地仓库
1、填写完上面的插件代码,接下来就是发不到本地仓库了。
2、在项目的根目录下面执行:Windows下执行: gradlew uploadArchives(), Mac下执行: ./gradlew uploadArchives
3、这样,在项目根目录会生成repo文件夹,里面即有我们的插件jar包。
4、使用本地的自定义插件,在项目的 app/build.gradle文件中,引用自定义插件。
buildscript {
repositories {
//使用当前目录下面的maven仓库,仓库在当前目录的repo文件目录中
maven {
url uri('../repo')
}
}
dependencies {
classpath 'com.xyzlf.plugin:time:0.0.1'
}
}
apply plugin: 'xyzlf.plugin.time'
5、在项目根目录执行:gradlew clean build 就会出现task的耗时统计。
将Gradle插件上传到jcenter
1、具体步骤其实也简单。
(1)在项目的根目录下面加入上传到jcenter的插件依赖库: CustomPlugin/build.gradle。
classpath 'com.novoda:bintray-release:0.3.4' // 上传自定义插件到jcenter仓库的依赖库
(2)在module目录下增加如下内容:
apply plugin: 'com.novoda.bintray-release'//添加上传到jcenter仓库用到的插件
//------------------------------ 以下是上传到jcenter仓库的代码 ------------------------------//
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
String localBintrayUser = properties.getProperty("bintray.user")
String localBintrayApikey = properties.getProperty("bintray.apikey")
//推送指令
//gradlew clean build bintrayUpload
//添加
publish {
bintrayUser = localBintrayUser //bintray.com用户名
bintrayKey = localBintrayApikey //bintray.com apikey
dryRun = false
userOrg = localBintrayUser
groupId = 'com.'+ localBintrayUser +'.plugin'//jcenter上的路径
artifactId = 'time'//项目名称
publishVersion = '0.0.1'//版本号
desc = '统计gradle task耗时的插件' // 增加你的插件描述
website = 'https://github.com/xyzlf/CustomPlugin' // 修改你的项目地址
}
(3)在根目录的local.properties配置你的bintray.user名,及bintray.apikey值。
bintray.apikey=你的bintray.apikey值
bintray.user=你的bintray.user名称
(4)配置完,在项目根目录下面,执行命令行:
gradlew clean build bintrayUpload
不出意外,应该就上传到jcenter中心了,然后你去 http://bintray.com/ 中增加到jcenter,审核通过后,就能使用了。
(5)使用jcenter依赖:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.xyzlf.plugin:time:0.0.1'
}
}
apply plugin: 'xyzlf.plugin.time'
2、如果对于上传到jcenter有不懂的,也可以参照此文:Android Studio aar上传到jcenter
参考资料
1、如何使用Android Studio开发Gradle插件
3、(1) 自定义Gradle插件(一) (2) 自定义Gradle插件(二)