新聞中心
較長的構建時間將會減緩項目的開發(fā)進度,特別是對于大型的項目,app的構建時間長則十幾分鐘,短則幾分鐘,長的構建時間已經成了開發(fā)瓶頸,本篇文章根據Google官方文檔,加上自己的一些理解提供一些提升app構建速度的優(yōu)化建議。

創(chuàng)新互聯(lián)"三網合一"的企業(yè)建站思路。企業(yè)可建設擁有電腦版、微信版、手機版的企業(yè)網站。實現(xiàn)跨屏營銷,產品發(fā)布一步更新,電腦網絡+移動網絡一網打盡,滿足企業(yè)的營銷需求!創(chuàng)新互聯(lián)具備承接各種類型的網站設計制作、網站建設項目的能力。經過10余年的努力的開拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質的服務,并獲得了客戶的一致好評。
1. 為開發(fā)環(huán)境創(chuàng)建一個變體
有許多配置是你在準備app的release 版本的時候需要,但是當你開發(fā)app的時候是不需要的,開啟不必要的構建進程會使你的增量構建或者clean構建變得很慢,因此需要構建一個只保留開發(fā)時需要配置的變體,如下例子創(chuàng)建了一個dev和prod變體(prod 為release 版本的配置)。
- android {
- ...
- defaultConfig {...}
- buildTypes {...}
- productFlavors {
- // When building a variant that uses this flavor, the following configurations
- // override those in the defaultConfig block.
- dev {
- // To avoid using legacy multidex, set minSdkVersion to 21 or higher.
- minSdkVersion 21
- versionNameSuffix "-dev"
- applicationIdSuffix '.dev'
- }
- prod {
- // If you've configured the defaultConfig block for the release version of
- // your app, you can leave this block empty and Gradle uses configurations in
- // the defaultConfig block instead. You still need to create this flavor.
- // Otherwise, all variants use the "dev" flavor configurations.
- }
- }
- }
2 . 避免編譯不必要的資源
避免編譯和包含你沒有測試的資源(比如添加的一個本地的語言和屏幕密度資源),你可以只在你的’dev’ flavor下指定一種語言和一個屏幕密度,如下:
- android {
- ...
- productFlavors {
- dev {
- ...
- // The following configuration limits the "dev" flavor to using
- // English stringresources and xxhdpi screen-density resources.
- resConfigs "en", "xxhdpi"
- }
- ...
- }
- }
上面的配置將會限制dev 變體只使用 english string 資源和 xxhdpi 屏幕密度資源。
3 . 配置debug 構建的Crushlytics為不可用狀態(tài)
在debug 構建狀態(tài)下,如果你不需要運行崩潰上報,你可以將這個插件設置為不可用狀態(tài)來提升你的構建速度,如下:
- android {
- ...
- buildTypes {
- debug {
- ext.enableCrashlytics = false
- }
- }
上面只是舉個例子,Crushlytics 為崩潰上報分析工具,在開發(fā)的時候我們可能不需要,因此不需要打開,在我們實際開發(fā)中,像崩潰上報SDK,數據統(tǒng)計SDK等(如 友盟統(tǒng)計、GrowingIO、百度統(tǒng)計)在開發(fā)階段都設置為不可用,來提升構建速度。
4 . 用靜態(tài)的構建配置值來構建你的Debug版
一般地,在你的debug 構建時,為manifest文件或者資源文件配置使用靜態(tài)/硬編碼的值。如果你的manifest或者資源文件的值每次構建都需要動態(tài)更新,那么Instant Run 無法執(zhí)行代碼交換-它必須重新構建和安裝新的APK。
例如,使用動態(tài)的version codes ,version names ,resources或者其他更改manifest文件的構建邏輯,每次你想執(zhí)行一個修改都會構建全部APK,即使實際的修改可能僅僅只需要熱交換。如果這些構建配置是需要動態(tài)配置的,那么將它們從你的release 構建變體中分離出來,并且在你的debug 構建中保留它們的靜態(tài)值。像下面build.gradle 文件顯示的這樣:
- int MILLIS_IN_MINUTE = 1000 * 60
- int minutesSinceEpoch = System.currentTimeMillis() / MILLIS_IN_MINUTE
- android {
- ...
- defaultConfig {
- // Making either of these two values dynamic in the defaultConfig will
- // require a full APK build and reinstallation because the AndroidManifest.xml
- // must be updated (which is not supported by Instant Run).
- versionCode 1
- versionName "1.0"
- ...
- }
- // The defaultConfig values above are fixed, so your incremental builds don't
- // need to rebuild the manifest (and therefore the whole APK, slowing build times).
- // But for release builds, it's okay. So the following script iterates through
- // all the known variants, finds those that are "release" build types, and
- // changes those properties to something dynamic.
- applicationVariants.all { variant ->
- if (variant.buildType.name == "release") {
- variant.mergedFlavor.versionCode = minutesSinceEpoch;
- variant.mergedFlavor.versionName = minutesSinceEpoch + "-" + variant.flavorName;
- }
- }
- }
5 . 用靜態(tài)的版本依賴
當你在build.gradle文件中聲明依賴的時候,你應該避免在版本號結束的地方使用+號,比如:com.android.tools.build:gradle:2.+ 因為Gradle的檢查更新,用動態(tài)的版本號會導致未知的版本更新、使解決版本的差異變得困難和更慢的構建。你應該使用靜態(tài)或者硬編碼版本號來代替。如:com.android.tools.build:gradle:2.2.2 。
6 . 使 on demand 配置為enable 狀態(tài)
為了讓Gradle能夠確切的知道該如何構建你的APP,在每次構建之前,構建系統(tǒng)配置工程的所有modules和其他依賴(即使你只想構建或者測試一個modules),這使得大型的多module 工程的構建速度變得很慢。告訴Gradle僅僅配置你想要構建的Modules,用如下步驟使 on demand 配置可用
(1) 在菜單欄上選擇 File -> Settings(如果是Mac上 ,選擇 Android Studio ->Preferences)
(2) 導航到 Build,Execution,Deployment -> Compiler
(3) check Configure on demand 復選框
(4) 點擊 OK
如圖:
on_demand.png
7 . 創(chuàng)建 library 模塊
檢查你app中的代碼,將可模塊化的代碼抽取一個Android Library module,通過這種方式模塊化你的代碼將允許構建系統(tǒng)僅僅只編譯那些有改動的模塊,并將其構建結果緩存下來以被后面的構建使用。同樣的配置了 on demand 和 parallel project execution (project 并行執(zhí)行) 將更加高效(當你打開這些特性時)。
8 . 為自定義構建邏輯創(chuàng)建Tasks
在你創(chuàng)建了 build profile (build profile 后文會講)之后,如果顯示構建時間相對長的一部分時間花在“configure project(配置工程)階段,那么請 review 你的build.gradle 腳本,并且查找可包含到自定義Gradle Task中的代碼,通過將一些構建邏輯移動到一個task 中,當需要的時候才運行,結果能被緩存用于后續(xù)的構建,并且這個構建邏輯可以并行執(zhí)行(如果你開啟了 并行執(zhí)行project),更多詳細信息請閱讀Gradle官方文檔。 official Gradle documentation
小提示:
如果你的構建包含了大量的自定義任務tasks,你可能想清理你的build.gradle文件,通過自定義task classes (也就是自定義Gradle 插件啦),將你的classes 添加到 project-root/buildSrc/src/main/groovy/目錄下,Gradle將自動包含它們到class path ,為項目的所有build.gradle文件。
9 . 配置 dexOptions 和 開啟 library pre-dexing(dex預處理)
先補充一個知識點:Dex-in-process:新發(fā)布的Android Studio 2.1增加了一個新的特性:Dex In Process,可以極大的加快重新編譯的速度,同樣也能提高Instant Run的性能。(第10條優(yōu)化建議會說到)
詳情請看Faster Android Studio Builds with Dex In Process
Android 插件提供了 dexOptions script block ,因此你可以配置相應的 DEX 構建特性,它們可以提高構建速度:
(1)preDexLibraaies : 聲明是否對依賴的庫進行dex 預處理來使你的增量構建更快速,因為這個特性可能會使你的clean 構建變慢,因此在你的持續(xù)集成服務器上你可能想關閉這個特性。
(2) maxProcessCount : 設置最大的線程數量使用當運行 dex-in-process時,默認值是4。
(3)javaMaxHeapSize: 為DEX 編譯器 設置最大的堆大小,相對于設置這個屬性,你應該增加 Gradle的 堆大小(這個堆大小dex-in-process可用的時候對DEX 編譯器有效)
例子:
- android {
- ...
- dexOptions {
- preDexLibraries true
- maxProcessCount 8
- // Instead of setting the heap size for the DEX process, increase Gradle's
- // heap size to enable dex-in-process. To learm more, read the next section.
- // javaMaxHeapSize "2048m"
- }
- }
你應該增加它們的值來測試一下這些設置,然后通過profile觀察效果,當你為這個進程分配太多資源的時候,可能會得到一個負面的影響。
10 . 增加Gradle的堆大小 和開啟 dex-in-process
Dex-in-process 允許多個DEX 進程運行在一個單獨的VM 中,這使得增量構建和清理構建變得更快。默認情況下,通過Android Studio2.1 或者更高版本創(chuàng)建的新項目分配了足夠的內存來開啟這個特性,如果你沒有使用Android Studio 2.1 或者更高的版本創(chuàng)建項目,你需要給Gradle后臺駐扎程序設置至少1536MB 的堆大小內存。默認如下圖:
gradle_heap.png
下面的例子在gradle.properties中將Gradle 堆內存大小設置為 2048MB:
- org.gradle.jvmargs = -Xmx2048m //設置Gradle 堆大小 2G
在一些大型的項目上,為Gradle堆分配更多的內存當然更有利,然而,如果你用的是一個小內存的機器,你可能需要給IDE配置更少的內存,想知道如何改變分配給IDE資源的數量和Gradle 對構建表現(xiàn)的影響,請看profiling your build這一條。
如果在你的Module build.gradle 文件中為android.dexOptions.javaMaxHeapSize定義了%
分享名稱:Android優(yōu)化APP構建速度的17條建議
分享網址:http://m.5511xx.com/article/cdicchh.html


咨詢
建站咨詢
