一、什么是 build.gradle?
build.gradle 是 Android 项目中最重要的配置文件之一,它基于 Gradle 构建系统,用于定义项目的构建配置、依赖管理和任务执行。每个 Android 项目都包含两种类型的 build.gradle 文件:
- 项目级(Project-level) - 对整个项目生效
- 模块级(Module-level) - 针对特定模块配置
二、项目级 build.gradle
位置:项目根目录/build.gradle
2.1 基本结构
groovy
// 构建脚本依赖配置
buildscript {
// 定义仓库源
repositories {
google() // Google Maven 仓库
mavenCentral() // Maven Central 仓库
// 可添加自定义仓库
maven { url "https://jitpack.io" }
}
// 声明 Gradle 插件依赖
dependencies {
classpath "com.android.tools.build:gradle:7.2.1" // Android Gradle 插件
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.0" // Kotlin 插件
// 其他插件...
}
}
// 所有模块的公共配置
allprojects {
repositories {
google()
mavenCentral()
}
}
// 任务清理配置
task clean(type: Delete) {
delete rootProject.buildDir
}
2.2 常用配置项
groovy
// 解决依赖冲突
subprojects {
project.configurations.all {
resolutionStrategy {
// 强制使用特定版本
force 'com.google.code.gson:gson:2.9.0'
// 统一版本号
eachDependency { details ->
if (details.requested.group == 'org.apache.httpcomponents') {
details.useVersion '4.4.1'
}
}
}
}
}
三、模块级 build.gradle
位置:app/build.gradle(以 app 模块为例)
3.1 完整示例
groovy
// 应用插件
plugins {
id 'com.android.application' // Android 应用插件
id 'org.jetbrains.kotlin.android' // Kotlin Android 插件
id 'kotlin-kapt' // Kotlin 注解处理
}
// Android 配置块
android {
// 编译配置
compileSdk 33 // 编译 SDK 版本
// 默认配置
defaultConfig {
applicationId "com.example.myapp" // 应用包名
minSdk 23 // 最小支持版本
targetSdk 33 // 目标版本
versionCode 1 // 内部版本号
versionName "1.0.0" // 显示版本名
// 测试配置
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// 构建配置字段
buildConfigField "String", "API_URL", '"https://api.example.com"'
resValue "string", "app_name", '"MyApp"'
}
// 构建类型
buildTypes {
debug {
// 调试版配置
minifyEnabled false
debuggable true
applicationIdSuffix ".debug"
versionNameSuffix "-debug"
}
release {
// 发布版配置
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
// 自定义构建类型
staging {
initWith release
applicationIdSuffix ".staging"
versionNameSuffix "-staging"
}
}
// 产品风味(多渠道打包)
flavorDimensions "version", "mode"
productFlavors {
free {
dimension "version"
applicationIdSuffix ".free"
versionNameSuffix "-free"
}
paid {
dimension "version"
applicationIdSuffix ".paid"
versionNameSuffix "-paid"
}
demo {
dimension "mode"
applicationIdSuffix ".demo"
}
full {
dimension "mode"
}
}
// 源代码集配置
sourceSets {
main {
java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['src/main/assets']
}
// 针对特定构建类型的源码
debug {
java.srcDirs = ['src/debug/java']
}
}
// 编译选项
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
// Kotlin 编译选项
kotlinOptions {
jvmTarget = '11'
}
// 构建特性
buildFeatures {
viewBinding true
dataBinding true
compose true
}
// 命名空间(Android Gradle Plugin 8.0+)
namespace 'com.example.myapp'
// 打包选项
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
// 依赖配置
dependencies {
// 本地依赖
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
// 模块依赖
implementation project(':mylibrary')
// 远程依赖
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.7.0'
// UI 组件
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation "androidx.compose.ui:ui:1.3.0"
// 生命周期组件
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
// 网络请求
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
// 图片加载
implementation 'com.github.bumptech.glide:glide:4.14.2'
kapt 'com.github.bumptech.glide:compiler:4.14.2'
// 数据库
implementation 'androidx.room:room-runtime:2.4.3'
kapt 'androidx.room:room-compiler:2.4.3'
// 依赖分类
compileOnly 'com.google.auto.value:auto-value-annotations:1.9' // 仅编译时
runtimeOnly 'com.google.auto.value:auto-value:1.9' // 仅运行时
// 测试依赖
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
// 调试依赖
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
}
// 签名配置
android {
signingConfigs {
release {
storeFile file("my-release-key.jks")
storePassword "password"
keyAlias "my-alias"
keyPassword "password"
}
}
}
四、高级配置技巧
4.1 版本统一管理
创建 versions.gradle 文件:
groovy
// versions.gradle
ext {
versions = [
compileSdk: 33,
minSdk : 23,
targetSdk : 33,
kotlin : "1.7.0",
androidx_core: "1.9.0",
appcompat : "1.5.1"
]
libraries = [
androidx_core: "androidx.core:core-ktx:${versions.androidx_core}",
appcompat : "androidx.appcompat:appcompat:${versions.appcompat}"
]
}
在 build.gradle 中引用:
groovy
// 项目级 build.gradle
apply from: 'versions.gradle'
// 模块级 build.gradle
android {
compileSdk versions.compileSdk
defaultConfig {
minSdk versions.minSdk
targetSdk versions.targetSdk
}
}
dependencies {
implementation libraries.androidx_core
implementation libraries.appcompat
}
4.2 自定义任务
groovy
// 自定义 Gradle 任务
task generateBuildInfo {
doLast {
def buildTime = new Date().format("yyyy-MM-dd HH:mm:ss")
def buildInfo = """\
|buildTime=$buildTime
|buildUser=${System.getProperty("user.name")}
|""".stripMargin()
new File(project.buildDir, "build-info.properties").text = buildInfo
}
}
// 任务依赖
preBuild.dependsOn generateBuildInfo
4.3 构建变体配置
groovy
android {
// 为特定构建变体配置
applicationVariants.all { variant ->
variant.outputs.all { output ->
def flavor = variant.flavorName
def buildType = variant.buildType.name
def version = variant.versionName
def date = new Date().format("yyyyMMdd")
output.outputFileName = "app_${flavor}_${buildType}_v${version}_${date}.apk"
}
}
}
五、优化建议
5.1 构建速度优化
groovy
// gradle.properties
org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.daemon=true
android.enableBuildCache=true
android.useAndroidX=true
android.enableJetifier=true
5.2 依赖管理优化
groovy
// 使用 implementation 而不是 compile
dependencies {
// 推荐
implementation 'com.example:library:1.0.0'
// 避免使用(已过时)
// compile 'com.example:library:1.0.0'
// 特定场景
api 'com.example:library:1.0.0' // 暴露给依赖模块
}
六、常见问题解决
6.1 依赖冲突
groovy
configurations.all {
// 排除特定依赖
exclude group: 'com.google.guava', module: 'guava-jdk5'
// 强制使用版本
resolutionStrategy {
force 'com.google.code.gson:gson:2.9.0'
// 依赖替换
dependencySubstitution {
substitute module('com.android.support:support-v4')
.using module('androidx.legacy:legacy-support-v4:1.0.0')
}
}
}
6.2 多模块配置
groovy
// 在根目录 build.gradle
subprojects { subproject ->
afterEvaluate {
if (subproject.hasProperty("android")) {
android {
compileSdkVersion 33
buildToolsVersion "33.0.0"
defaultConfig {
minSdkVersion 23
targetSdkVersion 33
}
}
}
}
}
总结
build.gradle 是 Android 开发的核心配置文件,掌握其配置方法对于构建优化、依赖管理和项目维护至关重要。通过合理配置,可以:
- 提高构建效率
- 管理复杂的依赖关系
- 支持多环境构建
- 优化应用包大小
- 实现自动化构建流程
建议根据项目需求灵活运用这些配置,并定期更新 Gradle 和插件版本以获取最新功能和性能改进。