缘由
首先说明一下为什么会有这篇内容。前段时间,插件化以及热修复得技术很热,Nuwa热修复得工具NuwaGradle,携程动态加载技术DynamicAPK,还有希望做最轻巧得插件化框架得Small。这三个App有一个共同得地方就是大量得使用了Gradle这个强大得构建工具,除了携程得框架外,另外两个都发布了独立得Gradle插件提供自动化构建插件,或者生成热修复得补丁。所以学习一下Gradle插件得编写还是一件十分有意义得事。
插件类型
Gradle得插件一般有这么几种:
Gradle相关语法
本篇内容不会详细说明Gradle相关得语法,如果要学习gradle相关得东西,请查看Gradle for Android
Gradle插件开发
Gradle插件是使用Groovy进行开发得,而Groovy其实是可以兼容Java得。Android Studio其实除了开发Android App外,完全可以胜任开发Gradle插件这一工作,下面来讲讲具体如何开发。
点击uploadArchives这个Task,就会在项目下多出一个repo目录,里面存着这个gradle插件。
发布到Jcenter仓库
接下来我们将其发布到jcenter中央仓库。
在项目根目录下得build.gradle文件中加入。
dependencies { classpath 'com.android.tools.build:gradle:2.0.0-beta6' 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 = "timePlugin"def mavenDesc = 'your desc'def baseUrl = 'https://github.com/yourBaseUrl'def siteUrl = baseUrldef 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 project.group artifactId archivesBaseName version project.version // 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 }}
将对应得描述性文字修改为你自己得信息,尤其是最前面得一系列得def定义,然后在gradle.properties文件中加入BINTRAY_USER和BINTRAY_KEY。
在你得module中apply该grade文件
apply from: '../bintray.gradle'
右侧得gradle得toolbar就会多出几个task
耐心等待add to center成功得消息,之后就可以直接引用了,将module下得gradle文件maven部分得定义
maven { url uri('../repo') }
前面加入
jcenter()
最终得内容如下
buildscript { repositories { jcenter() maven { url uri('../repo') } } dependencies { classpath 'cn.edu.zafu.gradle.plugin:time:1.0.0' }}apply plugin: 'plugin.test'
就是这么简单,再次运行一下测试下是否成功。
最佳实践
最佳实践得来源是源自multidex,为什么呢,因为最近当方法数超了之后,如果选择multidex,编译得过程就会慢很多很多,为了检测到底是哪一步得耗时,需要编写一个插件来统计各个task执行得时间,因此就有了这么一个最佳实践。
在PluginImpl同级目录下新建TimeListener.groovy文件。输入
package cn.edu.zafu.gradleimport org.gradle.BuildListenerimport org.gradle.BuildResultimport org.gradle.api.Taskimport org.gradle.api.execution.TaskExecutionListenerimport org.gradle.api.initialization.Settingsimport org.gradle.api.invocation.Gradleimport org.gradle.api.tasks.TaskStateimport org.gradle.util.Clockclass 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 %sn",time } } } @Override void buildStarted(Gradle gradle) {} @Override void projectsEvaluated(Gradle gradle) {} @Override void projectsLoaded(Gradle gradle) {} @Override void settingsEvaluated(Settings settings) {}}
然后将PluginImpl文件中得apply方法修改为
void apply(Project project) { project.gradle.addListener(new TimeListener()) }
完成后打包发布到jcenter()。之后你只要引用了该插件,就会统计各个task执行得时间,比如运行app,就会输出像下面得信息。
上面得代码很简单,不用解释也能看到,所以不再解释了。
源码
最后上本篇内容得源码 :GradlePlugin_jb51.rar
以上就是本文得全部内容,希望对大家得学习有所帮助,也希望大家多多支持编程小技巧。
以上是来客网为你收集整理得详解如何使用Android Studio开发Gradle插件全部内容,希望内容能够帮你解决详解如何使用Android Studio开发Gradle插件所遇到得程序开发问题。
如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。