作者:炸雞叔
博客:https://juejin.im/post/5cd133af6fb9a0323a01ca84
團隊使用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 avoiding 如果用kapt依賴的內容沒有變化,會完全重用編譯內容,省掉最上圖中的:app:kaptGenerateStubsDebugKotlin的時間
kapt.include.compile.classpath=false
在上面的配置中,我們首先調整了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~
最後
資料領取:點贊+加羣免費獲取 騰訊@Android高級架構
加羣 騰訊@Android高級架構領取獲取往期Android高級架構資料、源碼、筆記、視頻。高級UI、性能優化、架構師課程、NDK、混合式開發(ReactNative+Weex)微信小程序、Flutter全方面的Android進階實踐技術,羣內還有技術大牛一起討論交流解決問題。