1. 程式人生 > >使用Android Studio3.0新功能,加快Android Studio的構建速度

使用Android Studio3.0新功能,加快Android Studio的構建速度

加快Android Studio 構建速度

構建速度直接影響到開發效率,浪費時間即浪費生命,可以通過修改一些配置,優化下構建速度

3.0之前的做法

通過配置DEX 資源縮短構建時間

gradle 新增以下程式碼

android {
  ...
  dexOptions {
    maxProcessCount 4 // this is the default value
    javaMaxHeapSize "2g"
  }
}

maxProcessCount
設定可以並行啟動的 DEX 程序的最大數量

javaMaxHeapSize 設定 dex 操作的最大記憶體分配池大小
根據自己電腦的配置,設定這兩個值,通常情況下這兩個值越大越好

啟用 dexing-in-process 和增量 Java 編譯

Android Plugin for Gradle 版本 2.1.0 及更高版本還引入了其他的構建流程改進,包括增量 Java 編譯和 dexing-in-process。增量 Java 編譯預設情況下處於啟用狀態,這種編譯方式僅對發生變化或需要重新編譯的原始碼部分進行重新編譯,可以縮短開發過程中的編譯時間。

dexing-in-process 在構建流程而不是單獨的外部 VM 流程中執行 dexing。這樣不僅可以讓增量構建更快,也可以顯著提高完整構建的速度。要啟用此功能,您需要將 Gradle 後臺程序的最大堆大小設定為至少 2048 MB。要進行設定,您可以將以下程式碼包含到專案的 gradle.properties 檔案中

org.gradle.jvmargs = -Xmx2048m

如果您已經在模組級別的 build.gradle 檔案中為 javaMaxHeapSize 定義值,則需要將後臺程序的最大堆大小設定為 javaMaxHeapSize 的值 + 1024 MB。例如,如果您已將 javaMaxHeapSize 設為“2g”,則需要將以下程式碼新增到專案的 gradle.properties 檔案中:

org.gradle.jvmargs = -Xmx3072m

3.0之後的做法

使用用D8 編譯器作為DEX 編譯器

Android Studio3.0 包含了一個新的可選擇DEX編譯器,叫做D8,不久它將替換掉舊的DX編譯器,現在可以選擇使用新的編譯器,DEX編譯直接影響到app的構建時間,dex檔案大小,和執行時的效能,當使用新的D8編譯器,D8編譯更快和輸出更小的.dex檔案,並且相同或者更好的app執行時效能。要想使用D8編譯器,把以下程式碼新增到工程的gradle.properties 檔案即可

android.enableD8=true

3.1過後預設採用D8編譯器,無需新增這句話

使用新的依賴方式

也就是指dependencies程式碼塊的引用

dependencies{
    compile project('xxx')
    compile 'com.github.bumptech.glide:glide:3.7.0'
}

Android gradle 3.0 外掛有4種引入方式
* implementation 相當於原來的compile
* api 相當於原來的compile
* compileOnly 相當於原來的provided
* runtimeOnly 相當於原來的apk

一般來說實際中主要用到的是compile
為了提高構建速度
替換成

implementation project('xxx')
implementation 'com.github.bumptech.glide:glide:3.7.0'

或者

api project('xxx')
api 'com.github.bumptech.glide:glide:3.7.0'

那這兩者有什麼區別呢

此時需要注意的一個地方,例如一個叫A的lib裡面用implementation引用一個B庫,又有一個C的module(不管是lib還是app)引用了A,這個C的module是引用了不了B的,也就是不能使用B庫裡面的類和方法。這也是為什麼使用implemention會加快構建速度的原因,可以減少重複編譯。要想引用B到的庫,可以使用api。在3.0中,api用法可以完全可以替換之前的compile,不用擔心編譯問題。

簡單總結下:

implementation:C引用A,即使A庫implementation方式引用B,C也不會引用B

api :C引用A,並且A庫用api方式引用B,C會引用B

compileOnly 只依賴庫用來編譯,不會把庫打包進apk,在一些特定的場景很有用

runtimeOnly 不用來編譯,但是會打包到apk,這個方式是deprecated(不推薦使用)的

參考

配置構建