Android Studio 3.1 加速編譯速度
設定
更改studio的VM大小
Android Studio限制了Java虛擬機器啟動的記憶體大小,限制了最大堆記憶體,當Android Studio執行越久,記憶體越不足的時候,就會頻繁的觸發GC,Android Studio就自然會卡起來了,嚴重的直接黑屏,所以,我們把對應的所需記憶體都配置大一些,32位的系統開啟studio.exe.vmoptions檔案,如果是64位的話開啟studio64.exe.vmoptions,改動以下配置,根據各自配置適當調節。
-Xms1024m
-Xmx4096m
-XX:MaxPermSize=2048m
-XX:ReservedCodeCacheSize=1024m
優化配置:
1、gradle執行相關的配置 (gradle.properties檔案中)
The Gradle daemon aims to improve the startup and execution time of Gradle.
# When set to true the Gradle daemon is to run the build.
# TODO: disable daemon on CI, since builds should be clean and reliable on servers
org.gradle.daemon=true
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
org.gradle.jvmargs=-Xms1024m -Xmx2048m -XX:MaxPermSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
#http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
org.gradle.parallel=true
# Enables new incubating mode that makes Gradle selective when configuring projects.
# Only relevant projects are configured which results in faster builds for large multi-projects.
#http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand
org.gradle.configureondemand=true
2、啟用新一代Dex編譯器D8 (gradle.properties檔案中)
android.enableD8=true
3、啟用新一代資源編譯器aapt2 (增量資源處理) (gradle.properties檔案中)
android.enableAapt2=true
4、啟用構建快取 (gradle.properties檔案中)【如果工程是從2.2之前的版本升級上來的】
Build Cache: 2.2版本的時候,加入了編譯快取的功能。但是2.3正式版之前都是預設關閉的。你可以通過 android.enableBuildCache = true 來開啟這個功能。
2.3正式版開始將此功能轉成預設開啟的狀態。
為了不受版本更替的影響, 直接在專案根目錄下的gradle.properties檔案中新增下列配置:
#啟用並設定 構建快取 的目錄 (使用 `./gradlew cleanBuildCache` 指令清除cache內容)
android.enableBuildCache=true
android.buildCacheDir=buildCacheDir/
Build Cache預設的儲存目錄~/.android/build-cache. 為了方便管理(如, 快取過多時手動清除), 上述配置的第二行就自己指定了快取的儲存目錄
關於更多Build Cache的內容請參考官方說明: https://developer.android.com/studio/build/build-cache.html
如果無法訪問請看這裡: https://developer.android.google.cn/studio/build/build-cache.html
5、啟用gradle快取 (gradle.properties檔案中)
org.gradle.caching=true
6、禁用PNG圖片優化處理 (禁止Png Cruncher優化)
a. 在Root Project的build.gradle檔案中新增下面一個函式, 來判斷是否是打debug包, 如下:
//是否是執行Debug相關task (通用函式, 可供子module呼叫)
def isDebug() {
def taskNames = gradle.startParameter.taskNames
for (tn in taskNames) {
if( (tn.contains("install") || tn.contains("assemble")) && tn.contains("Debug")) {
return true
}
}
return false
}
b. 在主module的build.gradle檔案中的android {}塊中新增下面配置:
android {
// 其他配置省略 ...
//如果是構建debug包, 則禁用 "png cruncher" (預設cruncherEnabled=true, 禁用以加速構建)
def enableCruncher = { ->
return !isDebug()
}
aaptOptions { //禁用cruncher, 以加速編譯
cruncherEnabled = enableCruncher()
cruncherProcesses = 0
}
}
7、Dex配置項優化
在主module的build.gradle的android {}語句塊中新增下面配置專案:
android {
// 其他配置省略 ...
dexOptions { //優化dex配置
dexInProcess true
preDexLibraries true
javaMaxHeapSize "2g"
}
}
8、其他配置項
在主module中的buildg.gradle檔案中新增如下配置:
android {
compileOptions {
incremental = true //開啟增量編譯
//其他程式碼省略 ...
}
buildTypes {
debug {
crunchPngs false //關閉crunchPng優化, 以加快構建
//其他程式碼省略 ...
}
}
//其他程式碼省略 ...
}
9、跳過Tests和Lint相關的Task
在主module的build.gradle檔案中的android {}程式碼塊中新增下面程式碼:
android {
//其他程式碼省略 ...
//跳過Lint和Test相關的task, 以加速編譯
if (isDebug()) {
gradle.taskGraph.whenReady {
tasks.each { task ->
if (task.name.contains("Test") || task.name.contains("Lint")) {
task.enabled = false
}
}
}
}
}
10、Dex的merge過程優化 (API Level 21, 即安卓5.0的優化配置)
隨著程式碼的日益積累, 我們安卓專案中的方法數目很容易就超過64K了, 這時候就需要分包, 即MultDex操作 (為什麼方法數不能超過64K呢? 什麼又是MultDex? 這些就說來話長了, 如果你還不瞭解這些, 請移步此處: https://developer.android.com/studio/build/multidex.html#about)
MultiDex主要是為了解決64K限制. Google給出的MultiDex解決方案分為兩個階段:
a. Android 5.0之前使用 Dalvik可執行檔案分包支援庫 來支援分包
b. Android 5.0即Android 5.0之後的版本內建支援MultiDex操作 (因此就不需要額外的支援庫啦, 只需要在gradle中簡單的配置一下)
兩種方法都會把dex分成多個, 但是前一分的dex更少, 內建的分包分的dex非常多. 下面是兩種分包方式打的包的dex切分情況:
minSdkVersion小於21時構建出來的apk包的dex切分情況如下:
minSdkVersion大於等於21時構建出來的apk包的dex切分情況如下:
具體優化邏輯就是:
如果不需要進行優, 則把minSdkVersion配成正常的支援版本(如14, 15 等); 而如果需要優化, 則把minSdkVersion配置成21(或大於21)
具體配置如下:
/**
* 預設構建會進行優化, 如果不需要優化, 則執行下列命令:
* ./gradlew assembleDebug -Pso=1
* 或者 (構建並安裝)
* ./gradlew installDebug -Pso=1
*/
def getMinSdkVersion() {
int is_skip_optimize = hasProperty("so") ? Integer.parseInt(so) : 0
//如果跳過優化 或 Release版本, 則minSdkVersion使用15; 否則使用21以便加快構建速度
if(is_skip_optimize == 1 || !isDebug()) {
return 15
} else {
return 21
}
}
android {
defaultConfig {
applicationId "com.stone.xxx"
minSdkVersion getMinSdkVersion() //此處的設定導致: 根據打包時傳入的引數決定是否進行優化
//其他配置省略 ...
}
}
兩種分包方式的具體配置請參考: https://developer.android.com/studio/build/multidex.html
11、Fabric相關優化
在Main Module的build.gradle中新增下面Fabric相關的程式碼來優化Fabric配置:
def getMinSdkVersion() {
int is_skip_optimize = hasProperty("so") ? Integer.parseInt(so) : 0
//如果跳過優化 或 Release版本, 則minSdkVersion使用15; 否則使用21以便加快構建速度
if(is_skip_optimize == 1 || !isDebug()) {
return 15
} else {
return 21
}
}
android {
buildTypes {
debug {
crunchPngs false //關閉crunchPng優化, 以加快構建
ext.alwaysUpdateBuildId = false
// enableCrashlytics = true 會影響編譯速度 (enableCrashlytics預設值為true)
// https://developer.android.com/studio/build/optimize-your-build.html#profile
if (getMinSdkVersion() == 21) {
ext.enableCrashlytics = false
buildConfigField "boolean", "USER_FABRIC", "false" //此變數用於是否初始化或呼叫Fabric
} else {
buildConfigField "boolean", "USER_FABRIC", "true" //此變數用於是否初始化或呼叫Fabric
}
}
}
//其他配置省略 ...
}
android官網給出的優化Fabric的配置如下:
官網優化相關配置:
https://developer.android.com/studio/build/optimize-your-build.html#profile
References
https://docs.fabric.io/android/crashlytics/build-tools.html
https://developer.android.com/studio/build/optimize-your-build.html#profile
https://developer.android.com/studio/build/multidex.html
https://developer.android.google.cn/studio/build/build-cache.html
https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties
https://developer.android.google.cn/studio/releases/index.html#preview-the-new-d8-dex-compiler
https://developer.android.com/studio/releases/gradle-plugin.html#optimizations
http://blog.csdn.net/ahence/article/details/73603326
配置到這裡,我的Android Studio編譯速度從原來的4分鐘縮短到了10秒。希望你也可以通過設定提高工作效率.
最後,加速Android Studio另一個最簡單的方法就是:
升級你的電腦配置!!