项目编译特慢问题排查

项目编译特慢问题排查

一、背景

不知道从什么时候开始,项目编译特别慢,一行代码不改都要编译很久。快则四五分钟,慢则七八分钟。刚开始以为是项目组件多导致的,所以没有在意。后面有个另外的项目的组件更多,却不会那么慢。这样才开始重视这个问题。

二、排查思路

执行gradle assembleDebug --profile,生成整个task执行的耗时明细。

TaskDurationResult
:minemodule2m25.11s(total)
:minemodule:compileDebugKotlin59.909s
:minemodule:kaptGenerateStubsDebugKotlin39.952s
:minemodule:kaptDebugKotlin30.981s
:minemodule:compileDebugJavaWithJavac13.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中配置每次编译都会变的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值