5月27日 23:30

Gradle 有哪些常用命令?构建速度慢怎么优化?

Gradle 是 Android 和 Java 生态的主流构建工具,掌握它的常用命令和构建优化手段是开发者的基本功,也是面试高频考点。

最常用的构建命令

日常开发中,这几个命令用得最多:

bash
# 编译并打包项目 ./gradlew build # 清理上次构建产物后重新构建 ./gradlew clean build # 跳过测试加快构建 ./gradlew build -x test # 只构建 Debug 变体(Android 项目) ./gradlew assembleDebug # 只构建 Release 变体 ./gradlew assembleRelease

build 会执行编译、测试、打包全流程。如果只想产出 APK/AAB,用 assembleDebugassembleRelease 更快,因为跳过了测试和校验步骤。

依赖查看与分析

依赖冲突是 Gradle 项目最常见的坑,这几个命令能帮你定位问题:

bash
# 查看项目完整依赖树 ./gradlew dependencies # 只看某个配置的依赖(如 implementation) ./gradlew dependencies --configuration implementation # 查看特定模块的依赖 ./gradlew :app:dependencies # 深入分析某个依赖的来源 ./gradlew dependencyInsight --dependency gson

dependencyInsightdependencies 更实用——它直接告诉你某个库是从哪条路径引入的,在排查版本冲突时效率很高。

任务查看与调试

bash
# 列出所有可用任务 ./gradlew tasks # 包括隐藏任务在内全部列出 ./gradlew tasks --all # 预览任务执行顺序但不真正执行 ./gradlew build --dry-run # 强制重新执行所有任务(忽略缓存) ./gradlew build --rerun-tasks # 查看项目结构 ./gradlew projects # 查看项目属性 ./gradlew properties

--dry-run 在排查任务依赖关系时很有用,能看到哪些任务会被触发但不会真的执行。

构建优化:为什么构建这么慢?

Gradle 构建慢,根本原因通常有三个:配置阶段重复执行、任务没有利用缓存、多模块没有并行。下面逐个解决。

1. 启用构建缓存

构建缓存让 Gradle 跳过输入未变化的任务,直接复用上次的输出:

bash
# 命令行临时启用 ./gradlew build --build-cache

永久生效,在 gradle.properties 中配置:

properties
org.gradle.caching=true

原理:每个任务根据输入内容的哈希值生成缓存键,输入没变就直接取缓存结果。修改一行代码不会导致整个项目重新编译。

2. 启用并行执行

多模块项目默认串行构建,开启并行后独立模块可以同时编译:

properties
# gradle.properties org.gradle.parallel=true # 控制最大并行线程数(默认等于 CPU 核心数) org.gradle.workers.max=4

命令行方式:

bash
./gradlew build --parallel --max-workers=4

注意:只有模块间没有依赖关系的任务才能并行。如果你的模块是线性的依赖链,并行效果有限。

3. 启用配置缓存

这是 Gradle 8.x 之后最重要的优化。正常每次构建都要执行配置阶段(解析 build.gradle),配置缓存可以在构建脚本没变时直接跳过这一步:

bash
# 首次尝试启用(会报告不兼容的地方) ./gradlew build --configuration-cache

永久配置:

properties
org.gradle.configuration-cache=true

迁移阶段建议先用 warn 模式:

properties
org.gradle.configuration-cache=warn

这样构建不会中断,但会在日志里提示哪些代码需要修改才能兼容。Gradle 9.0 已将配置缓存作为默认行为。

4. 启用按需配置

只配置当前任务涉及的模块,跳过无关模块的配置阶段:

properties
org.gradle.configureondemand=true

对大型多模块项目(10+ 模块)效果显著,小项目差别不大。

5. 调整 JVM 内存

Gradle 本身跑在 JVM 上,默认内存可能不够:

properties
# gradle.properties org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m -XX:+UseParallelGC
  • -Xmx4096m:堆内存,大型项目建议 4GB 以上
  • -XX:MaxMetaspaceSize=1024m:类元数据空间,避免 Metaspace OOM
  • -XX:+UseParallelGC:并行垃圾回收,降低 GC 暂停

6. 利用 Gradle Daemon

Daemon 是常驻后台的 Gradle 进程,避免每次构建都启动新 JVM:

bash
# Daemon 默认已启用,确认状态 ./gradlew --status # 停止所有 Daemon(出问题时重启) ./gradlew --stop

Daemon 默认就是开启的,不需要额外配置。如果构建行为异常,先试试 --stop 重启 Daemon。

诊断构建瓶颈

优化之前先定位瓶颈在哪里:

bash
# 生成构建性能报告(HTML) ./gradlew build --profile # 生成更详细的 Build Scan(上传到 Gradle 服务器) ./gradlew build --scan

--profile 会在 build/reports/profile/ 下生成 HTML 报告,按耗时排列各阶段和任务,一眼就能看出哪个任务最耗时。

--scan 生成更全面的 Build Scan,包含依赖解析时间、缓存命中率和配置阶段耗时,适合深度排查。

一份推荐的 gradle.properties 配置

把上面的优化汇总成一份配置,直接复制到项目根目录的 gradle.properties

properties
# 并行构建 org.gradle.parallel=true # 构建缓存 org.gradle.caching=true # 配置缓存(迁移阶段用 warn) org.gradle.configuration-cache=true # 按需配置 org.gradle.configureondemand=true # JVM 内存和 GC 优化 org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m -XX:+UseParallelGC # 非 Android 项目可选:开启文件系统监视(加速增量构建) org.gradle.vfs.watch=true

对于 Android 项目,还可以在 build.gradle 中开启以下优化:

groovy
android { // 只构建当前变体,跳过其他变体 variants.all { variant -> if (variant.name != 'debug') { variant.ignore = true } } }

常见构建问题与排查命令

bash
# 依赖冲突:查看某个库的所有引入路径 ./gradlew dependencyInsight --dependency 'com.google.code.gson:gson' # 构建失败:查看完整堆栈 ./gradlew build --stacktrace # 更详细的调试信息 ./gradlew build --info # 强制刷新依赖(解决缓存损坏) ./gradlew build --refresh-dependencies # 离线构建(只用本地缓存,不访问远程仓库) ./gradlew build --offline # 持续构建模式(文件变化后自动重新构建) ./gradlew build --continuous

面试追问方向

  • 配置缓存和构建缓存有什么区别? 配置缓存跳过配置阶段(解析 build.gradle),构建缓存跳过执行阶段(任务的输入输出哈希匹配)。两者作用在不同阶段,互不冲突,可以同时开启。
  • 并行执行有什么限制? 只有不存在依赖关系的任务才能并行。如果模块 A 依赖模块 B,B 必须先完成。串行依赖链越长,并行收益越低。
  • Gradle Daemon 会不会导致内存泄漏? 长时间运行的 Daemon 确实可能积累内存,Gradle 会在闲置 3 小时后自动停止 Daemon。如果遇到问题,手动 ./gradlew --stop 即可。
标签:Gradle