優化使用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/

相關文章
相關標籤/搜索