关于Gradle的Instant Run
? ? ? ? Android Studio 2.0之后的版本支持Instant Run,可以加快編譯的速度,提高工作效率。建議大家都將Android Studio升級到2.0之后的版本。官網升級地址https://developer.android.com/studio/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 如何工作的快速摘要,請參見下表。
| 通過熱交換支持:這是最快的交換類型,使更改能夠更快地顯示。您的應用保持運行,下次調用存根方法時會使用具有新實現的存根方法。 熱交換不會重新初始化您正在運行的應用中的對象。您需要重新啟動當前的行為,或者重新啟動應用才能看到特定更新。默認情況下,Android Studio 在執行熱交換后會自動重新啟動當前的行為。如果您不想重新啟動,可以停用自動行為重新啟動。 |
| 通過溫和交換支持:這種交換速度也非常快,但 Instant Run 在將更改的資源推送至您的應用時必須重新啟動當前的行為。您的應用保持運行,行為重新啟動時屏幕上會出現小閃爍 - 這是正常情況。 |
結構性的代碼更改,例如:
| 通過冷交換支持(API 級別 21 或更高):這種交換速度有點慢,因為盡管不需要新的 APK,Instant Run 在推送結構性的代碼更改時必須重新啟動整個應用。 對于運行 API 級別 20 或更低的目標設備,Android Studio 會部署完整的 APK。 |
| 對應用的清單或清單引用的資源進行更改時,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 會自動重新啟動當前的行為。要停用此默認設置,請執行以下操作:
- 在 Windows 或 Linux 上,從主菜單中選擇?File?>?Settings。
- 在 Mac OSX 上,從主菜單中選擇?Android Studio?>?Preferences。
如果停用活動自動重新啟動,您可以選擇?Run?>?Restart Activity,從菜單欄中手動重新啟動當前的活動。
針對 Instant Run 配置和優化您的項目
默認情況下,Android Studio 會為使用 Android Plugin for Gradle 2.0.0 及更高版本構建的項目啟用 Instant Run。
要使用最新版本的插件更新現有項目,請執行以下操作:
導航至?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- 在 Windows 上,請調用?gradlew --stop
- 在 Linux/Mac OSX 上,請調用?./gradlew --stop
下面的示例會在模塊級別的?build.gradle?文件中將?maxProcessCount?設為 4,以及將?javaMaxHeapSize?設為“2g”:
android {...dexOptions {maxProcessCount 4 // this is the default valuejavaMaxHeapSize "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,請執行以下操作:
總結
以上是生活随笔為你收集整理的关于Gradle的Instant Run的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《捷哥浅谈Drupal》第三弹之Drup
- 下一篇: 注意函数定义和函数调用的顺序