美文网首页
优化使用kotlin开发Android app的编译速度

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

作者: Android高级工程师 | 来源:发表于2019-05-10 17:35 被阅读0次

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

    优化之前和之后的对比

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

    image.png

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


    image.png

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

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

    image.png

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

    image.png
    image.png

    优化步骤:

    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

    优化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才使用正常的版本号。然后还有一个就是使用依赖版本的时候,尽量不要使用+号的版本依赖,使用固定版本号速度会更快。

    喜欢点击+关注哦

    相关文章

      网友评论

          本文标题:优化使用kotlin开发Android app的编译速度

          本文链接:https://www.haomeiwen.com/subject/ebxzoqtx.html