文章來源:https://developer.android.com/studio/run/index.html
默認情況下,Android Studio 僅需點擊幾下即可設置要部署至模擬器或物理設備的新項目。使用 Instant Run,您無需構(gòu)建新的 APK,就可以將更改推送至方法,將現(xiàn)有應用資源推送至正在運行的應用,所以幾乎立刻就能看到代碼更改。
要構(gòu)建和運行應用,請點擊?Run?
。Android Studio 使用 Gradle 構(gòu)建您的應用,會要求您選擇部署目標(模擬器或連接的設備),然后將您的應用部署至目標。您可以通過更改運行配置自定義一些這樣的默認行為,例如選擇自動部署目標。
如果想要使用 Android Emulator?運行您的應用,您需要準備好 Android Virtual Device (AVD)。如果您尚未創(chuàng)建模擬器,點擊?Run?后,在?Select Deployment Target?對話框中點擊?Create New Emulator。按照 Virtual Device Configuration 向?qū)Р僮鳎x您想要模擬的設備類型。如需了解詳細信息,請參閱創(chuàng)建和管理虛擬設備。
如果您正在使用物理 Android 設備,則需要在設備上啟用 USB 調(diào)試。如需了解詳細信息,請參閱在硬件設備上運行應用。
注:您也可以通過點擊?Debug?
,在調(diào)試模式下部署應用。在調(diào)試模式下運行應用讓您可以在代碼中設置斷點、在運行時檢查變體和評估表達式,以及運行調(diào)試工具。如需了解詳細信息,請參閱調(diào)試應用。
選擇和構(gòu)建不同模塊
如果您的項目除默認應用模塊之外還有多個模塊,可以執(zhí)行以下操作來構(gòu)建特定模塊:
在?Project?面板中選擇模塊,然后點擊?Build > Make Module?module-name。
Android Studio 使用 Gradle 構(gòu)建模塊。模塊構(gòu)建后,如果您已經(jīng)為新應用或新設備構(gòu)建了模塊,可以運行和調(diào)試模塊;或者如果您已構(gòu)建了庫或 Google 云模塊,可以將其用作依賴項。
要運行構(gòu)建的應用模塊,請執(zhí)行以下操作:
點擊?Run > Run,然后從 Run 對話框中選擇模塊。
更改運行/調(diào)試配置
運行/調(diào)試配置指定要運行的模塊、要部署的軟件包、要啟動的行為、目標設備、模擬器設置、logcat 選項,等等。默認運行/調(diào)試配置會啟動默認項目行為并使用?Select Deployment Target?對話框選擇目標設備。如果默認設置不適合您的項目或模塊,您可以自定義運行/調(diào)試配置,也可以在項目、默認和模塊級別創(chuàng)建新配置。要編輯運行/調(diào)試配置,請選擇?Run?>?Edit Configurations。如需了解詳細信息,請參閱創(chuàng)建和編輯運行/調(diào)試配置。
更改構(gòu)建變體
默認情況下,在您點擊?Run?后,Android Studio 可以構(gòu)建應用的調(diào)試版本,不過僅用于測試目的。您需要構(gòu)建發(fā)布版本,為應用公開發(fā)布做準備。
要更改 Android Studio 使用的構(gòu)建變體,請轉(zhuǎn)到?Build?>?Select Build Variant,然后從下拉菜單中選擇不同的變體。默認情況下,新項目使用調(diào)試和發(fā)布構(gòu)建變體進行設置。
使用產(chǎn)品定制,您可以為不同版本的應用(每個版本的應用均具有不同功能或設備要求)創(chuàng)建其他的構(gòu)建變體。要了解有關(guān)構(gòu)建變體和產(chǎn)品定制的詳細信息,請參閱配置構(gòu)建。
監(jiān)控構(gòu)建流程
您可以通過點擊?Gradle Console?
?來查看與構(gòu)建流程相關(guān)的詳細信息??刂婆_會顯示為構(gòu)建應用 Gradle 執(zhí)行的每個任務,如圖 1 所示。
圖 1.Android Studio 中的 Gradle 控制臺。
如果您的構(gòu)建變體使用產(chǎn)品定制,Gradle 也會調(diào)用任務來構(gòu)建這些產(chǎn)品定制。要查看所有可用構(gòu)建任務的列表,請點擊 IDE 窗口右側(cè)的?Gradle?
。
如果構(gòu)建過程中出現(xiàn)錯誤,會出現(xiàn)?Messages?窗口,對問題進行具體描述。Gradle 會建議一些命令行選項來幫助您解決問題,例如?--stacktrace?或?--debug。要在構(gòu)建流程中使用命令行選項,請執(zhí)行以下操作:
打開?Settings?或?Preferences?對話框:?
在 Windows 或 Linux 上,從主菜單中選擇?File?>?Settings。
在 Mac OSX 上,從主菜單中選擇?Android Studio?>?Preferences。
導航至?Build, Execution, Deployment?>?Compiler。
在?Command-line Options?旁的文本字段中,輸入您的命令行選項。
點擊?OK?保存,然后退出。
Gradle 會在下次您嘗試構(gòu)建應用時應用這些命令行選項。
生成 APK
點擊?Run?時,Android Studio 會生成調(diào)試 APK 并將其部署至您的目標設備。在您生成用于公開分發(fā)的應用發(fā)布版本前,必須首先學習如何簽署應用。然后,您可以生成多個調(diào)試或發(fā)布構(gòu)建變體的簽署 APK。要定位生成的 APK 文件,請點擊彈出對話框中的鏈接,如圖 2 所示。
圖 2.點擊鏈接定位已生成的 APK 文件。
關(guān)于 Instant Run
Android Studio 2.0 中引入的 Instant Run 是?Run?
?和?Debug?
?命令的行為,可以大幅縮短應用更新的時間。盡管首次構(gòu)建可能需要花費較長的時間,Instant Run 在向應用推送后續(xù)更新時則無需構(gòu)建新的 APK,因此,這樣可以更快地看到更改。
僅在您部署調(diào)試構(gòu)建變體、使用 Android Plugin for Gradle 版本 2.0.0 或更高版本,以及在應用的模塊級別?build.gradle?文件中將?minSdkVersion?設置為 15 或以上時,Instant Run 才受支持。為獲得最佳性能,可以將?minSdkVersion?設置為 21 或更高。
部署應用后,Run?
?按鈕(或?Debug?
?按鈕)中會出現(xiàn)黃色的小閃電圖標,表明 Instant Run 已經(jīng)準備好在您下次點擊按鈕時推送更新。無需構(gòu)建新的 APK 即可推送新的更改,一些情況下,應用甚至無需重啟就可以立即顯示代碼更改的效果。
Instant Run 通過執(zhí)行熱交換、溫和交換或冷交換向連接的設備或模擬器推送更新的代碼和資源。它會根據(jù)所做更改的類型自動確定要執(zhí)行的交換類型。上面的視頻提供了有關(guān)所有這些如何在后臺運行的十分有趣的詳細信息。要獲得您將特定代碼更改推送至目標設備時 Instant Run 如何工作的快速摘要,請參見下表。
代碼更改Instant Run 行為
更改現(xiàn)有方法的實現(xiàn)代碼通過熱交換支持:這是最快的交換類型,使更改能夠更快地顯示。您的應用保持運行,下次調(diào)用存根方法時會使用具有新實現(xiàn)的存根方法。
熱交換不會重新初始化您正在運行的應用中的對象。您需要重新啟動當前的行為,或者重新啟動應用才能看到特定更新。默認情況下,Android Studio 在執(zhí)行熱交換后會自動重新啟動當前的行為。如果您不想重新啟動,可以停用自動行為重新啟動。
更改或移除現(xiàn)有資源通過溫和交換支持:這種交換速度也非???,但 Instant Run 在將更改的資源推送至您的應用時必須重新啟動當前的行為。您的應用保持運行,行為重新啟動時屏幕上會出現(xiàn)小閃爍 - 這是正常情況。
結(jié)構(gòu)性的代碼更改,例如:?
添加、移除或更改:?
注釋
實例字段
靜態(tài)字段
靜態(tài)方法簽名
實例方法簽名
更改當前類從其繼承的父類
更改實現(xiàn)的界面列表
更改類的靜態(tài)初始值設定項
對使用動態(tài)資源 ID 的布局元素重新排序
通過冷交換支持(API 級別 21 或更高):這種交換速度有點慢,因為盡管不需要新的 APK,Instant Run 在推送結(jié)構(gòu)性的代碼更改時必須重新啟動整個應用。
對于運行 API 級別 20 或更低的目標設備,Android Studio 會部署完整的 APK。
更改應用清單
更改應用清單引用的資源
更改 Android 小部件 UI 元素(需要清除并重新運行)
對應用的清單或清單引用的資源進行更改時,Android Studio 會自動部署新構(gòu)建以應用這些更改。這是因為設備上安裝了 APK 時應用相關(guān)的特定信息(如它的名稱、應用圖標資源和 Intent 過濾器)均通過清單確定。
如果您的構(gòu)建流程自動更新應用清單的任何部分,如自動循環(huán)訪問?versionCode?或?versionName,您將無法體驗到 Instant Run 的全部性能優(yōu)勢。使用 Instant Run 時,您應該在調(diào)試構(gòu)建變體中停用對應用清單的任何部分進行自動更新。
更新 Android 小部件 UI 元素時,您需要執(zhí)行清除并重新運行以查看更改?;蛘?,因為使用 Instant Run 時執(zhí)行整潔的構(gòu)建可能需要花費較長時間,您也可以在對小部件 UI 進行更新時暫時停用 Instant Run。
注:如果您需要在崩潰后重新啟動應用,請不要從目標設備啟動應用。從目標設備重啟應用將不會應用自上次冷交換或增量構(gòu)建之后的任何代碼更改。要啟動應用并應用所有最近的更改,請在 Android Studio 中點擊?Run?
(或?Debug?
)。
使用重新運行
推送影響特定初始值設定項的代碼更改(例如對應用的?onCreate()?方法的更改)時,您需要重新啟動應用,以便使更改生效。要執(zhí)行增量構(gòu)建并重新啟動應用,請點擊?Rerun?
。
如果您需要部署整潔的構(gòu)建,請從主菜單中選擇?Run?>?Clean and Rerun?
,也可以在點擊?Rerun?
?時按住?Shift?鍵。此操作會停止運行的應用,執(zhí)行完整、整潔的構(gòu)建,然后將新的 APK 部署至您的目標設備。
停用行為自動重新啟動
執(zhí)行熱交換時,您的應用會保持運行,但 Android Studio 會自動重新啟動當前的行為。要停用此默認設置,請執(zhí)行以下操作:
打開?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 配置和優(yōu)化您的項目
默認情況下,Android Studio 會為使用 Android Plugin for Gradle 2.0.0 及更高版本構(gòu)建的項目啟用 Instant Run。
要使用最新版本的插件更新現(xiàn)有項目,請執(zhí)行以下操作:
打開?Settings?或者?Preferences?對話框。
導航至?Build, Execution, Deployment?>?Instant Run,然后點擊?Update Project,如圖 3 所示。
如果用于更新項目的選項未顯示,則說明項目已經(jīng)帶有最新版本的 Android Plugin for Gradle,處于最新狀態(tài)。
圖 3.更新現(xiàn)有項目的 Android Plugin for Gradle。
您還需要更改構(gòu)建變體才能開始使用 Instant Run,將變體改為應用的調(diào)試版本。
通過配置 DEX 資源縮短構(gòu)建時間
部署整潔的構(gòu)建時,Android Studio 會將您的應用設置為允許 Instant Run 推送代碼和資源更新。盡管更新正在運行的應用要快得多,第一次構(gòu)建卻可能需要較長的時間才能完成。您可以通過配置多個?DexOptions?設置來加快構(gòu)建流程:
設置可以并行啟動的 DEX 進程的最大數(shù)量。如果 Gradle 后臺進程已在運行,您需要先停止此進程,然后使用新的最大進程數(shù)進行初始化。您可以從?Terminal?窗口中調(diào)用下面的一種函數(shù)來終止 Gradle 后臺進程:?
在 Windows 上,請調(diào)用?gradlew --stop
在 Linux/Mac OSX 上,請調(diào)用?./gradlew --stop
設置 dex 操作的最大內(nèi)存分配池大小。傳遞值時,您可以附加字母“k”來表示千字節(jié),附加“m”表示兆字節(jié),或者附加“g”表示千兆字節(jié)。
下面的示例會在模塊級別的?build.gradle?文件中將?maxProcessCount?設為 4,以及將?javaMaxHeapSize?設為“2g”:
android {...
dexOptions
{
maxProcessCount
4 // this is the default value
javaMaxHeapSize
"2g"}}
您應增大設置的值并觀察對構(gòu)建時間產(chǎn)生的影響,對這些設置進行測試。如果您向 dexing 進程分配過多的資源,則可能導致性能下降。
啟用 dexing-in-process 和增量 Java 編譯
Android Plugin for Gradle 版本 2.1.0?及更高版本還引入了其他的構(gòu)建流程改進,包括增量 Java 編譯和 dexing-in-process。增量 Java 編譯默認情況下處于啟用狀態(tài),這種編譯方式僅對發(fā)生變化或需要重新編譯的源代碼部分進行重新編譯,可以縮短開發(fā)過程中的編譯時間。
dexing-in-process 在構(gòu)建流程而不是單獨的外部 VM 流程中執(zhí)行 dexing。這樣不僅可以讓增量構(gòu)建更快,也可以顯著提高完整構(gòu)建的速度。要啟用此功能,您需要將 Gradle 后臺進程的最大堆大小設置為至少 2048 MB。要進行設置,您可以將以下代碼包含到項目的?gradle.properties?文件中:?
org.gradle.jvmargs = -Xmx2048m
如果您已經(jīng)在模塊級別的?build.gradle?文件中為?javaMaxHeapSize?定義值,則需要將后臺進程的最大堆大小設置為?javaMaxHeapSize?的值 + 1024 MB。例如,如果您已將?javaMaxHeapSize?設為“2g”,則需要將以下代碼添加到項目的?gradle.properties?文件中:?
org.gradle.jvmargs = -Xmx3072m
從 Windows Defender 中排除您的項目
在 Windows 系統(tǒng)上,Windows Defender 可能導致 Instant Run 的運行速度變慢。如果您正在使用 Windows Defender,應當從 Windows Defender 惡意軟件掃描中排除您的 Android Studio 項目文件夾。
縮短使用 Crashlytics 時的構(gòu)建時間
如果您的 Fabric Gradle 插件版本低于 1.21.6,Crashlytics 可能會導致構(gòu)建時間變長。要提升應用開發(fā)期間的構(gòu)建性能,您可以將插件升級到最新版本或者為您的調(diào)試構(gòu)建變體停用 Crashlytics。
Instant Run 的限制
大多數(shù)情況下,Instant Run 可以加快構(gòu)建和部署流程的速度。不過,使用 Instant Run 時有一些限制因素可能影響其行為以及與您應用的兼容性。如果您在使用 Instant Run 時遇到其他問題,請提交錯誤。
部署到多種設備
Instant Run 使用多種不同的技術(shù)執(zhí)行特定于目標設備 API 級別的熱交換、溫和交換和冷交換。因此,同時將應用部署到多種設備時,Android Studio 會暫時關(guān)閉 Instant Run。
應用的 Dalvik 可執(zhí)行文件分包
如果您的項目面向舊版 Dalvik 可執(zhí)行文件分包(即,使用?multiDexEnabled true?和?minSdkVersion 20?或更低版本配置?build.gradle)配置并且您將其部署到運行 Android 4.4(API 級別 20)或更低版本系統(tǒng)的目標設備上,Android Studio 會停用 Instant Run。
如果將?minSdkVersion?設為 21 或更高,Instant Run 會自動將應用配置為進行 Dalvik 可執(zhí)行文件分包。由于 Instant Run 僅適用于調(diào)試版本的應用,在部署發(fā)布構(gòu)建變體時,您需要配置應用進行 Dalvik 可執(zhí)行文件分包。
運行儀器測試和性能分析器
儀器測試會將調(diào)試 APK 和測試 APK 同時加載到測試設備上的相同進程中,這樣,控制方法可以替換應用的正常生命周期并執(zhí)行測試。在運行或調(diào)試儀器測試時,Android Studio 不會注入 Instant Run 需要的其他方法并將此功能關(guān)閉。
分析應用時,您應停用 Instant Run。使用 Instant Run 會輕微影響性能,而替換具有熱交換的方法則會產(chǎn)生稍大的影響。這種性能影響會干擾性能分析工具提供的信息。此外,每次熱交換生成的存根方法都會使堆疊追蹤變得復雜。
使用第三方插件
使用 Instant Run 時,Android Studio 會暫時停用 Java Code Coverage Library (JaCoCo) 和 ProGuard。由于 Instant Run 僅適用于調(diào)試版本,停用不會影響您的發(fā)布版本。
某些執(zhí)行字節(jié)碼增強的第三方插件可能會對 Instant Run 設置應用的方式造成影響。如果您遇到這些問題,但是想要繼續(xù)使用 Instant Run,那么應針對您的調(diào)試構(gòu)建變體停用這些插件。您還可以通過提交錯誤的方式幫助提升與第三方插件的兼容性。
將更改推送至多進程應用
為了執(zhí)行熱交換和溫和交換,Instant Run 僅設置應用的主進程。將代碼更改(例如對方法實現(xiàn)或現(xiàn)有資源的更改)推送至其他應用進程時,Instant Run 會執(zhí)行冷交換。
停用 Instant Run
要停用 Instant Run,請執(zhí)行以下操作:
打開?Settings?或者?Preferences?對話框。
導航至?Build, Execution, Deployment?>?Instant Run。
取消選中?Enable Instant Run?旁邊的方框。