创建使用二进制插件
使用buildSrc子工程的形式创建插件
-
创建一个这样的名为buildSrc项目
截屏2023-02-03 13.42.07.png
编辑build.gradle
// 引用groovy插件,编译插件工程的groovy代码
apply plugin: 'groovy'
// 声明第三方包的仓库、
repositories {
google()
mavenCentral()
}
// 引入第三方包
dependencies {
implementation gradleApi()
implementation localGroovy()
}
- groovy文件夹创建一个groovy文件,作为插件工程的入口
package com.zz.myplugin.gradle
class MyPlugin implements Plugin<Project> {
// 项目中使用到的apply关键字引入插件 就会执行此方法下的逻辑
@Override
void apply(Project project) {
println("我是MyPlugin:${project.name}")
}
}
- resource文件夹下创建META-INF/gradle-plugins/com.zz.myplugin.properties
com.zz.myplugin为该插件对外引用的字符串
对应我们熟悉的android插件的引用方式:apply plugin: 'com.android.application'
引号中的字符串意思一样
# 将引入插件的对外引用的字符串com.zz.myplugin和插件具体路径对应
implementation-class = package名字.MyPlugin
- 最后在我们的app模块下build.gradle中使用
apply plugin: 'com.android.application'
// 引入本地创建的插件
apply plugin: 'com.zz.myplugin'
实现插件参数的配置
android插件的参数配置如下所示,下面实现一下自定义的简单的参数配置
android {
compileSdkVersion 33
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.testgradle1"
minSdkVersion 21
targetSdkVersion 33
versionCode 1
versionName "1.0"
}
...
}
- 创建Extension
创建MyExtension.groovy文件
package com.zz.router.gradle
// 1创建Extension
class MyExtension {
String pathName
}
- 注册Extension
package com.zz.myplugin.gradle
class MyPlugin implements Plugin<Project> {
// 项目中使用到的apply关键字引入插件 就会执行此方法下的逻辑
@Override
void apply(Project project) {
println("我是MyPlugin:${project.name}")
// 2注册 Extension
project.getExtensions().create("myExtension",MyExtension)
}
}
- 使用Extension
在app模块下的build.gradle中使用
apply plugin: 'com.android.application'
// 引入本地创建的插件
apply plugin: 'com.zz.myplugin'
// 3使用Extensions
myExtension {
pathName getRootDir().absolutePath
}
- 获取Extension
获取app中build.gradle中配置的参数
package com.zz.myplugin.gradle
class MyPlugin implements Plugin<Project> {
// 项目中使用到的apply关键字引入插件 就会执行此方法下的逻辑
@Override
void apply(Project project) {
println("我是MyPlugin:${project.name}")
// 2 注册 Extension
project.getExtensions().create("myExtension",MyExtension)
// 4 获取Extension中的用户配置的内容
// afterEvaluate当前工程的配置阶段已经结束 可以拿到用户配置的插件参数
project.afterEvaluate {
RouterExtension extension = project["myExtension"]
println("用户设置的pathName为:${extension. pathName}")
}
}
}