Android Studio加速編譯速度

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

升級你的電腦配置!!

發佈了10 篇原創文章 · 獲贊 25 · 訪問量 8123
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章