在build.gradle中直接实现插件
- 创建使用插件功能的groovy 类,在app层的build.gradle 中
class GreetingPluginExtension {
//插件类中的属性
String message = "Hello"
}
- 实现 org.gradle.api.Plugin 接口,在重新的apply() 方法中调用插件类
class GreetingPlugin implements Plugin<Project> {
@Override
void apply(Project target) {
//生成插件类的对象,greeting 是插件类的别名,编译完成后可以用来使用闭包的形式修改插件类中的属性
def extension = target.extensions.create("greeting", GreetingPluginExtension)
target.task("hello") {//生产名为hello的任务,可以在命令行中使用 gradle hello 运行该任务
doLast {
println(extension.message)
}
}
}
}
- 在build.gradle中引入自定义的插件
apply plugin: GreetingPlugin
- 在Terminal中打开build.gradle 文件,运行 “ gradle hello ”,或者在Sync完成后在AS的Gradle列表中运行,如下图
- 在build.gradle中使用插件的别名修改插件类中的属性,就像build.gradle默认生产的如下的代码一样,也可以使用相同的方式修改自定义插件中的属性,如下
defaultConfig {
applicationId "com.plugin.ggg.myapplication"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
}
apply plugin: GreetingPlugin //首先要先引入插件
//修改插件类中的属性,再次运行hello ,便可以输出修改后的值
greeting{
message="1111"
}
如果运行 gradle hello 提示 gradle 不是内部命令时,请将AndroidStudio 安装目录下的 gradle/gradle-5.1.1(这个5.1.1是gradle的版本号)/bin 加入到环境变量的path中,重启一下电脑即可
独立于项目的插件
- 在项目中新建 Android Library Module
- 将src/main 中的文件都删除,将 module中的build.gradle 的内容都删除
- 在 module中的build.gradle 中加入以下代码,并 sync
apply plugin: 'groovy'//引入 groovy支持的插件
apply plugin: 'maven' //引入maven支持的插件
dependencies {
//引入 groovy支持的插件
compile gradleApi()
compile localGroovy()
}
//使用maven仓库
repositories {
mavenCentral()
}
//定义插件的在本地maven中的id
group = 'test.plugins'
//定义插件的在本地maven中的版本号
version = '1.0.0'
//将插件打包上传到本地maven
uploadArchives {
repositories {
mavenDeployer {
//指定本地maven的路径
repository(url: uri('./repos'))
}
}
}
-
在src/main 中新建groovy的文件夹,在里面新建.groovy文件,在src/main中新建 resources文件夹,在里面新建 META-INF 文件夹,在META-INF中新建 gradle-plugins 文件夹,这俩个文件夹的名称是固定的,然后在gradle-plugins中创建xxx.properties 文件,xxx可以自定义,这个将会作为插件在本地maven中group的值。目录结构如下图
-
插件类的实现如下代码
package gradle
import org.gradle.api.Plugin
import org.gradle.api.Project
//实现Plugin接口,重写apply 方法
class PluginImpl implements Plugin<Project> {
@Override
void apply(Project target) {
//在这里实现插件功能
System.out.println("========================")
System.out.println("hello gradle plugin!")
System.out.println("========================")
}
}
- xxx.properties 文件中内容如下
# 指定插件类的入口 ,包名.类名
implementation-class=gradle.PluginImpl
-
sync now 完之后 在命令行中打开 module中的 build.gradle 文件 输入“gradle uploadArchives” 命令 将插件发布到本地maven,或在AS中的Gradle 中发布,如下图
-
发布完之后在本地maven中会生产相应的仓库,"./repos" 指定的本地maven地址在module中的下一级文件夹中,所以maven生产的repos仓库如下图
-
maven-metadata.xml 中的内容如下
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<!--插件在project 下面的build.gradle引入时的形式为[groupId]:[artifactId]:[version]-->
<groupId>test.plugins</groupId>
<artifactId>plugin</artifactId>
<versioning>
<release>1.0.0</release>
<versions>
<version>1.0.0</version>
</versions>
<lastUpdated>20190803052405</lastUpdated>
</versioning>
</metadata>
- 在项目中使用该插件,在project 的 build.gradle中引入本地maven的地址,代码如下
buildscript {
ext.kotlin_version = '1.3.31'
repositories {//声明了工程所需要的依赖库,供下面dependencies下载
google()
jcenter()
maven {
url uri("./plugin/repos") //本地maven中插件的地址
}
}
dependencies {//声明了具体的依赖,使用[group]:[name]:[version]形式
classpath 'com.android.tools.build:gradle:3.4.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
//引入插件的依赖
classpath 'test.plugins:plugin:1.0.0'
}
}
- 在需要使用插件的module中引入插件
apply plugin: 'test.plugins'
修改插件代码后需要重新build并重新发布到本地的maven