1. 程式人生 > >Android Studio 3.1 加速編譯速度

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另一個最簡單的方法就是:

升級你的電腦配置!!