build.gradle:是什么、语法与Android配置

作者: IT Sectr 发布日期: 2026-05-31 阅读时间: 9 分钟

build.gradle 是 Gradle 中 Android 项目的主要构建文件,包含编译、打包和签署应用程序的指令。项目中的每个模块都有自己的 build.gradle:一个在项目级别(project-level),一个在每个模块级别(module-level)。根据 Google Android Developers, 2025,正确配置 build.gradle 可将构建速度提升 40% 并消除依赖冲突。语法支持两种语言:Groovy(build.gradle)和 Kotlin DSL(build.gradle.kts)。

要点

  • build.gradle — 带有插件、依赖项和 Android 配置设置的 Gradle 构建文件。
  • Project-level 为所有模块指定插件和仓库。
  • Module-level 包含带有 buildTypes、productFlavors 和 sourceSets 的 android 块。
  • Groovy vs Kotlin DSL — 两种语法;Kotlin DSL 因类型安全而更受青睐。
  • dependencies 管理库:implementation、api、compileOnly、runtimeOnly。

什么是 build.gradle?

build.gradle 是一个用 Groovy(.gradle 扩展名)或 Kotlin(.gradle.kts)语言编写的构建脚本,管理 Android 应用程序编译的所有方面。Gradle 是 Google 于 2013 年采用的标准 Android 自动构建系统。build.gradle 描述了:应用了哪些插件(Android、Kotlin、库),连接了哪些依赖项,使用了哪些 SDK 版本,如何签署应用程序以及在何处发布。

构建过程包括三个阶段:Initialization(确定模块)、Configuration(执行 build.gradle 脚本)、Execution(执行任务)。build.gradle 在 Configuration 阶段执行,此时 Gradle 创建任务图。在此阶段确定构建变体、计算依赖项和配置任务。重要提示:build.gradle 是代码,而不仅仅是配置。它可以使用条件语句、循环、方法调用和外部脚本。

Gradle 文件存储在模块根目录(app/build.gradle)和项目根目录(build.gradle)中。此外,Gradle 支持 apply from — 连接外部 Gradle 脚本。这允许将重复的逻辑提取到具有公共设置的文件中。随着 Convention Plugins(AGP 7+)的出现,apply from 被视为已弃用 — Convention Plugins 提供了一种类型安全且可组合的方式来在模块之间重用配置。

build.gradle 的演变

自 2013 年以来,build.gradle 的语法经历了重大变化:从具有动态配置的 Groovy 到具有编译时检查的 Kotlin DSL。AGP 从 1.0 版本发展到 8.7(2025)。关键里程碑:AGP 3.0(Java 8 desugar、new variant API),AGP 4.0(view binding、Java 11),AGP 7.0(默认 Kotlin DSL、Java 11 min),AGP 8.0(non-transitive R classes、Kotlin 中的构建配置),AGP 8.7(KSP 替代 kapt、快速配置)。

Project-level 和 Module-level build.gradle

Project-level build.gradle(根目录)为所有模块指定公共的插件、仓库和配置。主要块:plugins(连接 Gradle 插件)、repositories(依赖源:mavenCentral、google、jitpack)。根 build.gradle 中通常没有 android 块 — 它出现在模块中。Project-level 还可以包含 subprojects 块用于所有子项目的公共配置,尽管 Convention Plugins 更受青睐。

Module-level build.gradle(例如 app/build.gradle)描述特定模块。如果模块是应用程序,则应用 com.android.application 插件。如果是库,则应用 com.android.library。Module-level 包含:android 块(compileSdk、defaultConfig、buildTypes、productFlavors)、dependencies 块(模块的依赖项)以及用于配置测试和构建的可选块。Module-level 在 project-level 之后执行,可以覆盖公共设置。

从 AGP 8.0 开始,根 build.gradle 可以使用 version catalogs(libs.versions.toml)来集中管理依赖版本。Version catalog 是 gradle/ 目录中的一个文件,包含版本、库和插件。在 build.gradle 中,依赖项通过 libs 连接:implementation(libs.retrofit)。Version catalogs 对于新项目是必需的,并推荐用于所有具有三个或更多模块的项目。

kotlin
// settings.gradle.kts — 项目根目录
pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

// build.gradle.kts(项目级别)
plugins {
    id("com.android.application") version "8.7.0" apply false
    id("org.jetbrains.kotlin.android") version "2.0.21" apply false
}

// app/build.gradle.kts(模块级别)
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("com.google.devtools.ksp")
}

android {
    namespace = "com.example.myapp"
    compileSdk = 35

    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 26
        targetSdk = 35
        versionCode = 1
        versionName = "1.0.0"
    }
}

Groovy 对比 Kotlin DSL

Groovy 是一种动态 JVM 语言,是 Gradle 的原始语法。Groovy 脚本(.gradle)使用动态类型:可以省略类型,可以使用或不使用引号,可以调用编译阶段不存在的方法。Groovy 的灵活性也是其缺点:IDE 无法在脚本执行前检查语法和类型,导致在参数名称或类型错误时出现运行时错误。

Kotlin DSL(.gradle.kts)使用 Kotlin 的静态类型。IDE 检查类型,通过自动完成建议可用参数,并在编辑阶段高亮显示错误。Kotlin DSL 在 Configuration 阶段较慢(由于将 .kts 文件编译为字节码),但 Google 不断改进性能:AGP 8.5+ 使用 Gradle Configuration Cache 和 Caching Kotlin DSL compilation,将差异减少到 1-2 秒。

Google 推荐所有新项目使用 Kotlin DSL 并逐步迁移现有项目。从 Groovy 迁移到 Kotlin DSL 很简单:引号替换为括号,添加类型,运算符转换为函数。大多数库在文档中提供 Kotlin DSL 示例。对于复杂情况(Custom Plugin、Task Graph),Kotlin DSL 提供类型安全 API,并防止在 Groovy 中只能在运行时发现的错误。Version catalogs(libs.versions.toml)对两种语法的工作方式相同。

特性Groovy (.gradle)Kotlin DSL (.gradle.kts)
类型系统动态静态
IDE 检查有限全面(自动完成、类型)
配置速度更快(无需编译)较慢(.kts 编译)
错误运行时编译时
推荐仅旧项目新项目和迁移

android 块:应用程序配置

compileSdk、minSdk 和 targetSdk

android 块 — module-level build.gradle 的核心元素。在其内部配置:namespace(用于 R 和 BuildConfig)、compileSdk、defaultConfig、buildTypes、productFlavors、sourceSets、compileOptions、packaging、bundle。android 块的所有参数仅适用于 Android 模块。如果模块是库,则使用库插件代替应用程序,并且 android 块中没有 applicationId。

compileSdk — 编译代码所用的 SDK 版本。应等于最新的 Android API(编写本文时为 35)。minSdk — 支持的最低 API 版本。targetSdk — 应用程序目标版本(此版本的行为更改将适用)。compileSdk 和 targetSdk 之间的区别:compileSdk 确定可用的 API,targetSdk 确定运行时行为。建议:compileSdk = latest,targetSdk = latest - 1(用于测试对新更改的适配)。

compileOptions 设置 Java 兼容性:sourceCompatibility 和 targetCompatibility。AGP 8+ 需要 Java 17+ 进行编译。packaging 管理来自库的文件的包含:exclude、merge、pickFirst 用于解决 META-INF 冲突。buildFeatures 启用/禁用 ViewBinding、DataBinding、Compose。aaptOptions 配置资源处理:ignoreAssetsPattern、cruncherEnabled。android 块的每个元素优化构建的特定方面。

kotlin
android {
    namespace = "com.example.myapp"
    compileSdk = 35
    buildToolsVersion = "35.0.0"

    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 26
        targetSdk = 35
        versionCode = 5
        versionName = "2.3.1"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        getByName("debug") { isDebuggable = true }
        getByName("release") {
            isMinifyEnabled = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"))
        }
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }

    buildFeatures {
        viewBinding = true
        compose = true
    }
}

依赖管理

BOM(Bill of Materials)

依赖项在 build.gradle 中是连接到项目的库和模块。dependencies 块与 android 块位于同一级别。Gradle 支持多种配置:implementation(库在此模块中可用,非传递性)、api(库对依赖模块传递性可用)、compileOnly(仅用于编译,不包含在 APK 中)、runtimeOnly(仅运行时)、annotationProcessor / ksp(注解处理器)、testImplementation(仅用于测试)、androidTestImplementation(仅用于仪器测试)。

从 AGP 8.0 开始,Non-Transitive R classes — 每个库都有自己的 R 类,防止资源冲突。在 dependencies 块中,使用正确的配置很重要:implementation 不暴露传递性依赖,从而加快构建速度。api 暴露 — 当库从另一个库导出类型时使用(例如,Retrofit 在其公共 API 中使用 OkHttp 类型)。

对于版本管理,建议使用 BOM(Bill of Materials)— 一个确定库的兼容版本的构建文件。Firebase BOM:implementation(platform("com.google.firebase:firebase-bom:33.0.0"))。连接 BOM 后,只需指定库名称而不指定版本 — BOM 将自动选择兼容版本。这消除了不同库的传递性依赖之间的冲突。BOM 适用于 Firebase、Compose、Kotlin、Ktor、AndroidX。

kotlin
dependencies {
    // BOM — 版本管理
    implementation(platform("androidx.compose:compose-bom:2024.12.01"))
    implementation(platform("com.google.firebase:firebase-bom:33.0.0"))

    // AndroidX 和 Compose
    implementation("androidx.core:core-ktx")
    implementation("androidx.lifecycle:lifecycle-runtime-ktx")
    implementation("androidx.activity:activity-compose")
    implementation("androidx.compose.ui:ui")

    // Network
    implementation("com.squareup.retrofit2:retrofit:2.11.0")
    implementation("com.squareup.okhttp3:okhttp:4.12.0")

    // Firebase(BOM 版本)
    implementation("com.google.firebase:firebase-firestore")
    implementation("com.google.firebase:firebase-crashlytics")

    // 测试
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.2.1")
}

多模块项目中的 build.gradle

在多模块项目中,每个模块都有自己的 build.gradle。将一个模块连接到另一个模块使用 implementation(project(":module-name")) 语法。Gradle 在模块配置更改时自动构建它。多模块架构改善了构建时间(增量构建、并行性)并在功能模块、核心模块和库之间分配责任。

多模块项目的关键问题 — 配置重复。如果 10 个模块具有相同的 minSdk、compileSdk 和 Compose 依赖项,那就是不同 build.gradle 中的 10 份副本。解决方案 — Convention Plugins(以前是 buildSrc)。Convention Plugin 是一个用 Kotlin 编写的 Gradle 插件,应用于模块:plugins { id("myapp.android.library") }。该插件包含公共配置,更改会立即应用于所有模块。

为了组织 Convention Plugins,使用项目根目录中的 build-logic/ 目录。它包含 settings.gradle 中的 includeBuild 和 Kotlin 插件。Convention Plugins 可以发布到 maven 仓库以便在项目之间重用。Google 推荐 Convention Plugins 作为多模块项目的标准,替代 subprojects { } 和 apply from。切换到 Convention Plugins 将模块的 build.gradle 减少到 10-15 行。

kotlin
// build-logic/src/main/kotlin/AndroidLibraryConventionPlugin.kt
class AndroidLibraryConventionPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        with(target) {
            with(plugins) {
                apply("com.android.library")
                apply("org.jetbrains.kotlin.android")
            }
            extensions.configure<CommonExtension<*, *, *, *>> {
                compileSdk = 35
                defaultConfig { minSdk = 26 }
                compileOptions {
                    sourceCompatibility = JavaVersion.VERSION_17
                    targetCompatibility = JavaVersion.VERSION_17
                }
            }
        }
    }
}

// module/build.gradle.kts — 使用 Convention Plugin 后
plugins {
    id("myapp.android.library")
}

dependencies {
    implementation(project(":core:network"))
}

常见问题

2025 年应该为 build.gradle 选择哪种语言?

Kotlin DSL(.gradle.kts)— Google 的官方推荐。静态类型防止错误,IDE 提供自动完成。Groovy(.gradle)受到支持,但 Gradle 和 AGP 的新功能首先在 Kotlin DSL 上进行测试。

build.gradle 中的 namespace 有什么作用?

namespace 确定生成的类的包(R.java、BuildConfig)。以前 namespace 在 AndroidManifest.xml 中指定。从 AGP 7+ 开始,namespace 仅在 build.gradle 中指定。该值应与 applicationId 匹配(如果使用 applicationIdSuffix 则可以不同)。

如何加速 Gradle 构建?

启用 Gradle Configuration Cache(org.gradle.configuration-cache=true),使用 Build Cache(org.gradle.caching=true),切换到 KSP 替代 kapt,拆分多模块项目并使用 Convention Plugins。同时禁用不必要的 product flavors:在 debug 模式下只构建一个 flavor。

implementation 和 api 有什么区别?

implementation:依赖项仅在模块内部可见。依赖模块无法访问传递性类。api:依赖项对外暴露。当依赖项中的类型用于模块的公共 API 时使用 api(例如,Retrofit 导出 OkHttp 类型)。implementation 加快了构建速度 — Gradle 在 implementation 依赖项更改时不会重新构建依赖模块。

build.gradle 可以用于 iOS 吗?

build.gradle 是 Android 特有的文件。iOS 使用 Xcode project(.xcodeproj)和 Swift Package Manager(Package.swift)。但是存在跨平台工具(Kotlin Multiplatform、Flutter、React Native),其中 build.gradle 用于构建 Android 部分。在 KMP 中,build.gradle 配置 Android target。

总结

  • build.gradle — Android 项目的核心构建文件,管理插件、依赖项和配置。
  • Project-level 指定公共插件和仓库;module-level 包含 android 块和模块依赖项。
  • Kotlin DSL — 由于静态类型,推荐用于新项目的语法。
  • android 块 配置 compileSdk、defaultConfig、buildTypes、productFlavors 和 sourceSets。
  • Dependencies 使用 implementation(隐藏)和 api(公共);BOM 传递性管理版本。
  • 多模块项目 应用 Convention Plugins 以消除配置重复。
  • 建议:为了简洁和构建速度,迁移到 Kotlin DSL、Version Catalogs 和 Convention Plugins。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读