Gradle 有哪些常用命令?构建速度慢怎么优化?
Gradle 是 Android 和 Java 生态的主流构建工具,掌握它的常用命令和构建优化手段是开发者的基本功,也是面试高频考点。
最常用的构建命令
日常开发中,这几个命令用得最多:
bash# 编译并打包项目 ./gradlew build # 清理上次构建产物后重新构建 ./gradlew clean build # 跳过测试加快构建 ./gradlew build -x test # 只构建 Debug 变体(Android 项目) ./gradlew assembleDebug # 只构建 Release 变体 ./gradlew assembleRelease
build 会执行编译、测试、打包全流程。如果只想产出 APK/AAB,用 assembleDebug 或 assembleRelease 更快,因为跳过了测试和校验步骤。
依赖查看与分析
依赖冲突是 Gradle 项目最常见的坑,这几个命令能帮你定位问题:
bash# 查看项目完整依赖树 ./gradlew dependencies # 只看某个配置的依赖(如 implementation) ./gradlew dependencies --configuration implementation # 查看特定模块的依赖 ./gradlew :app:dependencies # 深入分析某个依赖的来源 ./gradlew dependencyInsight --dependency gson
dependencyInsight 比 dependencies 更实用——它直接告诉你某个库是从哪条路径引入的,在排查版本冲突时效率很高。
任务查看与调试
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 中配置:
propertiesorg.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
永久配置:
propertiesorg.gradle.configuration-cache=true
迁移阶段建议先用 warn 模式:
propertiesorg.gradle.configuration-cache=warn
这样构建不会中断,但会在日志里提示哪些代码需要修改才能兼容。Gradle 9.0 已将配置缓存作为默认行为。
4. 启用按需配置
只配置当前任务涉及的模块,跳过无关模块的配置阶段:
propertiesorg.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 中开启以下优化:
groovyandroid { // 只构建当前变体,跳过其他变体 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即可。