Skip to content

约定插件 (Convention Plugins)

在多模块项目中,你可能会发现每个模块的 build.gradle.kts 都在重复写相同的东西:Java 17 兼容、Kotlin 配置、Compose 依赖等。

传统的 allprojects { } 机制虽然能解决问题,但它会导致模块间严重耦合,且难以维护。约定插件 (Convention Plugins) 是现代 Gradle 推荐的“逻辑复用”方案。

1. 核心理念

将“约定”好的构建逻辑(如:这就是一个 Android Library 模块该有的配置)提取到一个独立的插件中。每个模块只需要引用这个插件,就能自动获得所有标准配置。

2. 实现方案:build-logic 复合构建

建议

推荐创建一个名为 build-logic 的独立目录,作为复合构建(Composite Build)引入。

步骤 A: 创建项目结构

text
├── build-logic/
│   ├── convention/
│   │   ├── src/main/kotlin/AndroidLibraryConventionPlugin.kt
│   │   └── build.gradle.kts (定义插件本身)
│   └── settings.gradle.kts
├── app/
└── settings.gradle.kts (包含 build-logic)

步骤 B: 编写插件代码

kotlin
class AndroidLibraryConventionPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        with(target) {
            with(pluginManager) {
                apply("com.android.library")
                apply("org.jetbrains.kotlin.android")
            }

            extensions.configure<LibraryExtension> {
                configureKotlinAndroid(this)
                defaultConfig.targetSdk = 34
                // 其他通用配置...
            }
        }
    }
}

步骤 C: 在业务模块中使用

kotlin
// feature/login/build.gradle.kts
plugins {
    id("my.android.library") // 引用你定义的约定插件
}

dependencies {
    // 只需要写业务特有的依赖
}

3. 优势

  1. 强类型支持: 插件代码本身也是 Kotlin,支持代码补全和跳转。
  2. 按需应用: 只有声明了插件的模块才会受到影响,不会像 allprojects 那样污染无关模块。
  3. 构建速度: 构建逻辑被独立编译,能够更好地利用 Gradle 缓存。