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