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

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

优化以前和以后的对比

在优化以前咱们的一次完整编译时间是2分21秒java

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

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

优化以后的完整编译时间31sapi

优化以后的增量编译时间15s缓存

优化步骤:

1.优化gradle配置:

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

//开启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的增量编译。app

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

2.优化app的build.gradle

1.在项目的app目录中的build.gradle文件中修改: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~

参考资料:

developer.android.com/studio/buil…

www.kotlincn.net/docs/refere…

blog.jetbrains.com/kotlin/2019…

Everything 把记帐本日记本,行程,待办等等都装进一个App里。

everythings.app/

相关文章
相关标签/搜索