kotlin 编译速度优化,省下时间不再996
一直以来都不太满意 kotlin 的编译速度,但是也能忍受。最近开了一个新项目,有不少同事从 java 过来的,他们就实在是受不了,优化编译速度就变得很重要了。
优化之前和之后的对比
在优化之前我们的一次完整编译时间是 2 分 21 秒

具体的耗时任务在 Run Tasks 中:

可以看到具体的耗时任务如上,主要是 kapt 相关的编译和编译 kotlin 代码,以及最后的 transformClassedWithXXX。
优化之后的完整编译时间 31s

优化之后的增量编译时间 15s


优化步骤:
1.优化 gradle 配置:
在项目根目录创建一个 文件
- //开启gradle并行编译,开启daemon,调整jvm内存大小
- org.gradle.daemon=true
- org.gradle.configureondemand=true
- org.gradle.parallel=true
- org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
- //开启gradle缓存
- org.gradle.caching=true
- android.enableBuildCache=true
- //开启kotlin的增量和并行编译
- kotlin.incremental=true
- kotlin.incremental.java=true
- kotlin.incremental.js=true
- kotlin.caching.enabled=true
- kotlin.parallel.tasks.in.project=true //开启kotlin并行编译
- //优化kapt
- kapt.use.worker.api=true //并行运行版本以上支持
- kapt.incremental.apt=true //增量编译 版本以上支持
- kapt.include.compile.classpath=false //kapt avoiding 如果用kapt依赖的内容没有变化,会完全重用编译内容,省掉最上图中的:app:kaptGenerateStubsDebugKotlin的时间
在上面的配置中,我们首先调整了 gradle 的配置,然后开启了缓存和 kotlin 和 kapt 的增量编译。
如果项目中使用了 kapt 请使用最新版本的 kapt,当前写该文章时 kapt 的最新版本为 1.3.31
2.优化 app 的
1.在项目的 app 目录中的 文件中修改:
- //如果有用到kapt添加如下配置
- kapt {
- useBuildCache = true
- javacOptions {
- option("-Xmaxerrs", 500)
- }
- }
- //在Android代码块中添加如下配置:(可优化最上图中transformClassDexBuilderForDebug的时间)
- android {
- dexOptions {
- preDexLibraries true
- maxProcessCount 8
- }
- }
2.其他不太重要的优化,好像对时间影响不算特别大
优化版本号的配置,如果是 debug 版本不要使用动态版本号
- //原配置
- defaultConfig {
- ...
- minSdkVersion 19
- targetSdkVersion 28
- versionCode gitVersionCode()
- versionName currentName()
- ...
- }
- //修改为
- defaultConfig {
- ...
- minSdkVersion 19
- targetSdkVersion 28
- versionCode 1
- versionName ""
- ...
- }
- applicationVariants.all { variant ->
- ...
- if (variant.buildType.name == "release") {
- versionName = currentName()
- versionCode = gitVersionCode()
- }
- ...
- }
以前我们的配置上 versionCode 是使用的 git 的提交次数作为版本号的,在本地 debug 状态的时候其实最好是写死版本号,如果版本号变化会导致需要重新生成 Manifest 文件以及完整的编译应用,导致 InstantRun 无法使用(PS 其实我们一直没用InstantRun)。所以修改为写死版本号,然后在 applicationVariants 中判断如果是 release 才使用正常的版本号。然后还有一个就是使用依赖版本的时候,尽量不要使用+号的版本依赖,使用固定版本号速度会更快。
希望大家省下的编译时间,能够好好陪陪家人。 enjoy~
        THE END
    
        
        






