gradle插件的开发方式 就目前知道有二种html
1.直接在gradle文件内用groovy写,并直接引用java
2.建立buildSrc目录单独编译再引用android
实现原理上同样的,可是第二种更易于管理与发布,因此本文便以第二种方式来实践 文末为会附上第一种方式的实践代码web
tips:基于
buildSrc
下groovy的就不记录了,大同小异。着重记录使用kotlin来自定义插件markdown
只能叫这个名字,
buildSrc
是gradle预留的插件开发目录 固然这只是android studio环境下的方式,其余方式参考官方文档便可 编译提示 'buildSrc' cannot be used as a project name as it is a reserved name 从settings.gradle里删除buildSrc从新编译就行,这毕竟是在android开发工具下,稍有水土不服app
若是不用kotlin 能够忽略 使用groovy时除了java版本号之外其余都可删除 顺带一提代码位置在
src/main/kotlin
与src/main/java
均可以 不过只有一个有效,优先java目录jvm
// 使用 plugins 块语法应用插件
plugins {
// 应用 kotlin 插件
id 'org.jetbrains.kotlin.jvm' version '1.3.72'
}
repositories {
google()
jcenter()
}
dependencies {
// 仅在编译时使用 Grdale-API 依赖
// compileOnly gradleApi() 目前暂时不知道gradleApi的做用 因此保持注释
// 在插件源码中添加 kotlin 标准库依赖
implementation 'org.jetbrains.kotlin:kotlin-stdlib'
}
java {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
复制代码
android studio IDE下,建立完buildSrc会自动生成一个插件类,但它没继承插件接口ide
须要稍微改改函数
class GrockPlugin :Plugin<Project> {
override fun apply(project: Project) {
println("GrockPlugin apply")
}
}
复制代码
若是找不到Plugin这个接口,不要慌。依赖一下gradle就行 打开
buildSrc
的build.gradle 添加依赖,gradle_version是项目根目录的gradle插件版本工具
dependencies {
implementation "com.android.tools.build:gradle:$gradle_version"
}
复制代码
按照文档要求整个声明文件便可
按以下目录建立一个[外部引用时的插件名称].properties
文件
|____main
| |____resources
| | |____META-INF
| | | |____gradle-plugins
| | | | |____com.grock.properties
复制代码
如上此插件名为com.grock
打开[外部引用时的插件名称].properties文件,在其中指定插件类
implementation-class=com.grock.plugin.GrockPluginJava
复制代码
新建一个module 引用便可
apply plugin:'com.grock'
复制代码
sync 查看日志
GrockPlugin apply
复制代码
为何快马加鞭要先搞个拓展函数呢,基于目前的思考这东西能拿来当配置,因此优先尝试学习 相似于常见的android{}函数同样
open class GrockExtension {
var name= "GrockExtension original-name"
}
复制代码
override fun apply(project: Project) {
//建立拓展函数,拓展函数名称,拓展函数类
val extensionFun = project
.extensions.create("grockName",GrockExtension::class.java)
project.afterEvaluate {
println("GrockPlugin-kotlin afterEvaluate:${extensionFun.name}")
}
}
复制代码
建立代码很好理解,最后两行的意义何在呢?为何不直接打印呢? 缘由很是简单,建立完拓展函数,插只是建立完这个拓展函数而在afterEvaluate回调时,插件已完成准备阶段,拓展函数都已读取,此时才能获取到拓展函数内的值
apply plugin:'com.grock'
grockName{
name "newName"
}
复制代码
打印内容:
GrockPlugin-kotlin afterEvaluate:newName
复制代码
插件代码:
class GrockPlugin implements Plugin<Project>{
@Override
void apply(Project target) {
println "GrokcPlugin apply"
// 建立拓展函数,声明拓展函数名 传入拓展类
def extension = target.extensions.create("nameFunction",GrockExtension)
target.afterEvaluate {//放在插件加完后执行,避免扩展函数未建立完成就访问
println " apply extension.name=${extension.name}"
}
}
}
class GrockExtension{
def name = "GrockExtension"
}
//从上到下逐个执行
apply plugin:GrockPluginJava
nameFunction {
name("extension-name") //setName("s")
}
复制代码
插件引用:直接引用插件类
groovy语法上能够省略class
apply plugin:GrockPlugin
复制代码
参考: