優(yōu)化AndroidStudio的構(gòu)建速度

想必大家在安卓開(kāi)發(fā)過(guò)程中都會(huì)遇到同樣一個(gè)問(wèn)題,那就是項(xiàng)目編譯花費(fèi)的時(shí)間太久了,而浪費(fèi)了許多開(kāi)發(fā)時(shí)間.本文整理了一些優(yōu)化AndroidStudio構(gòu)建速度的一些方案,希望能夠幫助到你.

一、更新你的電腦配置

將你的CPU升級(jí)到頂配(I7 XXK),內(nèi)存32G,固態(tài)360G。

哈哈,開(kāi)個(gè)玩笑。如果你是土豪,相信你也不會(huì)介意,也會(huì)認(rèn)同我的。

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

  1. 更新高版本穩(wěn)定的AndroidStudio版本和Gradle插件.谷歌之所以要更新版本,那一定是優(yōu)化了許多東西,在選擇的同時(shí)最好看下版本好,選擇正式穩(wěn)定版的工具.
  2. 在開(kāi)發(fā)應(yīng)用程序時(shí),應(yīng)盡可能將其部署到運(yùn)行Android 7.0(API級(jí)別24)或更高級(jí)別的設(shè)備。較新版本的Android平臺(tái)實(shí)現(xiàn)更好的機(jī)制,將更新推送到你的應(yīng)用程序,例如Android運(yùn)行時(shí)(ART)和本地支持多個(gè)DEX文件。

注意:在第一次完成構(gòu)建之后,你可能會(huì)注意到后續(xù)的構(gòu)建(clean和incremental)執(zhí)行得更快(即使沒(méi)有使用此頁(yè)面上描述的任何優(yōu)化)。這是因?yàn)镚radle守護(hù)進(jìn)程有一個(gè)性能提升的“熱身期”,類似于其他的JVM進(jìn)程。

三、使用新的依賴和配置

新的配置 棄用配置 行為
implementation compile 當(dāng)你的模塊配置一個(gè)implementation 依賴項(xiàng)時(shí),讓Gradle知道這個(gè)模塊在編譯的時(shí)候不需要把依賴項(xiàng)泄露給其他模塊。也就是說(shuō),只有在運(yùn)行時(shí),依賴才可用于其他模塊。使用這種依賴配置代替 api或compile可以導(dǎo)致顯著的構(gòu)建時(shí)間改進(jìn),因?yàn)樗鼫p少了構(gòu)建系統(tǒng)需要重新編譯的項(xiàng)目的數(shù)量。例如,如果一個(gè) implementation依賴關(guān)系改變了它的API,Gradle只重新編譯這個(gè)依賴項(xiàng)以及直接依賴它的模塊。大多數(shù)應(yīng)用程序和測(cè)試模塊應(yīng)使用此配置。
api compile 當(dāng)一個(gè)模塊包含api依賴關(guān)系時(shí),讓Gradle知道模塊想要將該依賴關(guān)系可傳遞地導(dǎo)出到其他模塊,以便在運(yùn)行時(shí)和編譯時(shí)使用它們。這個(gè)配置的行為就像compile(現(xiàn)在已經(jīng)被棄用了),你通常應(yīng)該只在庫(kù)模塊中使用它。這是因?yàn)椋绻鸻pi依賴項(xiàng)更改了外部API,Gradle會(huì)在編譯時(shí)重新編譯所有有權(quán)訪問(wèn)該依賴項(xiàng)的模塊。所以,擁有大量的api依賴會(huì)增加構(gòu)建時(shí)間。除非你想將一個(gè)依賴的API暴露給一個(gè)單獨(dú)的測(cè)試模塊,否則使用implementation 依賴。

也就是說(shuō)在AndroidStudio3.0以后,能使用implementation的就使用implementation,implementation可以提高編譯速度

四、開(kāi)啟D8編譯

相比之前的DX編譯引擎,谷歌的下一代編譯引擎D8 dex編譯引擎不僅僅提高了編譯效率(體現(xiàn)在編譯時(shí)間減少上),同時(shí)也減少了生成的.dex文件的大小。目前D8 dex編譯引擎已經(jīng)在android studio 3.0 里有,而這一引擎將在android studio 3.1里成為默認(rèn)的引擎??梢栽趃radle.properties 文件里的android.enableD8設(shè)置成true即可使用D8 dex編譯引擎。

android.enableD8 = true

五、將圖像轉(zhuǎn)換為WebP

WebP是一種圖像文件格式,提供有損壓縮(如JPEG)以及透明度(如PNG),但可以提供比JPEG或PNG更好的壓縮。減少圖像文件的大小,而不必執(zhí)行構(gòu)建時(shí)壓縮,可以加快你的構(gòu)建,特別是如果你的應(yīng)用程序使用大量的圖像資源。但是,解壓縮WebP映像時(shí),你可能會(huì)注意到設(shè)備CPU使用率的小幅增加。使用Android Studio,你可以輕松地 將圖像轉(zhuǎn)換為WebP。

六、禁用PNG運(yùn)算

如果你不能(或不想)將你的PNG圖像轉(zhuǎn)換為WebP,那么你仍然可以通過(guò)每次構(gòu)建應(yīng)用程序時(shí)禁用自動(dòng)圖像壓縮來(lái)加速構(gòu)建。如果你使用的是 Android插件3.0.0或更高版本,則默認(rèn)情況下禁用Debug構(gòu)建類型的PNG運(yùn)算。要為其他構(gòu)建類型禁用此優(yōu)化,請(qǐng)將以下內(nèi)容添加到你的build.gradle文件中:

android {
    buildTypes {
        release {
            // 為發(fā)布構(gòu)建類型禁用PNG運(yùn)算。
            crunchPngs false
        }
    }

    // 如果你使用的是舊版本的插件,請(qǐng)使用以下內(nèi)容
    //  aaptOptions {
    //      cruncherEnabled false
    //  }
}

七、使用靜態(tài)依賴版本

在build.gradle文件中聲明依賴關(guān)系時(shí),應(yīng)該避免在最后使用帶有加號(hào)的版本號(hào),例如 'com.android.tools.build:gradle:2.+'。使用動(dòng)態(tài)版本號(hào)可能會(huì)導(dǎo)致意外的版本更新,難以解決版本差異以及Gradle檢查更新造成的較慢版本。你應(yīng)該使用靜態(tài)/硬編碼的版本號(hào)。

八、啟用離線模式

如果你的網(wǎng)絡(luò)連接速度較慢,則當(dāng)Gradle嘗試使用網(wǎng)絡(luò)資源來(lái)解決依賴關(guān)系時(shí),你的構(gòu)建時(shí)間可能會(huì)受到影響。你可以通過(guò)只使用已緩存在本地的工件來(lái)告訴Gradle避免使用網(wǎng)絡(luò)資源。

在使用Android Studio構(gòu)建時(shí)要離線使用Gradle,請(qǐng)按照下列步驟操作:

  1. 通過(guò)單擊文File > Settings
  2. 在左側(cè)窗格中,單擊Build, Execution, Deployment > Gradle.
  3. 選中Offline work復(fù)選框。
  4. 點(diǎn)擊Apply或者OK。

九、配置守護(hù)進(jìn)程

  1. 單擊File > Settings.
  2. 在左側(cè)窗格中,單擊Build, Execution, Deployment > Compiler.
  3. 選中Configure on demand復(fù)選框。
  4. 點(diǎn)擊Apply或者OK。

十、啟用Instant Run

Instant Run通過(guò)推送某些代碼和資源更改而無(wú)需構(gòu)建新的APK,并且在某些情況下甚至不重新啟動(dòng)當(dāng)前活動(dòng),從而大大縮短了更新應(yīng)用程序所需的時(shí)間。

十一、自定義你的VM選項(xiàng)

要提高Studio的性能,最常見(jiàn)的選項(xiàng)是調(diào)整最大堆大小,但也可以使用該studio.vmoptions文件覆蓋其他默認(rèn)設(shè)置,例如初始堆大小,緩存大小和Java垃圾收集開(kāi)關(guān)。

要?jiǎng)?chuàng)建一個(gè)新studio.vmoptions文件或打開(kāi)現(xiàn)有文件,請(qǐng)使用以下步驟:

  1. 單擊Help > Edit Custom VM Options,如果你以前從未編輯過(guò)Android Studio的VM選項(xiàng),則IDE會(huì)提示你創(chuàng)建一個(gè)新 studio.vmoptions文件。單擊是以創(chuàng)建該文件。

  2. 打開(kāi)studio.vmoptions文件,編輯文件以添加你自己的自定義VM選項(xiàng)。有關(guān)可定制JVM選項(xiàng)的完整列表,請(qǐng)參閱Oracle的Java HotSpot VM選項(xiàng)頁(yè)面。 下面是我自己的配置,僅供參考.

     -Xms2048m
     -Xmx2048m
     -XX:MaxPermSize=2048m
     -XX:ReservedCodeCacheSize=1024m
    

十二、為開(kāi)發(fā)創(chuàng)建一個(gè)構(gòu)建variant

在開(kāi)發(fā)應(yīng)用程序 時(shí),你準(zhǔn)備開(kāi)發(fā)應(yīng)用程序所需的許多配置都不是必需的。啟用不必要的構(gòu)建過(guò)程會(huì)減慢增量構(gòu)建和清理構(gòu)建的速度,因此請(qǐng)配置構(gòu)建變體,以便在開(kāi)發(fā)應(yīng)用程序時(shí)只保留構(gòu)建配置。下面的示例創(chuàng)建一個(gè)“dev”風(fēng)格和一個(gè)“prod”風(fēng)格(用于你的發(fā)行版本配置):

android {
      ...
      defaultConfig {...}
      buildTypes {...}
      productFlavors {
      //當(dāng)構(gòu)建一個(gè)使用這種風(fēng)格的variant時(shí),以下配置將覆蓋defaultConfig塊中的配置。
      dev {
          //為了避免在從命令行構(gòu)建時(shí)使用傳統(tǒng)的multidex,將minSdkVersion設(shè)置為21或更高。
          //當(dāng)使用Android Studio 2.3或更高版本時(shí),構(gòu)建部署到運(yùn)行API級(jí)別21或更高級(jí)別
         //的設(shè)備時(shí),會(huì)自動(dòng)避免傳統(tǒng)的multidex,無(wú)論你設(shè)置為minSdkVersion。 
          minSdkVersion 21
          versionNameSuffix "-dev"
          applicationIdSuffix '.dev'
     }

    prod {
      // 如果你已經(jīng)為你的應(yīng)用程序的發(fā)布版本配置了defaultConfig塊,你可以把這個(gè)塊留空,
      // 而Gradle使用defaultConfig塊中的配置。你仍然需要?jiǎng)?chuàng)造這種flavor 
      // 否則,所有variants 都使用“dev”flavor 配置。
    }
  }
}

如果你的構(gòu)建配置已經(jīng)使用product flavors 來(lái)創(chuàng)建應(yīng)用程序的不同版本,則可以使用flavors 將“dev”和“prod”配置與這些flavors相結(jié)合。例如,如果你已經(jīng)配置了“demo”和“prod”的風(fēng)格,則可以使用以下示例配置來(lái)創(chuàng)建組合flavors,如“devDemo”和“prodFull”:

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

  // 指定要使用的flavor dimensions。
  // 按從高到低列出每個(gè)dimensions的優(yōu)先級(jí)
  //當(dāng)Gradle合并variant的來(lái)源和配置。你必須將你配置的每個(gè)product flavors分配給其中一個(gè)flavor dimensions。

  flavorDimensions "stage", "mode"

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

    prod {
      dimension "stage"
      ...
    }

    demo {
      dimension "mode"
      ...
    }

    full {
      dimension "mode"
      ...
    }
      }
}

避免編譯和打包未測(cè)試的資源(例如屏幕密度資源)。你可以通過(guò)只指定一個(gè)屏幕密度資源并屏蔽你的“dev” flavors來(lái)做到這一點(diǎn),如下面的例子所示:

android {
  ...
  productFlavors {
    dev {
      ...
      // 下面的配置限制了“dev”風(fēng)格,以使用xxhdpi屏幕密度資源。
        resConfigs  "xxhdpi"
    }
    ...
  }
}

十三、Crashlytics報(bào)告設(shè)置

如果你不需要運(yùn)行Crashlytics報(bào)告,請(qǐng)通過(guò)禁用插件來(lái)加快你的調(diào)試版本,如下所示:

android {
  ...
  buildTypes {
    debug {
      ext.enableCrashlytics = false
    }
}

你還需要在運(yùn)行時(shí)禁用Crashlytics套件以進(jìn)行調(diào)試構(gòu)建,方法是更改??你在應(yīng)用程序中初始化Fabric支持的方式,如下所示:

// 初始化不使用調(diào)試構(gòu)建類型的構(gòu)建。
Crashlytics crashlyticsKit = new Crashlytics.Builder()
    .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
    .build();

Fabric.with(this, crashlyticsKit);

如果你想在調(diào)試版本中使用Crashlytics,那么你仍然可以通過(guò)防止Crashlytics在每次構(gòu)建期間使用自己的唯一構(gòu)建ID更新應(yīng)用程序資源來(lái)加速增量構(gòu)建。要防止Crashlytics不斷更新其構(gòu)建ID,請(qǐng)將以下內(nèi)容添加到你的 build.gradle文件中:

android {
  ...
  buildTypes {
    debug {
      ext.alwaysUpdateBuildId = false
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,175評(píng)論 25 708
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng),請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,370評(píng)論 8 72
  • 轉(zhuǎn)載注明出處:http://www.itdecent.cn/p/5255b100930e 0. 前言 完全由個(gè)人翻...
    王三的貓阿德閱讀 2,747評(píng)論 0 4
  • 參考 中文官網(wǎng)構(gòu)建指南:https://developer.android.google.cn/studio/bu...
    FinalSky閱讀 5,626評(píng)論 0 16
  • 發(fā)心:我今不是為了我個(gè)人而聞思修,而是為了六道輪回一切如母有情眾生,愿一切如母有情眾生能夠早日離苦得樂(lè),清凈業(yè)障,...
    曉茂閱讀 190評(píng)論 1 2

友情鏈接更多精彩內(nèi)容