Android 中 buildSrc 介绍总结

913 阅读2分钟

Android 中 buildSrc 目录介绍

在 Android Gradle 项目中,buildSrc 目录用于存放自定义的 Gradle 插件和构建逻辑,使项目的构建过程更加模块化、可维护。


1. buildSrc 的作用

buildSrc 目录的主要功能包括:
集中管理依赖(如 dependencies 版本管理)。
自定义 Gradle 插件,封装复杂的构建逻辑。
简化 build.gradle(.kts) 文件,提高可读性和可维护性。
适用于 Kotlin DSL 和 Groovy DSL,更符合现代 Gradle 构建方式。


2. buildSrc 目录结构

当你在 Android 项目根目录创建 buildSrc 目录后,Gradle 会自动识别它为一个独立的 Gradle 模块。其结构如下:

bash
复制编辑
project-root/
│── buildSrc/                     # Gradle 会自动编译并应用此模块
│   ├── src/main/
│   │   ├── kotlin/                # 存放 Kotlin 代码(如果使用 Groovy,则是 groovy/)
│   │   │   ├── MyCustomPlugin.kt   # 自定义 Gradle 插件
│   │   │   ├── Dependencies.kt     # 统一管理依赖版本
│   │   ├── resources/
│   │   │   ├── META-INF/
│   │   │   │   ├── gradle-plugins/
│   │   │   │   │   ├── my-plugin.properties # 插件标识文件(可选)
│   ├── build.gradle.kts            # `buildSrc` 自身的 Gradle 构建脚本
│   ├── settings.gradle.kts         # `buildSrc` 的 Gradle 配置(通常可省略)
│── app/
│── build.gradle.kts
│── settings.gradle.kts

3. buildSrc 典型用法

(1)统一管理依赖版本

可以在 buildSrc/src/main/kotlin/Dependencies.kt 中定义所有依赖的版本号:

object Versions {
    const val kotlin = "1.8.0"
    const val coroutines = "1.6.4"
    const val retrofit = "2.9.0"
}

object Libs {
    const val kotlinStdLib = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}"
    const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.coroutines}"
    const val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}"
}

然后在 app/build.gradle.kts 中直接引用:

dependencies {
    implementation(Libs.kotlinStdLib)
    implementation(Libs.coroutinesCore)
    implementation(Libs.retrofit)
}

这样可以避免在多个 build.gradle.kts 文件中重复定义版本号,提升可维护性。


(2)自定义 Gradle 插件

buildSrc/src/main/kotlin/MyCustomPlugin.kt 中定义一个自定义 Gradle 插件:

import org.gradle.api.Plugin
import org.gradle.api.Project

class MyCustomPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        project.tasks.register("myTask") {
            it.doLast {
                println("Hello from MyCustomPlugin!")
            }
        }
    }
}

然后在 buildSrc/src/main/resources/META-INF/gradle-plugins/my-plugin.properties 中声明插件:

implementation-class=MyCustomPlugin

app/build.gradle.kts 中应用插件:

plugins {
    id("my-plugin")
}

执行 ./gradlew myTask,你会看到:

Hello from MyCustomPlugin!

4. 为什么使用 buildSrc

方式优势缺点
buildSrc代码自动编译生效、可使用 Kotlin DSL、支持代码补全、适合复杂构建逻辑无需手动 apply,但会增加编译时间
gradle.properties适用于简单的版本管理,较轻量不能直接用于逻辑编写,易读性差
Version Catalogs (libs.versions.toml)Gradle 官方推荐,用于依赖管理不能编写 Gradle 任务或插件

5. buildSrc vs init.gradle.kts vs settings.gradle.kts

方式适用场景
buildSrc适用于 项目内部 自定义 Gradle 任务、插件、依赖管理。
init.gradle.kts适用于 Gradle 全局 配置,作用于所有 Gradle 项目。
settings.gradle.kts适用于 多模块项目,主要管理 include(":module") 等。

6. 什么时候不适合用 buildSrc

  • 如果只是管理依赖,推荐使用 Version Catalogs (libs.versions.toml) ,避免编译 buildSrc 增加构建时间。
  • 如果构建逻辑很简单(比如一个 task),可以直接写在 build.gradle.kts 中,而不必创建 buildSrc

7. 总结

buildSrc 适用于复杂的 Gradle 逻辑(如插件、任务、依赖管理)。
✅ 代码自动生效,不需要 apply,支持Kotlin DSL代码补全
✅ 如果只是管理依赖,推荐Version Catalogs 而不是 buildSrc

如果你的项目需要多个 Gradle 任务,或者想封装插件来提升可维护性,buildSrc 是一个很好的选择!