关于Gradle的Instant Run
? ? ? ? Android Studio 2.0之后的版本支持Instant Run,可以加快編譯的速度,提高工作效率。建議大家都將Android Studio升級(jí)到2.0之后的版本。官網(wǎng)升級(jí)地址https://developer.android.com/studio/index.html,需要翻墻。另外關(guān)于Instant Run的介紹,我也轉(zhuǎn)發(fā)過(guò)來(lái),免得國(guó)內(nèi)很多不能翻墻的用戶(hù)看不到官網(wǎng)的文章。
? ? ? ?
? ? ? ? ?Android Studio 2.0 中引入的 Instant Run 是?Run??和?Debug??命令的行為,可以大幅縮短應(yīng)用更新的時(shí)間。盡管首次構(gòu)建可能需要花費(fèi)較長(zhǎng)的時(shí)間,Instant Run 在向應(yīng)用推送后續(xù)更新時(shí)則無(wú)需構(gòu)建新的 APK,因此,這樣可以更快地看到更改。
僅在您部署調(diào)試構(gòu)建變體、使用 Android Plugin for Gradle 版本 2.0.0 或更高版本,以及在應(yīng)用的模塊級(jí)別?build.gradle?文件中將?minSdkVersion?設(shè)置為 15 或以上時(shí),Instant Run 才受支持。為獲得最佳性能,可以將minSdkVersion?設(shè)置為 21 或更高。
部署應(yīng)用后,Run??按鈕(或?Debug??按鈕)中會(huì)出現(xiàn)黃色的小閃電圖標(biāo),表明 Instant Run 已經(jīng)準(zhǔn)備好在您下次點(diǎn)擊按鈕時(shí)推送更新。無(wú)需構(gòu)建新的 APK 即可推送新的更改,一些情況下,應(yīng)用甚至無(wú)需重啟就可以立即顯示代碼更改的效果。
Instant Run 通過(guò)執(zhí)行熱交換、溫和交換或冷交換向連接的設(shè)備或模擬器推送更新的代碼和資源。它會(huì)根據(jù)所做更改的類(lèi)型自動(dòng)確定要執(zhí)行的交換類(lèi)型。上面的視頻提供了有關(guān)所有這些如何在后臺(tái)運(yùn)行的十分有趣的詳細(xì)信息。要獲得您將特定代碼更改推送至目標(biāo)設(shè)備時(shí) Instant Run 如何工作的快速摘要,請(qǐng)參見(jiàn)下表。
| 通過(guò)熱交換支持:這是最快的交換類(lèi)型,使更改能夠更快地顯示。您的應(yīng)用保持運(yùn)行,下次調(diào)用存根方法時(shí)會(huì)使用具有新實(shí)現(xiàn)的存根方法。 熱交換不會(huì)重新初始化您正在運(yùn)行的應(yīng)用中的對(duì)象。您需要重新啟動(dòng)當(dāng)前的行為,或者重新啟動(dòng)應(yīng)用才能看到特定更新。默認(rèn)情況下,Android Studio 在執(zhí)行熱交換后會(huì)自動(dòng)重新啟動(dòng)當(dāng)前的行為。如果您不想重新啟動(dòng),可以停用自動(dòng)行為重新啟動(dòng)。 |
| 通過(guò)溫和交換支持:這種交換速度也非常快,但 Instant Run 在將更改的資源推送至您的應(yīng)用時(shí)必須重新啟動(dòng)當(dāng)前的行為。您的應(yīng)用保持運(yùn)行,行為重新啟動(dòng)時(shí)屏幕上會(huì)出現(xiàn)小閃爍 - 這是正常情況。 |
結(jié)構(gòu)性的代碼更改,例如:
| 通過(guò)冷交換支持(API 級(jí)別 21 或更高):這種交換速度有點(diǎn)慢,因?yàn)楸M管不需要新的 APK,Instant Run 在推送結(jié)構(gòu)性的代碼更改時(shí)必須重新啟動(dòng)整個(gè)應(yīng)用。 對(duì)于運(yùn)行 API 級(jí)別 20 或更低的目標(biāo)設(shè)備,Android Studio 會(huì)部署完整的 APK。 |
| 對(duì)應(yīng)用的清單或清單引用的資源進(jìn)行更改時(shí),Android Studio 會(huì)自動(dòng)部署新構(gòu)建以應(yīng)用這些更改。這是因?yàn)樵O(shè)備上安裝了 APK 時(shí)應(yīng)用相關(guān)的特定信息(如它的名稱(chēng)、應(yīng)用圖標(biāo)資源和 Intent 過(guò)濾器)均通過(guò)清單確定。 如果您的構(gòu)建流程自動(dòng)更新應(yīng)用清單的任何部分,如自動(dòng)循環(huán)訪問(wèn)?versionCode?或versionName,您將無(wú)法體驗(yàn)到 Instant Run 的全部性能優(yōu)勢(shì)。使用 Instant Run 時(shí),您應(yīng)該在調(diào)試構(gòu)建變體中停用對(duì)應(yīng)用清單的任何部分進(jìn)行自動(dòng)更新。 更新 Android 小部件 UI 元素時(shí),您需要執(zhí)行清除并重新運(yùn)行以查看更改。或者,因?yàn)槭褂?Instant Run 時(shí)執(zhí)行整潔的構(gòu)建可能需要花費(fèi)較長(zhǎng)時(shí)間,您也可以在對(duì)小部件 UI 進(jìn)行更新時(shí)暫時(shí)停用 Instant Run。 |
注:如果您需要在崩潰后重新啟動(dòng)應(yīng)用,請(qǐng)不要從目標(biāo)設(shè)備啟動(dòng)應(yīng)用。從目標(biāo)設(shè)備重啟應(yīng)用將不會(huì)應(yīng)用自上次冷交換或增量構(gòu)建之后的任何代碼更改。要啟動(dòng)應(yīng)用并應(yīng)用所有最近的更改,請(qǐng)?jiān)?Android Studio 中點(diǎn)擊?Run?(或?Debug?)。
使用重新運(yùn)行
推送影響特定初始值設(shè)定項(xiàng)的代碼更改(例如對(duì)應(yīng)用的?onCreate()?方法的更改)時(shí),您需要重新啟動(dòng)應(yīng)用,以便使更改生效。要執(zhí)行增量構(gòu)建并重新啟動(dòng)應(yīng)用,請(qǐng)點(diǎn)擊?Rerun?。
如果您需要部署整潔的構(gòu)建,請(qǐng)從主菜單中選擇?Run?>?Clean and Rerun?,也可以在點(diǎn)擊?Rerun??時(shí)按住?Shift?鍵。此操作會(huì)停止運(yùn)行的應(yīng)用,執(zhí)行完整、整潔的構(gòu)建,然后將新的 APK 部署至您的目標(biāo)設(shè)備。
停用行為自動(dòng)重新啟動(dòng)
執(zhí)行熱交換時(shí),您的應(yīng)用會(huì)保持運(yùn)行,但 Android Studio 會(huì)自動(dòng)重新啟動(dòng)當(dāng)前的行為。要停用此默認(rèn)設(shè)置,請(qǐng)執(zhí)行以下操作:
- 在 Windows 或 Linux 上,從主菜單中選擇?File?>?Settings。
- 在 Mac OSX 上,從主菜單中選擇?Android Studio?>?Preferences。
如果停用活動(dòng)自動(dòng)重新啟動(dòng),您可以選擇?Run?>?Restart Activity,從菜單欄中手動(dòng)重新啟動(dòng)當(dāng)前的活動(dòng)。
針對(duì) Instant Run 配置和優(yōu)化您的項(xiàng)目
默認(rèn)情況下,Android Studio 會(huì)為使用 Android Plugin for Gradle 2.0.0 及更高版本構(gòu)建的項(xiàng)目啟用 Instant Run。
要使用最新版本的插件更新現(xiàn)有項(xiàng)目,請(qǐng)執(zhí)行以下操作:
導(dǎo)航至?Build, Execution, Deployment?>?Instant Run,然后點(diǎn)擊?Update Project,如圖 3 所示。
如果用于更新項(xiàng)目的選項(xiàng)未顯示,則說(shuō)明項(xiàng)目已經(jīng)帶有最新版本的 Android Plugin for Gradle,處于最新?tīng)顟B(tài)。
圖 3.更新現(xiàn)有項(xiàng)目的 Android Plugin for Gradle。
您還需要更改構(gòu)建變體才能開(kāi)始使用 Instant Run,將變體改為應(yīng)用的調(diào)試版本。
通過(guò)配置 DEX 資源縮短構(gòu)建時(shí)間
部署整潔的構(gòu)建時(shí),Android Studio 會(huì)將您的應(yīng)用設(shè)置為允許 Instant Run 推送代碼和資源更新。盡管更新正在運(yùn)行的應(yīng)用要快得多,第一次構(gòu)建卻可能需要較長(zhǎng)的時(shí)間才能完成。您可以通過(guò)配置多個(gè)?DexOptions?設(shè)置來(lái)加快構(gòu)建流程:
maxProcessCount- 在 Windows 上,請(qǐng)調(diào)用?gradlew --stop
- 在 Linux/Mac OSX 上,請(qǐng)調(diào)用?./gradlew --stop
下面的示例會(huì)在模塊級(jí)別的?build.gradle?文件中將?maxProcessCount?設(shè)為 4,以及將?javaMaxHeapSize?設(shè)為“2g”:
android {...dexOptions {maxProcessCount 4 // this is the default valuejavaMaxHeapSize "2g"} }您應(yīng)增大設(shè)置的值并觀察對(duì)構(gòu)建時(shí)間產(chǎn)生的影響,對(duì)這些設(shè)置進(jìn)行測(cè)試。如果您向 dexing 進(jìn)程分配過(guò)多的資源,則可能導(dǎo)致性能下降。
啟用 dexing-in-process 和增量 Java 編譯
Android Plugin for Gradle 版本 2.1.0?及更高版本還引入了其他的構(gòu)建流程改進(jìn),包括增量 Java 編譯和 dexing-in-process。增量 Java 編譯默認(rèn)情況下處于啟用狀態(tài),這種編譯方式僅對(duì)發(fā)生變化或需要重新編譯的源代碼部分進(jìn)行重新編譯,可以縮短開(kāi)發(fā)過(guò)程中的編譯時(shí)間。
dexing-in-process 在構(gòu)建流程而不是單獨(dú)的外部 VM 流程中執(zhí)行 dexing。這樣不僅可以讓增量構(gòu)建更快,也可以顯著提高完整構(gòu)建的速度。要啟用此功能,您需要將 Gradle 后臺(tái)進(jìn)程的最大堆大小設(shè)置為至少 2048 MB。要進(jìn)行設(shè)置,您可以將以下代碼包含到項(xiàng)目的?gradle.properties?文件中:
org.gradle.jvmargs = -Xmx2048m如果您已經(jīng)在模塊級(jí)別的?build.gradle?文件中為?javaMaxHeapSize?定義值,則需要將后臺(tái)進(jìn)程的最大堆大小設(shè)置為?javaMaxHeapSize?的值 + 1024 MB。例如,如果您已將?javaMaxHeapSize?設(shè)為“2g”,則需要將以下代碼添加到項(xiàng)目的?gradle.properties?文件中:
org.gradle.jvmargs = -Xmx3072m從 Windows Defender 中排除您的項(xiàng)目
在 Windows 系統(tǒng)上,Windows Defender 可能導(dǎo)致 Instant Run 的運(yùn)行速度變慢。如果您正在使用 Windows Defender,應(yīng)當(dāng)從 Windows Defender 惡意軟件掃描中排除您的 Android Studio 項(xiàng)目文件夾。
縮短使用 Crashlytics 時(shí)的構(gòu)建時(shí)間
如果您的 Fabric Gradle 插件版本低于 1.21.6,Crashlytics 可能會(huì)導(dǎo)致構(gòu)建時(shí)間變長(zhǎng)。要提升應(yīng)用開(kāi)發(fā)期間的構(gòu)建性能,您可以將插件升級(jí)到最新版本或者為您的調(diào)試構(gòu)建變體停用 Crashlytics。
Instant Run 的限制
大多數(shù)情況下,Instant Run 可以加快構(gòu)建和部署流程的速度。不過(guò),使用 Instant Run 時(shí)有一些限制因素可能影響其行為以及與您應(yīng)用的兼容性。如果您在使用 Instant Run 時(shí)遇到其他問(wèn)題,請(qǐng)?zhí)峤诲e(cuò)誤。
部署到多種設(shè)備
Instant Run 使用多種不同的技術(shù)執(zhí)行特定于目標(biāo)設(shè)備 API 級(jí)別的熱交換、溫和交換和冷交換。因此,同時(shí)將應(yīng)用部署到多種設(shè)備時(shí),Android Studio 會(huì)暫時(shí)關(guān)閉 Instant Run。
應(yīng)用的 Dalvik 可執(zhí)行文件分包
如果您的項(xiàng)目面向舊版 Dalvik 可執(zhí)行文件分包(即,使用?multiDexEnabled true?和?minSdkVersion 20?或更低版本配置?build.gradle)配置并且您將其部署到運(yùn)行 Android 4.4(API 級(jí)別 20)或更低版本系統(tǒng)的目標(biāo)設(shè)備上,Android Studio 會(huì)停用 Instant Run。
如果將?minSdkVersion?設(shè)為 21 或更高,Instant Run 會(huì)自動(dòng)將應(yīng)用配置為進(jìn)行 Dalvik 可執(zhí)行文件分包。由于 Instant Run 僅適用于調(diào)試版本的應(yīng)用,在部署發(fā)布構(gòu)建變體時(shí),您需要配置應(yīng)用進(jìn)行 Dalvik 可執(zhí)行文件分包。
運(yùn)行儀器測(cè)試和性能分析器
儀器測(cè)試會(huì)將調(diào)試 APK 和測(cè)試 APK 同時(shí)加載到測(cè)試設(shè)備上的相同進(jìn)程中,這樣,控制方法可以替換應(yīng)用的正常生命周期并執(zhí)行測(cè)試。在運(yùn)行或調(diào)試儀器測(cè)試時(shí),Android Studio 不會(huì)注入 Instant Run 需要的其他方法并將此功能關(guān)閉。
分析應(yīng)用時(shí),您應(yīng)停用 Instant Run。使用 Instant Run 會(huì)輕微影響性能,而替換具有熱交換的方法則會(huì)產(chǎn)生稍大的影響。這種性能影響會(huì)干擾性能分析工具提供的信息。此外,每次熱交換生成的存根方法都會(huì)使堆疊追蹤變得復(fù)雜。
使用第三方插件
使用 Instant Run 時(shí),Android Studio 會(huì)暫時(shí)停用 Java Code Coverage Library (JaCoCo) 和 ProGuard。由于 Instant Run 僅適用于調(diào)試版本,停用不會(huì)影響您的發(fā)布版本。
某些執(zhí)行字節(jié)碼增強(qiáng)的第三方插件可能會(huì)對(duì) Instant Run 設(shè)置應(yīng)用的方式造成影響。如果您遇到這些問(wèn)題,但是想要繼續(xù)使用 Instant Run,那么應(yīng)針對(duì)您的調(diào)試構(gòu)建變體停用這些插件。您還可以通過(guò)提交錯(cuò)誤的方式幫助提升與第三方插件的兼容性。
將更改推送至多進(jìn)程應(yīng)用
為了執(zhí)行熱交換和溫和交換,Instant Run 僅設(shè)置應(yīng)用的主進(jìn)程。將代碼更改(例如對(duì)方法實(shí)現(xiàn)或現(xiàn)有資源的更改)推送至其他應(yīng)用進(jìn)程時(shí),Instant Run 會(huì)執(zhí)行冷交換。
停用 Instant Run
要停用 Instant Run,請(qǐng)執(zhí)行以下操作:
總結(jié)
以上是生活随笔為你收集整理的关于Gradle的Instant Run的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《捷哥浅谈Drupal》第三弹之Drup
- 下一篇: 注意函数定义和函数调用的顺序