一、前言
Android Gradle 构建过程中会遇到各种错误,这些错误可能涉及配置、依赖、编译、资源等多个方面。本文将系统性地总结常见的构建错误,并提供详细的解决方法。
二、基础环境配置错误
2.1 Gradle 版本不兼容
错误信息:
Minimum supported Gradle version is X.X.X. Current version is Y.Y.Y.
解决方法:
- 更新 Gradle 版本
properties
# gradle/wrapper/gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip
- 检查 AGP 与 Gradle 兼容性
| AGP 版本 | 最小 Gradle 版本 | 推荐 Gradle 版本 |
|---|---|---|
| 8.0+ | 8.1 | 8.7 |
| 7.4+ | 7.5 | 8.2 |
| 7.0+ | 7.3 | 7.6 |
| 4.2+ | 6.7.1 | 7.5 |
2.2 Java 版本不匹配
错误信息:
> Could not target platform: 'Java SE 17' using tool chain: 'JDK 8'
解决方法:
gradle
// app/build.gradle
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
}
检查 JDK 配置:
bash
# 查看当前 JDK 版本
./gradlew -version
# 在 Android Studio 中设置
# File → Project Structure → SDK Location → JDK Location
三、依赖相关错误
3.1 依赖冲突
错误信息:
Conflict with dependency 'com.google.code.gson:gson'
解决方法:
gradle
// 1. 查看依赖树找出冲突
./gradlew app:dependencies --configuration releaseRuntimeClasspath
// 2. 强制使用特定版本
configurations.all {
resolutionStrategy {
force 'com.google.code.gson:gson:2.10.1'
// 排除特定依赖
dependencySubstitution {
substitute(module("com.google.guava:guava"))
.using(module("com.google.guava:guava:33.0.0-jre"))
}
}
}
// 3. 排除特定传递依赖
dependencies {
implementation('com.example:library:1.0.0') {
exclude group: 'com.google.code.gson', module: 'gson'
exclude group: 'com.android.support'
transitive = false // 禁止传递依赖
}
}
3.2 依赖下载失败
错误信息:
> Could not resolve all dependencies
> Could not download xxx.jar
解决方法:
gradle
// 1. 添加镜像源
buildscript {
repositories {
// 阿里云镜像
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/central' }
google()
mavenCentral()
}
}
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/google' }
// 其他备用仓库
maven { url 'https://jitpack.io' }
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
}
}
// 2. 配置网络代理
// gradle.properties
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=1080
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=1080
// 3. 离线模式
./gradlew build --offline
3.3 依赖找不到
错误信息:
> Could not find com.example:library:1.0.0
解决方法:
gradle
// 1. 检查仓库配置
repositories {
google()
mavenCentral()
// 确保包含正确的 Maven 仓库
maven {
url = uri("https://custom.repository.com/releases")
// 如果需要认证
credentials {
username = project.findProperty("mavenUser") ?: ""
password = project.findProperty("mavenPassword") ?: ""
}
}
}
// 2. 清除缓存重新下载
./gradlew cleanBuildCache
./gradlew --refresh-dependencies
// 3. 检查依赖坐标是否正确
dependencies {
// 正确格式:group:name:version
implementation 'androidx.core:core-ktx:1.12.0'
// 使用变量
def lifecycle_version = "2.7.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
}
四、编译错误
4.1 Java/Kotlin 版本错误
错误信息:
> error: Source option 7 is no longer supported. Use 8 or later
解决方法:
gradle
android {
compileOptions {
// 设置为 Java 8 或更高
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
// 启用核心库去糖
isCoreLibraryDesugaringEnabled = true
}
kotlinOptions {
jvmTarget = '17'
freeCompilerArgs += [
"-Xjvm-default=all",
"-opt-in=kotlin.RequiresOptIn"
]
}
}
dependencies {
// Java 8+ 特性支持
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}
4.2 重复类/资源错误
错误信息:
> Duplicate class com.example.Foo found
> Duplicate resources
解决方法:
gradle
// 1. 排除重复类
android {
packagingOptions {
resources {
excludes += [
'META-INF/DEPENDENCIES',
'META-INF/*.kotlin_module',
'META-INF/LICENSE*',
'META-INF/NOTICE*',
'META-INF/AL2.0',
'META-INF/LGPL2.1',
'**/*.kotlin_builtins',
'**/*.kotlin_module'
]
// 合并重复资源
pickFirsts += [
'lib/armeabi-v7a/libnative-lib.so',
'lib/arm64-v8a/libnative-lib.so'
]
// 合并重复的 AndroidManifest
merge '**/AndroidManifest.xml'
}
}
}
// 2. 使用 R8/ProGuard 优化
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
4.3 资源编译错误
错误信息:
> AAPT: error: resource android:attr/lStar not found
解决方法:
gradle
// 1. 更新编译 SDK 和依赖版本
android {
compileSdk 34
compileSdkExtension 4
defaultConfig {
minSdk 24
targetSdk 34
}
}
dependencies {
// 更新支持库
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'com.google.android.material:material:1.11.0'
// 使用最新稳定版
constraints {
implementation("androidx.core:core-ktx") {
version {
strictly "1.12.0"
}
}
}
}
// 2. 禁用 AAPT2 缓存
// gradle.properties
android.enableAapt2=false
五、DSL 配置错误
5.1 过时的 API 使用
错误信息:
> The option 'android.useNewApkCreator' is deprecated
解决方法:
gradle
// 1. 移除过时配置
// 删除 gradle.properties 中的:
// android.useNewApkCreator=true
// android.useDeprecatedNdk=true
// 2. 更新配置语法
android {
// 旧语法(已废弃)
// compileSdkVersion 33
// buildToolsVersion "33.0.0"
// 新语法
compileSdk 33
defaultConfig {
// 旧语法
// targetSdkVersion 33
// minSdkVersion 21
// 新语法
targetSdk 33
minSdk 24
}
// 构建特性配置
buildFeatures {
viewBinding true
dataBinding true
buildConfig true
aidl true
renderScript false
}
}
// 3. 使用新的依赖配置
dependencies {
// 旧语法(已废弃)
// compile 'com.android.support:appcompat-v7:28.0.0'
// api 'com.example:lib:1.0.0'
// 新语法
implementation 'androidx.appcompat:appcompat:1.6.1'
// 替代 compile
implementation 'com.example:lib:1.0.0'
// 替代 provided/compileOnly
compileOnly 'javax.annotation:jsr250-api:1.0'
// 替代 apk/runtimeOnly
runtimeOnly 'com.google.auto.value:auto-value:1.10.4'
}
5.2 命名空间错误
错误信息:
> Namespace not specified. Specify a namespace
解决方法:
gradle
// AGP 8.0+ 必须指定 namespace
android {
namespace 'com.example.myapplication'
// 或者为 library 指定
// namespace 'com.example.mylibrary'
}
// 对于多模块项目
// app/build.gradle
android {
namespace 'com.example.app'
}
// feature/build.gradle
android {
namespace 'com.example.feature'
}
// 确保包名一致性
defaultConfig {
applicationId "com.example.app" // 与 namespace 一致
}
六、Kotlin 相关错误
6.1 Kotlin 版本冲突
错误信息:
> e: Incompatible classes were found in dependencies
解决方法:
gradle
// 1. 统一 Kotlin 版本
buildscript {
ext.kotlin_version = '1.9.24'
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
// 所有模块使用相同版本
plugins {
id 'org.jetbrains.kotlin.android' version '1.9.24' apply false
}
// 2. 检查依赖的 Kotlin 版本
configurations.all {
resolutionStrategy.eachDependency { details ->
if (details.requested.group == 'org.jetbrains.kotlin') {
details.useVersion '1.9.24'
}
}
}
// 3. 更新 Kotlin 编译器选项
kotlinOptions {
jvmTarget = '17'
freeCompilerArgs += [
'-Xjvm-default=all',
'-opt-in=kotlin.RequiresOptIn',
'-Xcontext-receivers',
'-Xskip-prerelease-check'
]
}
6.2 KAPT/KSP 错误
错误信息:
> kapt: Incremental annotation processing requested
解决方法:
gradle
// 1. 启用增量注解处理
kapt {
useBuildCache = true
correctErrorTypes = true
// 启用增量处理
javacOptions {
option("-Xmaxerrs", 1000)
}
// 配置注解处理器参数
arguments {
arg("room.schemaLocation", "$projectDir/schemas")
arg("room.incremental", "true")
arg("room.expandProjection", "true")
}
}
// 2. 或者使用 KSP 替代 KAPT
plugins {
id 'com.google.devtools.ksp' version '1.9.24-1.0.20'
}
dependencies {
// 使用 KSP
ksp "androidx.room:room-compiler:2.6.1"
ksp "com.google.dagger:hilt-android-compiler:2.50"
}
// 3. 配置 KSP
ksp {
arg("room.generateKotlin", "true")
arg("room.incremental", "true")
}
七、签名和打包错误
7.1 签名配置错误
错误信息:
> Failed to read key from keystore
解决方法:
gradle
// 1. 正确的签名配置
android {
signingConfigs {
debug {
storeFile file("debug.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
release {
storeFile file("release.jks")
// 从环境变量读取(推荐)
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
// 或者从 local.properties
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
storePassword properties.getProperty('storePassword')
keyAlias properties.getProperty('keyAlias')
keyPassword properties.getProperty('keyPassword')
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
}
}
}
// 2. 验证 keystore
keytool -list -v -keystore release.jks
7.2 多 APK/AAB 错误
错误信息:
> More than one file was found with OS independent path
解决方法:
gradle
android {
packagingOptions {
resources {
// 排除重复文件
excludes += [
'META-INF/*.kotlin_module',
'META-INF/*.version',
'META-INF/proguard/*',
'META-INF/services/*',
'**/*.proto',
'**/*.version'
]
// 选择第一个匹配的文件
pickFirsts += [
'lib/armeabi-v7a/libc++_shared.so',
'lib/arm64-v8a/libc++_shared.so',
'lib/x86/libc++_shared.so',
'lib/x86_64/libc++_shared.so'
]
// 合并重复文件
merge '**/R.txt'
merge '**/R.class'
}
// 针对 AAB
bundle {
language {
enableSplit = true
}
density {
enableSplit = true
}
abi {
enableSplit = true
}
}
}
}
八、缓存和清理问题
8.1 构建缓存问题
错误信息:
> Unexpected lock protocol found in lock file
解决方法:
bash
# 1. 清理所有缓存
./gradlew clean
./gradlew cleanBuildCache
./gradlew --stop
# 2. 删除 Gradle 缓存目录
# Windows: %USERPROFILE%\.gradle\caches
# macOS/Linux: ~/.gradle/caches
rm -rf ~/.gradle/caches/
# 3. 删除项目缓存
rm -rf .gradle/
rm -rf build/
rm -rf app/build/
# 4. 刷新依赖
./gradlew --refresh-dependencies
# 5. 使用离线模式(如果网络有问题)
./gradlew build --offline
8.2 增量编译问题
错误信息:
> Unexpected compilation result
解决方法:
gradle
// 1. 禁用增量编译
// gradle.properties
# android.enableSeparateAnnotationProcessing=true
# kotlin.incremental=false
// 2. 清理并重建
./gradlew clean assembleDebug
// 3. 启用构建缓存
// gradle.properties
org.gradle.caching=true
android.enableBuildCache=true
android.buildCacheDir=build-cache
// 4. 配置 Kotlin 增量编译
kotlin {
sourceSets.all {
languageSettings {
languageVersion = "2.0"
}
}
}
九、性能优化配置
9.1 加速构建配置
properties
# gradle.properties
# 内存配置
org.gradle.jvmargs=-Xmx8192m -XX:MaxMetaspaceSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# 并行构建
org.gradle.parallel=true
org.gradle.parallel.threads=8
# 配置按需
org.gradle.configureondemand=true
# 启用守护进程
org.gradle.daemon=true
org.gradle.daemon.idletimeout=3600000
# 构建缓存
org.gradle.caching=true
android.enableBuildCache=true
android.buildCacheDir=build-cache
# 非传递 R 类
android.nonTransitiveRClass=true
# 禁用 PNG 压缩
android.enableAapt2=false
# 资源分片
android.enableResourceShrinking=true
android.shrinkResources=true
9.2 模块化优化
gradle
// 根目录 build.gradle
allprojects {
afterEvaluate { project ->
if (project.plugins.hasPlugin('com.android.application') ||
project.plugins.hasPlugin('com.android.library')) {
android {
// 统一配置
compileSdk 34
defaultConfig {
minSdk 24
targetSdk 34
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
// 启用构建缓存
buildCache {
local {
enabled = true
directory = new File(rootDir, 'build-cache')
}
}
}
}
}
}
十、调试和诊断技巧
10.1 诊断命令
bash
# 查看详细错误
./gradlew build --stacktrace
./gradlew build --info
./gradlew build --debug
# 查看依赖树
./gradlew app:dependencies
./gradlew app:dependencies --configuration implementation
./gradlew app:dependencies --configuration debugRuntimeClasspath
# 查看任务
./gradlew tasks
./gradlew tasks --all
# 构建扫描
./gradlew build --scan
# 清理缓存
./gradlew clean
./gradlew cleanBuildCache
10.2 常见诊断代码
gradle
// 调试脚本
task printConfigurations {
doLast {
configurations.each { configuration ->
println "Configuration: ${configuration.name}"
if (configuration.canBeResolved) {
try {
configuration.files.each { file ->
println " - ${file.name}"
}
} catch (Exception e) {
println " Cannot resolve: ${e.message}"
}
}
}
}
}
// 检查依赖版本
task checkDependencies {
doLast {
configurations.compileClasspath.resolvedConfiguration
.resolvedArtifacts.each { artifact ->
println "${artifact.moduleVersion.id}"
}
}
}
十一、总结表格
| 错误类型 | 常见错误信息 | 解决方法 |
|---|---|---|
| 版本不兼容 | Minimum supported Gradle version | 更新 gradle-wrapper.properties |
| 依赖冲突 | Conflict with dependency | 使用 resolutionStrategy.force |
| 编译错误 | Source option X is no longer supported | 更新 Java 版本到 17 |
| 资源错误 | AAPT: error: resource not found | 更新 compileSdk 和依赖版本 |
| 命名空间 | Namespace not specified | 添加 namespace 属性 |
| 签名错误 | Failed to read key from keystore | 检查签名配置和环境变量 |
| 缓存问题 | Unexpected lock protocol | 清理 .gradle 和 build 目录 |
十二、最佳实践
- 保持更新:定期更新 AGP、Gradle 和依赖版本
- 统一版本:使用版本目录统一管理依赖版本
- 使用镜像:配置国内镜像源加速下载
- 环境变量:敏感信息使用环境变量或 local.properties
- 增量构建:合理配置构建缓存和增量编译
- 模块化:合理拆分模块,减少重复编译
- 监控分析:使用 build scan 分析构建性能
记住:遇到问题先清理缓存,查看详细日志,再根据具体错误信息寻找解决方案。大多数构建问题都可以通过仔细阅读错误信息和合理的调试步骤解决。