原文:https://developer.android.com/studio/run/index.html#instant-run
一熟吏、Instant Run簡介和支持條件
1.簡介:
Android Studio 2.0中引入的Instant Run是Run和Debug命令的行為,可以大幅縮短應用更新的時間潭陪。盡管首次構建可能需要花費較長的時間医寿,Instant Run在向應用推送后續(xù)更新時則無需構建新的APK顿痪,因此,這樣可以更快地看到更改滔灶。
2.支持條件:
- Debug版本
- gradle插件版本2.0.0或更高版本
- minSdkVersion設置為15或以上普碎,21或更高效果會更佳
二、Instant Run設置和執(zhí)行
1.設置:
Settings > Build, Execution, Deployment > Instant Run
2.執(zhí)行:
部署應用后录平,Run按鈕(或Debug按鈕)中會出現黃色的小閃電圖標麻车,表明Instant Run已經準備好在您下次點擊按鈕時推送更新。無需構建新的APK即可推送新的更改斗这,一些情況下动猬,應用甚至無需重啟就可以立即顯示代碼更改的效果。
3.Instant Run推送更新的類型:
Instant Run通過執(zhí)行熱交換表箭、溫和交換或冷交換向連接的設備或模擬器推送更新的代碼和資源赁咙。它會根據所做更改的類型自動確定要執(zhí)行的交換類型。
不同修改類型執(zhí)行的交換類型:
1>.更改現有方法的實現代碼
通過熱交換支持免钻,這是最快的交換類型彼水,使更改能夠更快地顯示。
熱交換不會重新初始化正在運行的應用中的對象极舔。您需要重新啟動當前的Activity凤覆,或者重新啟動應用才能看到特定更新。默認情況下拆魏,Android Studio在執(zhí)行熱交換后會自動restart activity盯桦。如果不想重新啟動,可以在上圖的Instant Run設置中停用自動行為重新啟動渤刃。
2>.更改或移除現有資源
通過溫和交換支持拥峦,這種交換速度也非常快卖子,但Instant Run在將更改的資源推送至應用時必須restart activity略号。應用保持運行,Activity重新啟動時屏幕上會出現小閃爍洋闽,這是正常情況璃哟。
3>.結構性修改代碼
結構性修改代碼,比如添加喊递、移除或更改(注釋随闪、字段),更改實現的界面列表骚勘,更改類的靜態(tài)初始值設定項铐伴,更改當前類從其繼承的父類
對于API級別21或更高版本的目標設備撮奏,通過冷交換支持,這種交換速度有點慢当宴,因為盡管不需要新的 APK畜吊,Instant Run在推送結構性的代碼更改時必須重新啟動整個應用。
對于運行API級別20或更低的目標設備户矢,Android Studio會部署完整的APK玲献。
4>.更改應用清單文件、更改清單文件引用的資源梯浪、更改Android小部件UI元素
對應用的清單或清單引用的資源進行更改時捌年,Android Studio會自動部署新構建以應用這些更改。這是因為設備上安裝了APK時應用相關的特定信息(如它的名稱挂洛、應用圖標資源和Intent過濾器)均通過清單確定礼预。
更新 Android小部件UI元素時,您需要執(zhí)行重新運行虏劲。
備注:如果您需要在崩潰后重新啟動應用托酸,請不要從目標設備啟動應用。從目標設備重啟應用將不會應用自上次冷交換或增量構建之后的任何代碼更改柒巫。要啟動應用并應用所有最近的更改励堡,請在 Android Studio 中點擊Run或Debug。
4.使用重新運行:
推送影響特定初始值設定項的代碼更改(例如對應用的onCreate()方法的更改)時堡掏,您需要重新啟動應用念秧,以便使更改生效。要執(zhí)行增量構建并重新啟動應用布疼,請點擊Rerun。
如果您需要部署整潔的構建币狠,請從主菜單中選擇Run>Clean and Rerun游两,也可以在點擊Rerun時按住Shift鍵。此操作會停止運行的應用漩绵,執(zhí)行完整贱案、整潔的構建,然后將新的APK部署至您的目標設備止吐。
三、針對Instant Run配置和優(yōu)化項目
1.通過配置DEX資源縮短構建時間
maxProcessCount瘩燥,設置可以并行啟動的 DEX 進程的最大數量不同。
javaMaxHeapSize溶耘,設置dex操作的最大內存分配池大小凳兵。
android {
...
dexOptions {
maxProcessCount 4 // this is the default value
javaMaxHeapSize "2g"
}
}
進行設置時企软,需要增大設置的值并觀察對構建時間產生的影響仗哨,對這些設置進行測試。如果您向dexing 進程分配過多的資源藻治,則可能導致性能下降桩卵。
2.啟用 dexing-in-process和增量Java編譯
gradle插件2.1.0及以上版本才支持dexing-in-process和增量Java編譯。
增量Java編譯默認情況下處于啟用狀態(tài)胜嗓,這種編譯方式僅對發(fā)生變化或需要重新編譯的源代碼部分進行重新編譯钩乍,可以縮短開發(fā)過程中的編譯時間。
dexing-in-process在構建流程而不是單獨的外部VM流程中執(zhí)行dexing变过。這樣不僅可以讓增量構建更快媚狰,也可以顯著提高完整構建的速度阔拳。要啟用此功能,您需要將 Gradle 后臺進程的最大堆大小設置為至少 2048 MB辨宠。要進行設置货裹,您可以將以下代碼包含到項目的gradle.properties文件中:
org.gradle.jvmargs = -Xmx2048m
如果您已經在模塊級別的build.gradle文件中為javaMaxHeapSize定義值弧圆,則需要將后臺進程的最大堆大小設置為javaMaxHeapSize的值+1024MB还最。例如拓轻,如果您已將javaMaxHeapSize設為“2g”经伙,則需要將以下代碼添加到項目的gradle.properties文件中:
org.gradle.jvmargs = -Xmx3072
四帕膜、Instant Run的限制
大多數情況下,Instant Run可以加快構建和部署流程的速度达吞。不過荒典,使用 Instant Run時有一些限制因素可能影響其行為以及應用的兼容性寺董。
1.部署到多種設備
Instant Run使用多種不同的技術執(zhí)行特定于目標設備API 級別的熱交換、溫和交換和冷交換滩字。因此御吞,同時將應用部署到多種設備時陶珠,Android Studio會暫時關閉Instant Run。
2.應用的Dalvik可執(zhí)行文件分包
如果項目面向舊版Dalvik可執(zhí)行文件分包(即背率,使用multiDexEnabled true和minSdkVersion 20或更低版本配置)配置并且您將其部署到運行Android 4.4(API 級別20)或更低版本系統(tǒng)的目標設備上寝姿,Android Studio 會停用 Instant Run饵筑。
如果將minSdkVersion設為21或更高处坪,Instant Run會自動將應用配置為進行Dalvik可執(zhí)行文件分包架专。由于Instant Run僅適用于Debug版本的應用部脚,在部署發(fā)布構建變體時裤纹,需要配置應用進行Dalvik 可執(zhí)行文件分包(在defaultConfig中配置 multiDexEnabled true)。
3.使用第三方插件
使用 Instant Run 時锡移,Android Studio 會暫時停用 Java Code Coverage Library (JaCoCo) 和 ProGuard淆珊。由于 Instant Run 僅適用于調試版本奸汇,停用不會影響您的發(fā)布版本茫蛹。
4.將更改推送至多進程應用
為了執(zhí)行熱交換和溫和交換婴洼,Instant Run 僅設置應用的主進程。將代碼更改(例如對方法實現或現有資源的更改)推送至其他應用進程時欢唾,Instant Run 會執(zhí)行冷交換粉捻。