https://developer.android.com/studio/run/index.html
關於 Instant Run
Android Studio 2.0 中引入的 Instant Run 是 Run 和 Debug 命令的行爲,可以大幅縮短應用更新的時間。儘管首次構建可能需要花費較長的時間,Instant Run 在嚮應用推送後續更新時則無需構建新的 APK,因此,這樣可以更快地看到更改。
僅在您部署調試構建變體、使用 Android Plugin for Gradle 版本 2.0.0 或更高版本,以及在應用的模塊級別 build.gradle
文件中將 minSdkVersion
設置爲 15 或以上時,Instant Run 才受支持。爲獲得最佳性能,可以將 minSdkVersion
設置爲 21 或更高。
部署應用後,Run 按鈕(或 Debug 按鈕)中會出現黃色的小閃電圖標,表明 Instant Run 已經準備好在您下次點擊按鈕時推送更新。無需構建新的 APK 即可推送新的更改,一些情況下,應用甚至無需重啓就可以立即顯示代碼更改的效果。
Instant Run 通過執行熱交換、溫和交換或冷交換向連接的設備或模擬器推送更新的代碼和資源。它會根據所做更改的類型自動確定要執行的交換類型。上面的視頻提供了有關所有這些如何在後臺運行的十分有趣的詳細信息。要獲得您將特定代碼更改推送至目標設備時 Instant Run 如何工作的快速摘要,請參見下表。
代碼更改 | Instant Run 行爲 |
---|---|
|
通過熱交換支持:這是最快的交換類型,使更改能夠更快地顯示。您的應用保持運行,下次調用存根方法時會使用具有新實現的存根方法。 熱交換不會重新初始化您正在運行的應用中的對象。您需要重新啓動當前的行爲,或者重新啓動應用才能看到特定更新。默認情況下,Android Studio 在執行熱交換後會自動重新啓動當前的行爲。如果您不想重新啓動,可以停用自動行爲重新啓動。 |
|
通過溫和交換支持:這種交換速度也非常快,但 Instant Run 在將更改的資源推送至您的應用時必須重新啓動當前的行爲。您的應用保持運行,行爲重新啓動時屏幕上會出現小閃爍 - 這是正常情況。 |
結構性的代碼更改,例如:
|
通過冷交換支持(API 級別 21 或更高):這種交換速度有點慢,因爲儘管不需要新的 APK,Instant Run 在推送結構性的代碼更改時必須重新啓動整個應用。 對於運行 API 級別 20 或更低的目標設備,Android Studio 會部署完整的 APK。 |
|
對應用的清單或清單引用的資源進行更改時,Android Studio 會自動部署新構建以應用這些更改。這是因爲設備上安裝了 APK 時應用相關的特定信息(如它的名稱、應用圖標資源和 Intent 過濾器)均通過清單確定。 如果您的構建流程自動更新應用清單的任何部分,如自動循環訪問 更新 Android 小部件 UI 元素時,您需要執行清除並重新運行以查看更改。或者,因爲使用 Instant Run 時執行整潔的構建可能需要花費較長時間,您也可以在對小部件 UI 進行更新時暫時停用 Instant Run。 |
注:如果您需要在崩潰後重新啓動應用,請不要從目標設備啓動應用。從目標設備重啓應用將不會應用自上次冷交換或增量構建之後的任何代碼更改。要啓動應用並應用所有最近的更改,請在 Android Studio 中點擊 Run (或 Debug )。
使用重新運行
推送影響特定初始值設定項的代碼更改(例如對應用的 onCreate()
方法的更改)時,您需要重新啓動應用,以便使更改生效。要執行增量構建並重新啓動應用,請點擊 Rerun 。
如果您需要部署整潔的構建,請從主菜單中選擇 Run > Clean and Rerun ,也可以在點擊 Rerun 時按住 Shift 鍵。此操作會停止運行的應用,執行完整、整潔的構建,然後將新的 APK 部署至您的目標設備。
停用行爲自動重新啓動
執行熱交換時,您的應用會保持運行,但 Android Studio 會自動重新啓動當前的行爲。要停用此默認設置,請執行以下操作:
- 打開 Settings 或 Preferences 對話框:
- 在 Windows 或 Linux 上,從主菜單中選擇 File > Settings。
- 在 Mac OSX 上,從主菜單中選擇 Android Studio > Preferences。
- 導航至 Build, Execution, Deployment > Instant Run。
- 取消選中 Restart activity on code changes 旁邊的方框。
如果停用活動自動重新啓動,您可以選擇 Run > Restart Activity,從菜單欄中手動重新啓動當前的活動。
針對 Instant Run 配置和優化您的項目
默認情況下,Android Studio 會爲使用 Android Plugin for Gradle 2.0.0 及更高版本構建的項目啓用 Instant Run。
要使用最新版本的插件更新現有項目,請執行以下操作:
- 打開 Settings 或者 Preferences 對話框。
-
導航至 Build, Execution, Deployment > Instant Run,然後點擊 Update Project,如圖 3 所示。
如果用於更新項目的選項未顯示,則說明項目已經帶有最新版本的 Android Plugin for Gradle,處於最新狀態。
您還需要更改構建變體才能開始使用 Instant Run,將變體改爲應用的調試版本。
通過配置 DEX 資源縮短構建時間
部署整潔的構建時,Android Studio 會將您的應用設置爲允許 Instant Run 推送代碼和資源更新。儘管更新正在運行的應用要快得多,第一次構建卻可能需要較長的時間才能完成。您可以通過配置多個 DexOptions
設置來加快構建流程:
-
maxProcessCount
- 設置可以並行啓動的 DEX 進程的最大數量。如果 Gradle 後臺進程已在運行,您需要先停止此進程,然後使用新的最大進程數進行初始化。您可以從 Terminal 窗口中調用下面的一種函數來終止 Gradle 後臺進程:
- 在 Windows 上,請調用
gradlew --stop
- 在 Linux/Mac OSX 上,請調用
./gradlew --stop
- 在 Windows 上,請調用
javaMaxHeapSize
- 設置 dex 操作的最大內存分配池大小。傳遞值時,您可以附加字母“k”來表示千字節,附加“m”表示兆字節,或者附加“g”表示千兆字節。
下面的示例會在模塊級別的 build.gradle
文件中將 maxProcessCount
設爲 4,以及將 javaMaxHeapSize
設爲“2g”:
android { ... dexOptions { maxProcessCount 4 // this is the default value javaMaxHeapSize "2g" } }
您應增大設置的值並觀察對構建時間產生的影響,對這些設置進行測試。如果您向 dexing 進程分配過多的資源,則可能導致性能下降。
啓用 dexing-in-process 和增量 Java 編譯
Android Plugin for Gradle 版本 2.1.0 及更高版本還引入了其他的構建流程改進,包括增量 Java 編譯和 dexing-in-process。增量 Java 編譯默認情況下處於啓用狀態,這種編譯方式僅對發生變化或需要重新編譯的源代碼部分進行重新編譯,可以縮短開發過程中的編譯時間。
dexing-in-process 在構建流程而不是單獨的外部 VM 流程中執行 dexing。這樣不僅可以讓增量構建更快,也可以顯著提高完整構建的速度。要啓用此功能,您需要將 Gradle 後臺進程的最大堆大小設置爲至少 2048 MB。要進行設置,您可以將以下代碼包含到項目的 gradle.properties
文件中:
org.gradle.jvmargs = -Xmx2048m
如果您已經在模塊級別的 build.gradle
文件中爲 javaMaxHeapSize
定義值,則需要將後臺進程的最大堆大小設置爲 javaMaxHeapSize
的值
+ 1024 MB。例如,如果您已將 javaMaxHeapSize
設爲“2g”,則需要將以下代碼添加到項目的 gradle.properties
文件中:
org.gradle.jvmargs = -Xmx3072m
從 Windows Defender 中排除您的項目
在 Windows 系統上,Windows Defender 可能導致 Instant Run 的運行速度變慢。如果您正在使用 Windows Defender,應當從 Windows Defender 惡意軟件掃描中排除您的 Android Studio 項目文件夾。
縮短使用 Crashlytics 時的構建時間
如果您的 Fabric Gradle 插件版本低於 1.21.6,Crashlytics 可能會導致構建時間變長。要提升應用開發期間的構建性能,您可以將插件升級到最新版本或者爲您的調試構建變體停用 Crashlytics。
Instant Run 的限制
大多數情況下,Instant Run 可以加快構建和部署流程的速度。不過,使用 Instant Run 時有一些限制因素可能影響其行爲以及與您應用的兼容性。如果您在使用 Instant Run 時遇到其他問題,請提交錯誤。
部署到多種設備
Instant Run 使用多種不同的技術執行特定於目標設備 API 級別的熱交換、溫和交換和冷交換。因此,同時將應用部署到多種設備時,Android Studio 會暫時關閉 Instant Run。
應用的 Dalvik 可執行文件分包
如果您的項目面向舊版 Dalvik 可執行文件分包(即,使用 multiDexEnabled true
和 minSdkVersion 20
或更低版本配置 build.gradle
)配置並且您將其部署到運行
Android 4.4(API 級別 20)或更低版本系統的目標設備上,Android Studio 會停用 Instant Run。
如果將 minSdkVersion
設爲 21 或更高,Instant Run 會自動將應用配置爲進行 Dalvik 可執行文件分包。由於 Instant Run 僅適用於調試版本的應用,在部署發佈構建變體時,您需要配置應用進行
Dalvik 可執行文件分包。
運行儀器測試和性能分析器
儀器測試會將調試 APK 和測試 APK 同時加載到測試設備上的相同進程中,這樣,控制方法可以替換應用的正常生命週期並執行測試。在運行或調試儀器測試時,Android Studio 不會注入 Instant Run 需要的其他方法並將此功能關閉。
分析應用時,您應停用 Instant Run。使用 Instant Run 會輕微影響性能,而替換具有熱交換的方法則會產生稍大的影響。這種性能影響會干擾性能分析工具提供的信息。此外,每次熱交換生成的存根方法都會使堆疊追蹤變得複雜。
使用第三方插件
使用 Instant Run 時,Android Studio 會暫時停用 Java Code Coverage Library (JaCoCo) 和 ProGuard。由於 Instant Run 僅適用於調試版本,停用不會影響您的發佈版本。
某些執行字節碼增強的第三方插件可能會對 Instant Run 設置應用的方式造成影響。如果您遇到這些問題,但是想要繼續使用 Instant Run,那麼應針對您的調試構建變體停用這些插件。您還可以通過提交錯誤的方式幫助提升與第三方插件的兼容性。
將更改推送至多進程應用
爲了執行熱交換和溫和交換,Instant Run 僅設置應用的主進程。將代碼更改(例如對方法實現或現有資源的更改)推送至其他應用進程時,Instant Run 會執行冷交換。
停用 Instant Run
要停用 Instant Run,請執行以下操作:
- 打開 Settings 或者 Preferences 對話框。
- 導航至 Build, Execution, Deployment > Instant Run。
- 取消選中 Enable Instant Run 旁邊的方框。