自定义gradle插件
1.1二进制插件
二进制插件就是实现了org.gradle.api.Plugin接口的插件,它们可以有plugin id,二进制插件一般都是被打包在一个jar里独立发布的,比如我们自定义的插件,在发布的时候我们也可以为其制定plugin id,这个plugin id最好是一个全限定名称,就像你的包名一样,这样发布的插件plugin id就不会重复了。
1.2脚本插件
build.gradle文件
apply from: 'version.gradle'
task ex << {
println "app版本:" + versionName + ",版本号是:" + versionCode
}version.gradle文件
ext {
versionName = '1.1'
versionCode = 1
}其实这不能算一个插件,它只是一个脚本。应用脚本插件其实就是把这个脚本加载进来,和二进制插件不同的是它使用的是from关键字,后面紧跟的是一个脚本文件,可以是本地的,也可以是网络的,如果是网络上的话要使用HTTP URL。
Gradle插件是使用Groovy进行开发的,而Groovy其实是可以兼容Java的。Android Studio其实除了开发Android App外,完全可以胜任开发Gradle插件这一工作,下面来讲讲具体如何开发。
1.首先,新建一个Android项目,新建一个Android Module项目,类型选择Android Library。
2.将新建的Module中除了build.gradle文件外的其余文件全都删除,然后删除build.gradle文件中的所有内容。
打开Module下的build.gradle文件,输入
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}3.在新建的module中新建文件夹,src/main/groovy目录,这时候groovy文件夹会被Android识别为groovy源码目录。除了在main目录下新建groovy目录外,你还要在main目录下新建resources目录,同理resources目录会被自动识别为资源文件夹。在groovy目录下新建项目包名,就像Java包名那样。resources目录下新建文件夹META-INF,META-INF文件夹下新建gradle-plugins文件夹。META-INF和gradle-plugins必须是父子目录。这样,就完成了gradle 插件的项目的整体搭建。目前,项目的结构是这样的。
1.png
下面我们在包名下新建一个文件,命名为CustomPlugin.groovy
package com.pl.plugin
import org.gradle.api.DefaultTask
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.TaskAction
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.tasks.create('writeFile', CustomPluinTask) {
def greeting = project.extensions.create('greeting', ParamsExtension);//使用类型向插件传递参数
destination {
project.greetingFile
}
doFirst {
String args = project.args;//通过ext直接传递参数
message = args + " " + greeting.message
println "doFirst greeting.message:" + greeting.message
}
doLast {
println(project.file(destination).text)
}
}
}
}
class ParamsExtension {
String message = "pl init"
}
class CustomPluinTask extends DefaultTask {
def destination
String message = "pl test"
File getDestination() {
//创建路径为destination的file
project.file(destination);
}
@TaskAction
def greet() {
def file = getDestination();
file.parentFile.mkdirs();
//向文件中写文本
file.write(message);
}
}然后在resources/META-INF/gradle-plugins目录下新建一个properties文件,注意该文件的命名就是你只有使用插件的名字,这里命名为gradlePlugin.properties,在里面输入
implementation-class=com.pl.plugin.CustomPlugin
注意:包名需要替换为你自己的包名,这样就完成gradle插件的开发工作,下面简单讲解一下,插件所做的整改,插件里面定义了一个名为writeFile的task,task将指定的message信息写入到,由destination指定路径的文件中。
3.发布到本地仓库中
接着,我们需要将插件发布到本地仓库就好了,在module项目下的buidl.gradle文件中加入发布的代码。
uploadArchives {
repositories {
mavenDeployer {
//设置插件的GAV参数
pom.groupId = 'com.pl.plugin'
pom.artifactId = 'gradlePlugin'
pom.version = '1.0.0'
//文件发布到下面目录
repository(url: uri('../repo'))
}
}
}上面的group和version的定义会被使用,作为maven库的坐标的一部分,group会被作为坐标的groupId,version会被作为坐标的version,而坐标的artifactId被用作插件的模块名称。后面定位引用插件时,将会用到上面设置的值。然后maven本地仓库的目录就是当前项目目录下的repo目录。
2.png
点击uploadArchives这个Task,就会在项目下多出一个repo目录,里面存着这个gradle插件。
3.png
发布到本地maven仓库后,我们就使用它,接下来我们在项目根目录的build.gradle文件中加入如下代码
apply plugin: 'gradlePlugin'
ext.args = "hello"
greeting {
message = 'test success'
}
ext.greetingFile = "$buildDir/hello.txt"
buildscript {
repositories {
maven {
url = uri("$rootDir/repo")
}
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0'
classpath 'com.pl.plugin:gradlePlugin:1.0.0'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
} 注意:apply plugin后面引号内的名字就是前文gradlePlugin.properties文件的文件名,而class path后面引号里的内容,就是上面grade中定义的group,version以及moduleName所共同决定的,和maven是一样的。
4.png