项目编译特慢问题排查
一、背景
不知道从什么时候开始,项目编译特别慢,一行代码不改都要编译很久。快则四五分钟,慢则七八分钟。刚开始以为是项目组件多导致的,所以没有在意。后面有个另外的项目的组件更多,却不会那么慢。这样才开始重视这个问题。
二、排查思路
执行gradle assembleDebug --profile,生成整个task执行的耗时明细。
Task | Duration | Result |
---|---|---|
:minemodule | 2m25.11s | (total) |
:minemodule:compileDebugKotlin | 59.909s | |
:minemodule:kaptGenerateStubsDebugKotlin | 39.952s | |
:minemodule:kaptDebugKotlin | 30.981s | |
:minemodule:compileDebugJavaWithJavac | 13.303s |
发现每个模块的代码几乎都重新编译了。
-
猜想1:缓存未生效
于是加了很多编译优化参数。然被卵用不大。
org.gradle.daemon=true org.gradle.parallel=true org.gradle.configureondemand=true org.gradle.caching=true gradle=build -x lint -x lintVitalRelease kotlin.incremental=true kotlin.incremental.java=true kotlin.incremental.js=true kotlin.caching.enabled=true kapt.incremental.apt=true kapt.use.worker.api=true kotlin.parallel.tasks.in.project=true kapt.include.compile.classpath=false
-
猜想2:有自定义的task在每次build前删掉了build文件夹下的内容。通过观察,但是并没有。
-
猜想3:有人在离职的时候故意提交了私货。通过查看项目的gradle配置,并没有可疑的提交。
于是只能分析gradle的编译流程了。通过观察日志,发现一行代码不改,都会导致所有的模块的代码重新编译。那必然是一个公用的东西变了。
-
猜想4:common的代码发生了变化。手写的代码肯定没变,变的肯定是自动生成的代码。于是看了一眼common的gradle配置。
defaultConfig { buildConfigField "long", "packTime", "${packTime}" } packTime =System.currentTimeSeconds()
结论: 每次打包都有重新生成BuildConfig.packTime,导致common模块代码变化,common一变,所有依赖common的模块都需要重新编译。引发连锁反应。
三、解决方案
buildTypes {
release {
buildConfigField "long", "packTime", "${packTime}"
}
// 开发用
debug {
buildConfigField "long", "packTime", "1"
}
}
所以不要在BuildConfig中配置每次编译都会变的内容。