优化使用kotlin开发Android app的编译速度

本文主要介绍了如何优化使用Kotlin开发Android应用的编译速度,包括优化gradle配置,启用缓存和增量编译,更新kapt版本,以及在app的build.gradle文件中进行调整,如固定版本号和避免使用'+'号依赖。通过这些步骤,成功将完整编译时间从2分21秒降低到31秒,增量编译时间减至15秒。

团队使用kotlin挺长时间了,一直以来都不太满意kotlin的编译速度,但是也能忍受。最近开了一个新项目,有不少同事从java过来的,他们就实在是受不了,优化编译速度就变得很重要了。

优化之前和之后的对比

在优化之前我们的一次完整编译时间是2分21秒

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

可以看到具体的耗时任务如上,主要是kapt相关的编译和编译kotlin代码,以及最后的transformClassedWithXXX。

优化之后的完整编译时间31s

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

优化步骤:

1.优化gradle配置:

在项目根目录创建一个gradle.properties文件

//开启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  //并行运行kapt1.2.60版本以上支持
kapt.incremental.apt=true  //增量编译 kapt1.3.30版本以上支持
kapt.include.compile.classpath=false  //kapt avoiding 如果用kapt依赖的内容没有变化,会完全重用编译内容,省掉最上图中的:app:kaptGenerateStubsDebugKotlin的时间

在上面的配置中,我们首先调整了gradle的配置,然后开启了缓存和kotlin和kapt的增量编译。

如果项目中使用了kapt请使用最新版本的kapt,当前写该文章时kapt的最新版本为1.3.31

2.优化app的build.gradle

1.在项目的app目录中的build.gradle文件中修改:

//如果有用到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 "1.0.0"
    ...
}
applicationVariants.all { variant ->
    ...
    if (variant.buildType.name == "release") {
        versionName = currentName()
        versionCode = gitVersionCode()
    }
    ...
}

以前我们的配置上versionCode是使用的git的提交次数作为版本号的,在本地debug状态的时候其实最好是写死版本号,如果版本号变化会导致需要重新生成Manifest文件以及完整的编译应用,导致InstantRun无法使用(PS其实我们一直没用InstantRun)。所以修改为写死版本号,然后在applicationVariants中判断如果是release才使用正常的版本号。然后还有一个就是使用依赖版本的时候,尽量不要使用+号的版本依赖,使用固定版本号速度会更快。

希望大家省下的编译时间,能够好好陪陪家人。 enjoy~

最后

为了让大家更好的去学习和提升自己,我和几位大佬一起收录整理的 Flutter进阶资料以及Android学习PDF+架构视频+面试文档+源码笔记 ,并且还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料……

这些都是我闲暇时还会反复翻阅的精品资料。可以有效的帮助大家掌握知识、理解原理。当然你也可以拿去查漏补缺,提升自身的竞争力。
如果你有需要的话,可以前往 GitHub 自行查阅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值