🧭 快速定位 >>>
先分清 Android Gradle Plugin、Gradle 和 Wrapper 的职责,再决定该改哪个文件。
gradlew gradle:项目内固定入口,优先于本机AGP android {}:Android Gradle Plugin,负责 DSL、变体、打包与签名Gradle:构建引擎,负责任务图、依赖解析、缓存、并行执行settings.gradle(.kts):声明模块、仓库、版本目录、插件仓库build.gradle(.kts):模块构建脚本,声明插件、Android DSL、依赖gradle.properties:全局性能参数、开关和 JVM 配置libs.versions.toml:推荐放依赖版本与插件别名
升级判断
gradle/wrapper/gradle-wrapper.properties:当前 Gradle 版本plugins {}:当前 AGP / Kotlin 插件版本- 升级前先查 AGP release notes : 避免 JDK、Gradle、compileSdk 不兼容
# 看当前 Wrapper 版本
cat gradle/wrapper/gradle-wrapper.properties
# 看可执行任务
./gradlew tasks
# 看构建环境
./gradlew -version
📦 Wrapper 与版本对齐 >>>
Wrapper 负责把团队构建环境钉死;Android 项目升级优先改 Wrapper,再改 AGP 和 Kotlin。
./gradlew wrapper --gradle-version 9.1.0:升级 WrapperdistributionUrl=:真正控制下载哪个 Gradle 发行版bin:仅运行时需要,体积更小all:包含源码和文档,适合 IDE 更完整索引
# gradle/wrapper/gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
经验规则
- AGP、Gradle、JDK 需要成套升级,不要只改其中一个
./gradlew gradlewrapper
🏗️ settings 与插件入口 >>>
现代 Android 项目优先用 Kotlin DSL、插件块和版本目录,减少散落版本号。
pluginManagement {}:插件仓库与解析策略dependencyResolutionManagement {}:依赖仓库策略repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS):禁止子模块乱配仓库include(":app", ":core", ":feature:login"):声明模块
// settings.gradle.kts
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "MyApp"
include(":app", ":core", ":feature:login")
# gradle/libs.versions.toml
[versions]
agp = "9.1.0"
kotlin = "2.2.20"
androidx-core = "1.17.0"
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
[libraries]
androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core" }
🤖 Android DSL 核心块
namespace:AGP 8+ 推荐明确声明compileSdk:决定能编译到的 API levelminSdk:决定可安装最低版本targetSdk:影响运行时行为兼容策略buildFeatures:开启 Compose、BuildConfig、ViewBinding 等packaging:处理资源冲突
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
}
android {
namespace = "com.example.app"
compileSdk = 36
defaultConfig {
applicationId = "com.example.app"
minSdk = 24
targetSdk = 36
versionCode = 12
versionName = "1.2.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildFeatures {
buildConfig = true
viewBinding = true
compose = true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
📚 依赖与版本目录 >>>
Android 项目最容易失控的是版本漂移和错误暴露,版本目录与依赖配置要一起用。
implementation:对外不暴露,默认首选api:暴露给依赖当前模块的上游模块compileOnly:编译需要,打包不带runtimeOnly:运行需要,编译不需要testImplementation:单元测试依赖androidTestImplementation:设备 / 模拟器测试依赖debugImplementation:仅 debug 变体使用
dependencies {
implementation(project(":core"))
implementation(libs.androidx.core.ktx)
debugImplementation("androidx.compose.ui:ui-tooling")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.3.0")
}
常见误区
implementation apilibs.versions.tomlsettings.gradle(.kts)
🧩 变体、风味与多模块 >>>
变体组合来自 `buildTypes × productFlavors`,命名、签名和资源覆盖都跟这个组合走。
buildTypes debug release:/ 行为差异productFlavors:免费版、企业版、国内版等业务差异flavorDimensions:风味维度必须声明sourceSets:为特定变体追加代码和资源目录
android {
flavorDimensions += "tier"
productFlavors {
create("free") {
dimension = "tier"
applicationIdSuffix = ".free"
versionNameSuffix = "-free"
}
create("pro") {
dimension = "tier"
}
}
buildTypes {
debug {
applicationIdSuffix = ".debug"
isMinifyEnabled = false
}
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}
# 常用变体任务命名规则
./gradlew assembleFreeDebug
./gradlew bundleProRelease
./gradlew installFreeDebug
▶️ 高频任务与日常命令 >>>
Android 项目日常主要围绕 assemble、bundle、install、test、lint、dependencies 这些任务。
./gradlew help:看入口帮助./gradlew projects:看模块树./gradlew tasks --all:看全部任务./gradlew clean assembleDebug:清理并打 debug 包./gradlew bundleRelease:打 AAB./gradlew installDebug:安装到设备./gradlew testDebugUnitTest:跑 JVM 单测./gradlew connectedDebugAndroidTest:跑仪器测试./gradlew lintDebug:跑 Lint./gradlew app:dependencies:查看依赖树
# 只构建某个模块
./gradlew :app:assembleDebug
# 并行和构建缓存一起开
./gradlew assembleDebug --parallel --build-cache
# 输出 Build Scan(团队允许时)
./gradlew assembleRelease --scan
🔐 签名、发布与产物 >>>
发布版最关键的是签名凭据隔离、AAB 产物和混淆配置,不要把密码硬编码进仓库。
signingConfigs:定义 keystore 和密码来源bundleRelease:Google Play 首选产物assembleRelease:传统 APK 产物mapping.txt:混淆后排查崩溃必须保留
android {
signingConfigs {
create("release") {
storeFile = file("release.keystore")
storePassword = System.getenv("STORE_PASSWORD")
keyAlias = System.getenv("KEY_ALIAS")
keyPassword = System.getenv("KEY_PASSWORD")
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true
isShrinkResources = true
}
}
}
# 仅示例:放行反射和序列化常用项
-keepattributes Signature,*Annotation*
-keep class kotlinx.serialization.** { *; }
-keep class com.google.gson.** { *; }
⚡ 性能优化与诊断 >>>
先优化构建输入,再开并行与缓存;最后用 profile、build scan、依赖树定位瓶颈。
org.gradle.caching=true:开启本地构建缓存org.gradle.parallel=true:多模块并行org.gradle.configuration-cache=true:兼容时优先开启org.gradle.jvmargs=:给 Daemon 足够堆内存--profile:生成 HTML 性能报告--stacktrace --info:定位失败原因
# gradle.properties
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=1g -Dfile.encoding=UTF-8
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configuration-cache=true
android.useAndroidX=true
# 生成构建性能报告
./gradlew :app:assembleDebug --profile
# 看哪个任务拖慢构建
./gradlew :app:assembleDebug --scan
# 排查依赖冲突
./gradlew :app:dependencyInsight --dependency okhttp --configuration debugRuntimeClasspath
🩺 常见坑与排障 >>>
先判断是版本兼容问题、缓存问题、仓库问题还是签名 / SDK 配置问题,再决定清理范围。
Unsupported class file major version:JDK 太新或太旧,先查 AGP 支持范围Namespace not specified namespace:AGP 8+ 模块缺少SDK location not found local.properties:缺 或环境变量未配置Duplicate class Duplicate resources packaging:先看依赖冲突,再看Could not resolve:仓库缺失、离线模式、代理或镜像问题Configuration cache:某些旧插件还不兼容,先临时关闭验证
# 最小化清理:优先清本模块
./gradlew :app:clean
# 彻底重建依赖缓存(代价大)
./gradlew --refresh-dependencies assembleDebug
# 排查配置阶段问题
./gradlew help --stacktrace --info