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

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

一当悔、更新你的電腦配置

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

哈哈,開個(gè)玩笑夺饲。如果你是土豪胡陪,相信你也不會(huì)介意件舵,也會(huì)認(rèn)同我的。

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

  1. 更新高版本穩(wěn)定的AndroidStudio版本和Gradle插件.谷歌之所以要更新版本,那一定是優(yōu)化了許多東西,在選擇的同時(shí)最好看下版本好,選擇正式穩(wěn)定版的工具.
  2. 在開發(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可以提高編譯速度

四、開啟D8編譯

相比之前的DX編譯引擎汗茄,谷歌的下一代編譯引擎D8 dex編譯引擎不僅僅提高了編譯效率(體現(xiàn)在編譯時(shí)間減少上)昼榛,同時(shí)也減少了生成的.dex文件的大小。目前D8 dex編譯引擎已經(jīng)在android studio 3.0 里有剔难,而這一引擎將在android studio 3.1里成為默認(rèn)的引擎胆屿。可以在gradle.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è)窗格中辅柴,單擊BuildExecution, 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的性能,最常見的選項(xiàng)是調(diào)整最大堆大小催束,但也可以使用該studio.vmoptions文件覆蓋其他默認(rèn)設(shè)置集峦,例如初始堆大小,緩存大小和Java垃圾收集開關(guān)。

要?jiǎng)?chuàng)建一個(gè)新studio.vmoptions文件或打開現(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. 打開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
    

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

在開發(fā)應(yīng)用程序 時(shí)杀赢,你準(zhǔn)備開發(fā)應(yīng)用程序所需的許多配置都不是必需的烘跺。啟用不必要的構(gòu)建過(guò)程會(huì)減慢增量構(gòu)建和清理構(gòu)建的速度,因此請(qǐng)配置構(gòu)建變體脂崔,以便在開發(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市毒返,隨后出現(xiàn)的幾起案子租幕,更是在濱河造成了極大的恐慌,老刑警劉巖拧簸,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劲绪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盆赤,警方通過(guò)查閱死者的電腦和手機(jī)珠叔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弟劲,“玉大人祷安,你說(shuō)我怎么就攤上這事⊥闷颍” “怎么了汇鞭?”我有些...
    開封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)庸追。 經(jīng)常有香客問(wèn)我霍骄,道長(zhǎng),這世上最難降的妖魔是什么淡溯? 我笑而不...
    開封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任读整,我火速辦了婚禮,結(jié)果婚禮上咱娶,老公的妹妹穿的比我還像新娘米间。我一直安慰自己,他們只是感情好膘侮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開白布屈糊。 她就那樣靜靜地躺著,像睡著了一般琼了。 火紅的嫁衣襯著肌膚如雪逻锐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音昧诱,去河邊找鬼晓淀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盏档,可吹牛的內(nèi)容都是我干的凶掰。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼妆丘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锄俄!你這毒婦竟也來(lái)了局劲?” 一聲冷哼從身側(cè)響起勺拣,我...
    開封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鱼填,沒(méi)想到半個(gè)月后药有,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苹丸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年愤惰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赘理。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宦言,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出商模,到底是詐尸還是另有隱情奠旺,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布施流,位于F島的核電站响疚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瞪醋。R本人自食惡果不足惜忿晕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望银受。 院中可真熱鬧践盼,春花似錦、人聲如沸宾巍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜀漆。三九已至谅河,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绷耍。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工吐限, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人褂始。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓诸典,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親崎苗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狐粱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

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