编译速度优化实战
场景
项目模块化后有 50+ module,全量编译超过 8 分钟,增量编译也要 2 分钟以上。
排查与方案
1. 定位瓶颈
# 生成构建耗时报告
./gradlew assembleDebug --scan
# 或本地分析
./gradlew assembleDebug --profile
# 报告在 build/reports/profile/
| 常见瓶颈 | 排查 |
|---|---|
| kapt 注解处理 | --scan 中 kapt task 耗时 |
| 未命中缓存 | cache miss 率高 |
| 串行执行 | --parallel 未开启 |
| 冗余 task | 资源合并、Lint 检查 |
2. 优化方案
| 方案 | 预期效果 | 说明 |
|---|---|---|
| kapt → KSP | ⭐⭐⭐ | KSP 比 kapt 快 2-3 倍 |
| 开启 Configuration Cache | ⭐⭐⭐ | 跳过配置阶段 |
| 开启 Build Cache | ⭐⭐ | 复用 task 输出 |
| 并行编译 | ⭐⭐ | org.gradle.parallel=true |
| 增大 JVM 堆内存 | ⭐ | org.gradle.jvmargs=-Xmx4g |
| 开发时跳过不必要的 task | ⭐⭐ | 跳过 Lint、跳过无用 flavor |
# gradle.properties 推荐配置
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configuration-cache=true
org.gradle.jvmargs=-Xmx4g -XX:+UseParallelGC
// build.gradle.kts — kapt 迁移到 KSP
plugins {
// id("kotlin-kapt") // 去掉
id("com.google.devtools.ksp") version "2.0.0-1.0.21"
}
dependencies {
// kapt("com.google.dagger:hilt-compiler:2.51") // 去掉
ksp("com.google.dagger:hilt-compiler:2.51") // 改 KSP
}
3. 开发效率提升
// 开发时只编译当前需要的 flavor
android {
if (isDevBuild()) { // 通过环境变量判断
flavorDimensions += "env"
productFlavors {
create("dev") { /* ... */ }
}
}
}
面试答题要点
- 先用
--scan或--profile找到最慢的 task - kapt → KSP 是最有效的单一优化
- Configuration Cache 是 Gradle 8+ 的重要特性
- 给出优化前后的具体编译时间对比