插件开发实战
当你发现某些构建逻辑需要在多个项目之间共享,或者逻辑过于复杂不适合写在 build.gradle.kts 中时,将其封装为插件是最佳选择。
1. 插件的三种形态
| 形态 | 描述 | 适用场景 |
|---|---|---|
| 脚本插件 | 直接在 .kts 文件中写 apply。 | 极其简单的逻辑复用。 |
| buildSrc 插件 | 放在项目内部的 buildSrc 目录下。 | 仅在当前项目内复用的逻辑。 |
| 独立二进制插件 | 独立的 Gradle 项目,可发布到 Maven。 | 跨项目、跨公司复用的通用工具。 |
2. 编写一个简单的插件类
你只需要实现 Plugin<Project> 接口。
kotlin
import org.gradle.api.Plugin
import org.gradle.api.Project
class MyGreetingPlugin : Plugin<Project> {
override fun apply(project: Project) {
// 1. 注册一个配置扩展 (Extension)
val extension = project.extensions.create("greeting", GreetingExtension::class.java)
// 2. 注册一个 Task
project.tasks.register("hello") {
group = "greeting"
doLast {
println("\${extension.message.get()}, \${extension.target.get()}!")
}
}
}
}
// 定义配置项
interface GreetingExtension {
val message: Property<String>
val target: Property<String>
}3. 在 build.gradle.kts 中注册
你需要告诉 Gradle 你的插件 ID 对应哪个类。
kotlin
gradlePlugin {
plugins {
create("myGreetingPlugin") {
id = "com.virogu.greeting"
implementationClass = "com.virogu.MyGreetingPlugin"
}
}
}4. 使用插件
kotlin
plugins {
id("com.virogu.greeting")
}
greeting {
message.set("Hello")
target.set("Android Developers")
}5. 进阶:操作字节码 (Transform API)
对于高级插件(如性能监控、无痕埋点),你可能需要使用 ASM 或 ByteBuddy 在编译期修改字节码。现代 AGP 推荐使用 Instrumentation API 来实现。