Android Instant Run 熱更新

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 在將更改的資源推送至您的應用時必須重新啓動當前的行爲。您的應用保持運行,行爲重新啓動時屏幕上會出現小閃爍 - 這是正常情況。
結構性的代碼更改,例如:
  • 添加、移除或更改:
    • 註釋
    • 實例字段
    • 靜態字段
    • 靜態方法簽名
    • 實例方法簽名
  • 更改當前類從其繼承的父類
  • 更改實現的界面列表
  • 更改類的靜態初始值設定項
  • 對使用動態資源 ID 的佈局元素重新排序

通過冷交換支持(API 級別 21 或更高):這種交換速度有點慢,因爲儘管不需要新的 APK,Instant Run 在推送結構性的代碼更改時必須重新啓動整個應用。

對於運行 API 級別 20 或更低的目標設備,Android Studio 會部署完整的 APK。

  • 更改應用清單
  • 更改應用清單引用的資源
  • 更改 Android 小部件 UI 元素(需要清除並重新運行

對應用的清單或清單引用的資源進行更改時,Android Studio 會自動部署新構建以應用這些更改。這是因爲設備上安裝了 APK 時應用相關的特定信息(如它的名稱、應用圖標資源和 Intent 過濾器)均通過清單確定。

如果您的構建流程自動更新應用清單的任何部分,如自動循環訪問 versionCode 或 versionName,您將無法體驗到 Instant Run 的全部性能優勢。使用 Instant Run 時,您應該在調試構建變體中停用對應用清單的任何部分進行自動更新。

更新 Android 小部件 UI 元素時,您需要執行清除並重新運行以查看更改。或者,因爲使用 Instant Run 時執行整潔的構建可能需要花費較長時間,您也可以在對小部件 UI 進行更新時暫時停用 Instant Run

:如果您需要在崩潰後重新啓動應用,請不要從目標設備啓動應用。從目標設備重啓應用將不會應用自上次冷交換或增量構建之後的任何代碼更改。要啓動應用並應用所有最近的更改,請在 Android Studio 中點擊 Run (或 Debug )。

使用重新運行

推送影響特定初始值設定項的代碼更改(例如對應用的 onCreate() 方法的更改)時,您需要重新啓動應用,以便使更改生效。要執行增量構建並重新啓動應用,請點擊 Rerun 

如果您需要部署整潔的構建,請從主菜單中選擇 Run > Clean and Rerun ,也可以在點擊 Rerun  時按住 Shift 鍵。此操作會停止運行的應用,執行完整、整潔的構建,然後將新的 APK 部署至您的目標設備。

停用行爲自動重新啓動

執行熱交換時,您的應用會保持運行,但 Android Studio 會自動重新啓動當前的行爲。要停用此默認設置,請執行以下操作:

  1. 打開 Settings 或 Preferences 對話框:
    • 在 Windows 或 Linux 上,從主菜單中選擇 File > Settings
    • 在 Mac OSX 上,從主菜單中選擇 Android Studio > Preferences
  2. 導航至 Build, Execution, Deployment > Instant Run
  3. 取消選中 Restart activity on code changes 旁邊的方框。

如果停用活動自動重新啓動,您可以選擇 Run > Restart Activity,從菜單欄中手動重新啓動當前的活動。

針對 Instant Run 配置和優化您的項目

默認情況下,Android Studio 會爲使用 Android Plugin for Gradle 2.0.0 及更高版本構建的項目啓用 Instant Run。

要使用最新版本的插件更新現有項目,請執行以下操作:

  1. 打開 Settings 或者 Preferences 對話框。
  2. 導航至 Build, Execution, Deployment > Instant Run,然後點擊 Update Project,如圖 3 所示。

    如果用於更新項目的選項未顯示,則說明項目已經帶有最新版本的 Android Plugin for Gradle,處於最新狀態。

    圖 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
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,請執行以下操作:

  1. 打開 Settings 或者 Preferences 對話框。
  2. 導航至 Build, Execution, Deployment > Instant Run
  3. 取消選中 Enable Instant Run 旁邊的方框。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章