優化AndroidStudio的構建速度

飛雪祭發表於2017-11-05

想必大家在安卓開發過程中都會遇到同樣一個問題,那就是專案編譯花費的時間太久了,而浪費了許多開發時間.本文整理了一些優化AndroidStudio構建速度的一些方案,希望能夠幫助到你.

一、更新你的電腦配置

將你的CPU升級到頂配(I7 XXK),記憶體32G,固態360G。

哈哈,開個玩笑。如果你是土豪,相信你也不會介意,也會認同我的。

二、更新你的工具到最新版本

  1. 更新高版本穩定的AndroidStudio版本和Gradle外掛.谷歌之所以要更新版本,那一定是優化了許多東西,在選擇的同時最好看下版本好,選擇正式穩定版的工具.
  2. 在開發應用程式時,應儘可能將其部署到執行Android 7.0(API級別24)或更高階別的裝置。較新版本的Android平臺實現更好的機制,將更新推送到你的應用程式,例如Android執行時(ART)和本地支援多個DEX檔案。

    注意:在第一次完成構建之後,你可能會注意到後續的構建(clean和incremental)執行得更快(即使沒有使用此頁面上描述的任何優化)。這是因為Gradle守護程式有一個效能提升的“熱身期”,類似於其他的JVM程式。

三、使用新的依賴和配置

新的配置 棄用配置 行為
implementation compile 當你的模組配置一個implementation 依賴項時,讓Gradle知道這個模組在編譯的時候不需要把依賴項洩露給其他模組。也就是說,只有在執行時,依賴才可用於其他模組。使用這種依賴配置代替 api或compile可以導致顯著的構建時間改進,因為它減少了構建系統需要重新編譯的專案的數量。例如,如果一個 implementation依賴關係改變了它的API,Gradle只重新編譯這個依賴項以及直接依賴它的模組。大多數應用程式和測試模組應使用此配置。
api compile 當一個模組包含api依賴關係時,讓Gradle知道模組想要將該依賴關係可傳遞地匯出到其他模組,以便在執行時和編譯時使用它們。這個配置的行為就像compile(現在已經被棄用了),你通常應該只在庫模組中使用它。這是因為,如果api依賴項更改了外部API,Gradle會在編譯時重新編譯所有有權訪問該依賴項的模組。所以,擁有大量的api依賴會增加構建時間。除非你想將一個依賴的API暴露給一個單獨的測試模組,否則使用implementation 依賴。

也就是說在AndroidStudio3.0以後,能使用implementation的就使用implementation,implementation可以提高編譯速度

四、開啟D8編譯

相比之前的DX編譯引擎,谷歌的下一代編譯引擎D8 dex編譯引擎不僅僅提高了編譯效率(體現在編譯時間減少上),同時也減少了生成的.dex檔案的大小。目前D8 dex編譯引擎已經在android studio 3.0 裡有,而這一引擎將在android studio 3.1裡成為預設的引擎。可以在gradle.properties 檔案裡的android.enableD8設定成true即可使用D8 dex編譯引擎。

android.enableD8 = true複製程式碼

五、將影象轉換為WebP

WebP是一種影象檔案格式,提供有失真壓縮(如JPEG)以及透明度(如PNG),但可以提供比JPEG或PNG更好的壓縮。減少影象檔案的大小,而不必執行構建時壓縮,可以加快你的構建,特別是如果你的應用程式使用大量的影象資源。但是,解壓縮WebP映像時,你可能會注意到裝置CPU使用率的小幅增加。使用Android Studio,你可以輕鬆地 將影象轉換為WebP。

六、禁用PNG運算

如果你不能(或不想)將你的PNG影象轉換為WebP,那麼你仍然可以通過每次構建應用程式時禁用自動影象壓縮來加速構建。如果你使用的是 Android外掛3.0.0或更高版本,則預設情況下禁用Debug構建型別的PNG運算。要為其他構建型別禁用此優化,請將以下內容新增到你的build.gradle檔案中:

android {
    buildTypes {
        release {
            // 為釋出構建型別禁用PNG運算。
            crunchPngs false
        }
    }

    // 如果你使用的是舊版本的外掛,請使用以下內容
    //  aaptOptions {
    //      cruncherEnabled false
    //  }
}複製程式碼

七、使用靜態依賴版本

在build.gradle檔案中宣告依賴關係時,應該避免在最後使用帶有加號的版本號,例如 'com.android.tools.build:gradle:2.+'。使用動態版本號可能會導致意外的版本更新,難以解決版本差異以及Gradle檢查更新造成的較慢版本。你應該使用靜態/硬編碼的版本號。

八、啟用離線模式

如果你的網路連線速度較慢,則當Gradle嘗試使用網路資源來解決依賴關係時,你的構建時間可能會受到影響。你可以通過只使用已快取在本地的工件來告訴Gradle避免使用網路資源。

在使用Android Studio構建時要離線使用Gradle,請按照下列步驟操作:

  1. 通過單擊文File > Settings
  2. 在左側窗格中,單擊BuildExecution, Deployment > Gradle.
  3. 選中Offline work核取方塊。
  4. 點選Apply或者OK

九、配置守護程式

  1. 單擊File > Settings.
  2. 在左側窗格中,單擊Build, Execution, Deployment > Compiler.
  3. 選中Configure on demand核取方塊。
  4. 點選Apply或者OK

十、啟用Instant Run

Instant Run通過推送某些程式碼和資源更改而無需構建新的APK,並且在某些情況下甚至不重新啟動當前活動,從而大大縮短了更新應用程式所需的時間。

十一、自定義你的VM選項

要提高Studio的效能,最常見的選項是調整最大堆大小,但也可以使用該studio.vmoptions檔案覆蓋其他預設設定,例如初始堆大小,快取大小和Java垃圾收集開關。

要建立一個新studio.vmoptions檔案或開啟現有檔案,請使用以下步驟:

  1. 單擊Help > Edit Custom VM Options,如果你以前從未編輯過Android Studio的VM選項,則IDE會提示你建立一個新 studio.vmoptions檔案。單擊是以建立該檔案。
  2. 開啟studio.vmoptions檔案,編輯檔案以新增你自己的自定義VM選項。有關可定製JVM選項的完整列表,請參閱Oracle的Java HotSpot VM選項頁面。 下面是我自己的配置,僅供參考.

     -Xms2048m
     -Xmx2048m
     -XX:MaxPermSize=2048m
     -XX:ReservedCodeCacheSize=1024m複製程式碼

十二、為開發建立一個構建variant

在開發應用程式 時,你準備開發應用程式所需的許多配置都不是必需的。啟用不必要的構建過程會減慢增量構建和清理構建的速度,因此請配置構建變體,以便在開發應用程式時只保留構建配置。下面的示例建立一個“dev”風格和一個“prod”風格(用於你的發行版本配置):

android {
      ...
      defaultConfig {...}
      buildTypes {...}
      productFlavors {
      //當構建一個使用這種風格的variant時,以下配置將覆蓋defaultConfig塊中的配置。
      dev {
          //為了避免在從命令列構建時使用傳統的multidex,將minSdkVersion設定為21或更高。
          //當使用Android Studio 2.3或更高版本時,構建部署到執行API級別21或更高階別
         //的裝置時,會自動避免傳統的multidex,無論你設定為minSdkVersion。 
          minSdkVersion 21
          versionNameSuffix "-dev"
          applicationIdSuffix '.dev'
     }

    prod {
      // 如果你已經為你的應用程式的釋出版本配置了defaultConfig塊,你可以把這個塊留空,
      // 而Gradle使用defaultConfig塊中的配置。你仍然需要創造這種flavor 
      // 否則,所有variants 都使用“dev”flavor 配置。
    }
  }
}複製程式碼

如果你的構建配置已經使用product flavors 來建立應用程式的不同版本,則可以使用flavors 將“dev”和“prod”配置與這些flavors相結合。例如,如果你已經配置了“demo”和“prod”的風格,則可以使用以下示例配置來建立組合flavors,如“devDemo”和“prodFull”:

android {
      ...
    defaultConfig {...}
    buildTypes {...}

  // 指定要使用的flavor dimensions。
  // 按從高到低列出每個dimensions的優先順序
  //當Gradle合併variant的來源和配置。你必須將你配置的每個product flavors分配給其中一個flavor dimensions。

  flavorDimensions "stage", "mode"

  productFlavors {
dev {
      dimension "stage"
      minSdkVersion 21
      versionNameSuffix "-dev"
      applicationIdSuffix '.dev'
      ...
    }

    prod {
      dimension "stage"
      ...
    }

    demo {
      dimension "mode"
      ...
    }

    full {
      dimension "mode"
      ...
    }
      }
}複製程式碼

避免編譯和打包未測試的資源(例如螢幕密度資源)。你可以通過只指定一個螢幕密度資源並遮蔽你的“dev” flavors來做到這一點,如下面的例子所示:

android {
  ...
  productFlavors {
    dev {
      ...
      // 下面的配置限制了“dev”風格,以使用xxhdpi螢幕密度資源。
        resConfigs  "xxhdpi"
    }
    ...
  }
}複製程式碼

十三、Crashlytics報告設定

如果你不需要執行Crashlytics報告,請通過禁用外掛來加快你的除錯版本,如下所示:

android {
  ...
  buildTypes {
    debug {
      ext.enableCrashlytics = false
    }
}複製程式碼

你還需要在執行時禁用Crashlytics套件以進行除錯構建,方法是更改​​你在應用程式中初始化Fabric支援的方式,如下所示:

// 初始化不使用除錯構建型別的構建。
Crashlytics crashlyticsKit = new Crashlytics.Builder()
    .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
    .build();

Fabric.with(this, crashlyticsKit);複製程式碼

如果你想在除錯版本中使用Crashlytics,那麼你仍然可以通過防止Crashlytics在每次構建期間使用自己的唯一構建ID更新應用程式資源來加速增量構建。要防止Crashlytics不斷更新其構建ID,請將以下內容新增到你的 build.gradle檔案中:

android {
  ...
  buildTypes {
    debug {
      ext.alwaysUpdateBuildId = false
    }
}複製程式碼

相關文章