论 Android 如何自定义 Gradle 插件

235 阅读1分钟

开发环境

  • Android Studio Ladybug Feature Drop | 2024.2.2 Patch 2

    Build #AI-242.23726.103.2422.13103373, built on February 22, 2025

  • JDK 17

  • Gradle-8.7

Gradle 自定义插件方式

方式一

在项目或各模块 build.gradle 文件中实现 Plugin 接口,在对应文件中通过 apply 引入对应插件,适用于当前文件。

project - build.gradle.kts

// 实现插件
class RootPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        println("RootPlugin")

        project.tasks.register("rootPluginTask1") {
            doLast {
                println("do RootPluginTask1")
            }
        }

        project.tasks.register("rootPlugin1Task2") {
            doLast {
                println("do RootPluginTask22")
            }
        }
    }
}

project - build.gradle.kts

apply<RootPlugin>()
// 或者 
// apply {
//    plugins.apply(RootPlugin::class.java)
//}

方式二

在项目中新建 buildSrc 模块,该模块下代码可直接参与 gradle 构建,适用于同一个项目中所需使用的插件,无需依赖插件本地编译jar。

project - buildSrc - BuildSrcPlugin.kt

package com.miyako.plugin

class BuildSrcPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        println("BuildSrcPlugin")

        project.tasks.register("buildSrcPluginTask1") {
            it.doLast {
                println("doLast buildSrcPluginTask1")
            }
        }
        project.tasks.register("buildSrcPluginTask2") {
            it.doLast {
                println("doLast buildSrcPluginTask2")
            }
        }
    }
}

project - buildSrc - build.gradle.kts

gradlePlugin {
    plugins {
        // 创建插件名
        create("myPlugin") {
            // 声明 Plugin Id
            id = "com.miyako.buildsrc.plugin"
            // 声明 Plugin 实现类
            implementationClass = "com.miyako.plugin.BuildSrcPlugin"
        }
    }
}
在模块中引入插件

plugins {
    id("com.miyako.buildsrc.plugin")
}

或者 

apply(plugin = "com.miyako.buildsrc.plugin")

或者

// 这个方式不创建 PluginId
apply<BuildSrcPlugin>()

方式三

新建模块用于单独编译 Plugin,通常适用于自定义插件库,发布到本地仓库或远端仓库。

project - plugin - CustomPlugin.kt

package com.miyako.plugin

class CustomPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        println("CustomPlugin")
        project.tasks.register("customPluginTask") {
            it.doLast {
                println("doLast customPluginTask 111")
            }
        }
    }
}

project - plugin - build.gradle.kts
gradlePlugin {
    plugins {
        // 声明 Plugin
        create("customPlugin") {
            id = "com.miyako.CustomPlugin"
            implementationClass = "com.miyako.plugin.CustomPlugin"
        }
    }
}

publishing {
    publications {
        create<MavenPublication>("mavenJava") {
            from(components["java"])
            // 声明依赖库
            groupId = "com.miyako.plugin3"
            // 声明模块
            artifactId = "plugin-module"
            // 声明版本
            version = "1.0.0"
        }
    }
    repositories {
        maven {
            // 声明本地编译生成 jar 包位置 
            setUrl(layout.buildDirectory.dir("./repo"))
        }
    }
}

指定本地依赖库位置

project - settings.gradle.kts
pluginManagement {

    repositories {
        maven(uri("./plugin/build/repo"))
    }
}

引入插件依赖

project - root - build.gradel.kts
buildscript {
    dependencies {
        // 引入本项目的插件模块
        classpath("com.miyako.plugin3:plugin-module:1.0.0")
    }
}

声明插件方式和前两种方式相同。PS: 在 project - build.gradle.kts 中声明插件会提示无法找到 plugin 比较奇怪。