跳到主要内容

编译速度优化实战

场景

项目模块化后有 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") { /* ... */ }
}
}
}

面试答题要点

  1. 先用 --scan--profile 找到最慢的 task
  2. kapt → KSP 是最有效的单一优化
  3. Configuration Cache 是 Gradle 8+ 的重要特性
  4. 给出优化前后的具体编译时间对比

相关链接