一、插件分类
脚本插件
新建一个目录 Demo,然后在 Demo 下创建一个名为 version.gradle 的脚本文件,打开编辑该脚本文件,输入如下内容:
ext {
versionCode = 1
versionName = "1.0.0"
}
复制代码
同样地,在 Demo 下创建一个名为 build.gradle 的脚本文件,打开编辑该脚本文件,输入如下内容:
//应用version.gradle脚本文件
apply from: "version.gradle"
task("myTask") {
doLast {
println "versionCode === ${versionCode},versionName === ${versionName}"
}
}
复制代码
严格来说,它不算是一个插件,只是一个脚本
二进制插件
所谓二进制插件,就是一个实现了 org.gradle.api.Plugin 接口的插件。它有一个唯一的、容易记的短名 plugin id,在编写插件时,可以指定一个 plugin id,这样就可以通过 plugin id 来应用插件了。
Gradle 自带的核心插件
Gradle 自带了不少核心插件,而 Java 插件就是其中一个了,有多种方式应用 Java 插件
//方式一:通过plugin id来应用插件,原型为void apply(Map<String, ?> options)
apply plugin: "java"
//方式二:通过类名全路径来应用插件,原型为void apply(Map<String, ?> options)
apply plugin: org.gradle.api.plugins.JavaPlugin
//方式三:通过闭包来应用插件,原型为void apply(Closure closure)
apply {
plugin 'java'
}
//方式四:通过Action来应用插件,原型为void apply(Action<? super ObjectConfigurationAction> action)
apply(new Action<ObjectConfigurationAction>() {
@Override
void execute(ObjectConfigurationAction objectConfigurationAction) {
objectConfigurationAction.plugin("java")
}
})
//方式五:通过plugins DSL应用插件
plugins {
id 'java'
}
复制代码
第三方插件
第三方发布的 jar 插件,在应用插件的时候,必须先在 buildscript 中配置 classpath ,否则会提示找不到插件。举个例子,我们新建一个 Android 项目时,Android Studio 都会默认应用了 Android Gradle 插件,那我们拆分下步骤看它是怎么默认应用的。
步骤一、在 build.gradle(project 模块)添加仓库 google(),接着在 buildscript 中配置 classpath,classpath 格式为 group:artifactId:version
buildscript {
repositories {
google()
jcenter()
}
dependencies {
//group:com.android.tools.build
//artifactId:gradle
//version:4.1.3
classpath "com.android.tools.build:gradle:4.1.3"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
复制代码
步骤二、在 build.gradle(app 模块)中应用插件
plugins {
id 'com.android.application'
}
复制代码
二、自定义插件
Build script 方式
在构建脚本里直接写插件的源代码,这种方式写的插件在构建脚本之外是不能重用的。比如说我在 build.gradle(app 模块)编写插件源代码
//应用插件
apply plugin: MyFirstPlugin
//定义一个插件
class MyFirstPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task("myTask") {
doLast {
println "MyFirstPlugin->myTask"
}
}
}
}
task TestTask{
dependsOn("myTask")
}
复制代码
执行 gradle -q TestTask 命令,输出日志
MyFirstPlugin->myTask
复制代码
buildSrc project 方式
把插件的源代码放在 rootProjectDir/buildSrc/src/main/java 目录下(或者 rootProjectDir/buildSrc/src/main/groovy 、 rootProjectDir/buildSrc/src/main/kotlin ,这取决于你喜欢哪种语言),这种方式的插件可在多个模块之间复用
步骤一、新建一个项目,项目名称为 MyFirstPlugin,接着创建一个 Java Library(创建哪种 Library 都无所谓,因为会大改),名称必须为 buildSrc,插件源码就是放在这个 buildSrc 里,然后删除 src/main 下的所有内容

在创建名称为 buildSrc 的 Library 时,会出现编译报错
'buildSrc' cannot be used as a project name as it is a reserved name
复制代码
解决办法是 setting.gradle 中不引用 buildSrc
rootProject.name = "MyFirstPlugin"
include ':app'
//include ':buildSrc'
复制代码
步骤二、打开编辑 buildSrc 模块下的 build.gradle,输入如下内容
apply plugin: 'groovy'
dependencies {
implementation gradleApi()
implementation localGroovy()
}
复制代码
步骤三、创建 src/main/groovy/(包名)/xxx.groovy 这样一个目录及文件 ,这里我的包名是 com.example.plugin,文件名是 MyFirstPlugin.groovy

接着在 MyFirstPlugin.groovy 中编入如下代码
class MyFirstPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task("myTask") {
doLast {
println "MyFirstPlugin->myTask"
}
}
}
}
复制代码
步骤四、指定一个 plugin id,创建 src/main/resources/META-INF/gradle-plugins/xxx.properties 这样一个目录及文件,这里的 xxx 其实就是所映射的 plugin id,我这里是 my-first-plugin.properties

接着在 my-plugin.properties 中编入如下代码
implementation-class=com.example.plugin.MyFirstPlugin
复制代码
其中 key 为 implementation-class 固定不变,value 为自定义插件的类名全路径
步骤六、在 build.gradle(app 模块)中应用插件
apply plugin: "my-first-plugin"
task TestTask{
dependsOn("myTask")
}
复制代码
执行 gradle -q TestTask 命令,输出日志
MyFirstPlugin->myTask
复制代码
Standalone project 方式
要想在项目之间复用插件,就需要在一个单独的工程中编写插件,将编译后的 jar 包上传 maven 仓库。
这种方式在代码上与 buildSrc project 方式几乎一样的,比较小的区别是,buildSrc project 方式 Library 名称必须为 buildSrc,而 Standalone project 方式 Library 名称可随意,除此之外,Standalone project 方式多了一个发布部分。
新建一个项目,项目名称为 MySecondPlugin,接着创建一个 Java Library,名称为 Lib_Plugin,插件源码就是放在这个 Lib_Plugin 里,之前在 buildSrc Project 方式中讲过了,这里直接一步到位。

将插件发布到 maven 本地仓库
基于默认的本地仓库路径
基于 buildSrc Project 方式,在 Lib_Plugin 模块下的 build.gradle 继续添加发布代码
//应用maven发布插件
apply plugin: 'maven-publish'
//插件包名
group = 'com.example.plugin'
//插件版本
version = '1.0.0'
publishing {
publications {
//mavenJava名称可随意
mavenJava(MavenPublication) {
//插件名称
artifactId = 'MySecondPlugin'
//发布jar包
from components.java
}
}
}
复制代码
点击 sync 同步后,找到 Gradle 面板,可看到 publishing 下有这几个任务

解释下
| 任务 | 说明 |
|---|---|
| generatePomFileForPubNamePublication | 为名为PubName的发布创建一个POM文件,填充已知的元数据,如项目名称、项目版本和依赖项,POM文件的默认位置是build/publications/$pubName/POM-default.xml |
| publishPubNamePublicationToRepoNameRepository | 将PubName发布发布到名为RepoName的存储库中,如果你的存储库定义没有明确的名称,那么RepoName将是“Maven” |
| publishPubNamePublicationToMavenLocal | 复制PubName发布到本地Maven缓存,通常是$USER_HOME/.m2/repository,以及发布的POM文件和其他元数据 |
| publish | 依赖所有publishPubNamePublicationToRepoNameRepository任务,将所有已定义的发布发布到所有已定义存储库的聚合任务,它不包括将发布复制到本地Maven缓存 |
| publishToMavenLocal | 依赖所有publishPubNamePublicationToMavenLocal任务,将所有已定义的发布复制到本地Maven缓存,包括它们的元数据(POM文件等) |
要想发布到默认的本地仓库路径,点击执行 publishToMavenLocal 任务即可,待任务执行完毕后,在 $USER_HOME/.m2/repository 目录下已生成插件。
在 project 模块下的 build.gradle 添加如下代码应用插件
buildscript {
repositories {
google()
jcenter()
//添加本地仓库
mavenLocal()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.3"
//添加classpath
classpath "com.example.plugin:MySecondPlugin:1.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
复制代码
在 app 模块下的 build.gradle 应用插件
apply plugin: "my-second-plugin"
task TestTask{
dependsOn("myTask")
}
复制代码
执行 gradle -q TestTask 命令,输出日志
MySecondPlugin->myTask
复制代码
基于自定义的本地仓库路径
基于 buildSrc Project 方式,在 Lib_Plugin 模块下的 build.gradle 继续添加发布代码
//应用maven发布插件
apply plugin: 'maven-publish'
//插件包名
group = 'com.example.plugin'
//插件版本
version = '1.0.0'
publishing {
publications {
//mavenJava名称可随意
mavenJava(MavenPublication) {
//插件名称
artifactId = 'MySecondPlugin'
//发布jar包
from components.java
}
}
//自定义本地仓库地址
repositories {
maven {
url = 'D:\\Maven\\repository'
}
}
}
复制代码
要想发布到自定义的本地仓库路径,点击执行 publish 任务即可,待任务执行完毕后,在 D:\Maven\repository 目录下已生成插件。
在 project 模块下的 build.gradle 添加如下代码应用插件
buildscript {
repositories {
google()
mavenCentral()
//添加本地仓库
maven {
url = "D:\\Maven\\repository"
}
}
dependencies {
classpath "com.android.tools.build:gradle:4.2.1"
//添加classpath
classpath "com.example.plugin:MySecondPlugin:1.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
复制代码
在 app 模块下的 build.gradle 应用插件
apply plugin: "my-second-plugin"
task TestTask{
dependsOn("myTask")
}
复制代码
执行 gradle -q TestTask 命令,输出日志
MySecondPlugin->myTask
复制代码
发布到远程 maven 私服仓库
基于 buildSrc Project 方式,在 Lib_Plugin 模块下的 build.gradle 继续添加发布代码
//应用maven发布插件
apply plugin: 'maven-publish'
//插件包名
group = 'com.example.plugin'
//插件版本
version = '1.0.0'
publishing {
publications {
//mavenJava名称可随意
mavenJava(MavenPublication) {
//插件名称
artifactId = 'MySecondPlugin'
//发布jar包
from components.java
}
}
//远程仓库地址、访问账号
repositories {
maven {
url = "http://localhost:8081/repository/maven-releases/"
credentials {
username "admin"
password "123456"
}
}
}
}
复制代码
要想发布到远程 maven 私服仓库,点击执行 publish 任务即可,待任务执行完毕后,在远程私服仓库目录下已生成插件。
在 project 模块下的 build.gradle 添加如下代码应用插件
buildscript {
repositories {
google()
mavenCentral()
//添加远程仓库
maven {
url = "http://localhost:8081/repository/maven-releases/"
}
}
dependencies {
classpath "com.android.tools.build:gradle:4.2.1"
//添加classpath
classpath "com.example.plugin:MySecondPlugin:1.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
复制代码
在 app 模块下的 build.gradle 应用插件
apply plugin: "my-second-plugin"
task TestTask{
dependsOn("myTask")
}
复制代码
执行 gradle -q TestTask 命令,输出日志
MyFirstPlugin->myTask
复制代码



















![[02/27][官改] Simplicity@MIX2 ROM更新-一一网](https://www.proyy.com/wp-content/uploads/2020/02/3168457341.jpg)



![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)