Skip to content

插件开发实战

源:开发 Gradle 插件

当你发现某些构建逻辑需要在多个项目之间共享,或者逻辑过于复杂不适合写在 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)

对于高级插件(如性能监控、无痕埋点),你可能需要使用 ASMByteBuddy 在编译期修改字节码。现代 AGP 推荐使用 Instrumentation API 来实现。