Android Studio的Instant Run工作原理及用法
前言
看到一篇介紹Instant Run的文章,覺得蠻不錯的,翻譯記錄一下,其中夾雜著自己的理解(原文地址),最後附上Install
Run的使用方法。(本文圖片出處)
tips:文中所有連結地址都要翻牆
Instant Run
Instant Run,是android studio2.0新增的一個執行機制,在你編碼開發、測試或debug的時候,它都能顯著減少你對當前應用的構建和部署的時間。
當我們第一次點選run、debug按鈕的時候,它執行時間和我們往常一樣。但是接下去的時間裡,你每次修改程式碼後點選run、debug按鈕,對應的改變將迅速的部署到你正在執行的程式上,傳說速度快到你都來不及把注意力集中到手機螢幕上,它就已經做好相應的更改。
一個典型的構建週期流程圖
構建->部署->安裝->app登入->activity建立
instant run的目標:儘可能多的剔除不必要的步驟,然後提升必要步驟的速度。
在實踐中,這意味著:
- 只對程式碼改變部分做構建和部署
- 不重新安裝應用
- 不重啟應用
- 不重啟activity
熱拔插,溫拔插,冷拔插
instant run = 增量構建 + 熱 或 溫 或 冷拔插
熱拔插:程式碼改變被應用、投射到APP上,不需要重啟應用,不需要重建當前activity。
場景:適用於多數的簡單改變(包括一些方法實現的修改,或者變數值修改)
溫拔插:activity需要被重啟才能看到所需更改。
場景:典型的情況是程式碼修改涉及到了資原始檔,即resources。
冷拔插:app需要被重啟(但是仍然不需要重新安裝)
場景:任何涉及結構性變化的,比如:修改了繼承規則、修改了方法簽名等。
Instant Run執行原理
Manifest整合,然後跟res、dex.file一起被合併到APK
manifest檔案合併、打包,和res一起被AAPT合併到APK中,同樣專案程式碼被編譯成位元組碼,然後轉換成.dex 檔案,也被合併到APK中。
首次執行Instant Run,Gradle執行的操作
APK生成流程
在有Instant Run的環境下:一個新的App Server類會被注入到App中,與Bytecode instrumentation協同監控程式碼的變化。
同時會有一個新的Application類,它注入了一個自定義類載入器(Class Loader),同時該Application類會啟動我們所需的新注入的App Server。於是,Manifest會被修改來確保我們的應用能使用這個新的Application類。(這裡不必擔心自己繼承定義了Application類,Instant Run新增的這個新Application類會代理我們自定義的Application類)
至此,Instant Run已經可以跑起來了,在我們使用的時候,它會通過決策,合理運用冷溫熱拔插來協助我們大量地縮短構建程式的時間。
在Instant Run執行之前,Android Studio會檢查是否能連線到App Server中。並且確保這個App Server是Android Studio所需要的。這同樣能確保該應用正處在前臺,因為目前是不支援多臺裝置多程式同時執行。
熱拔插
App Server
Android Studio monitors: 執行著Gradle任務來生成增量.dex檔案(這個dex檔案是對應著開發中的修改類) Android Studio會提取這些.dex檔案傳送到App Server,然後部署到App。
因為原來版本的類都裝載在執行中的程式了,Gradle會翻譯,更新好這些.dex檔案(Gradle修改class的原理,請戳連結),傳送到App Server的時候,交給自定義的類載入器來載入.dex檔案。看看下面原理圖:
App Server
App Server會不斷監聽是否需要重寫類檔案,如果需要,任務會被立馬執行。新的更改便能立即被響應。我們可以通過打斷點除錯來發現它確實是這麼做,操作如下:
實際效果
溫拔插
溫拔插需要重啟Activity,因為資原始檔是在Activity建立時載入,所以必須重啟Activity來過載資原始檔。
目前來說,任何資原始檔的修改都會導致重新打包再傳送到APP。但是,google的開發團隊正在致力於開發一個增量包,這個增量包只會包裝修改過的資原始檔並能部署到當前APP上。
注意:溫拔插涉及到的資原始檔修改,在manifest上是無效的(這裡的無效是指不會啟動Instant Run),因為,manifest的值是在APK安裝的時候被讀取,所以想要manifest下資源的修改生效,還需要觸發一個完整的應用構建和部署。總結起來:如果你修改了manifest相關的資原始檔,還是需要面臨和以前一樣的龜速構建。
所以溫拔插實際上只能應對少數的情況,它並不能應付應用在架構、結構上的變化。例如:annotations,fields的增刪改、父類檔案的修改、static修飾的類、方法、常量等的修改都只能依靠冷拔插。
冷拔插
應用部署的時候,會把工程拆分成十個部分,每部分都擁有自己的.dex檔案,然後所有的類會根據包名被分配給相應的.dex檔案。當冷拔插開啟時,修改過的類所對應的.dex檔案,會重組生成新的.dex檔案,然後再部署到裝置上。
之所以能這麼做,是依賴於Android的ART模式,它能允許載入多個.dex檔案。ART模式在android4.4(API-19)中加入,但是Dalvik依然是首選,到了android5.0(API-21),ART模式才成為系統預設首選,所以Instant Run只能執行在API-21及其以上版本,至於低版本的話,會重新構建整個應用(下文會提及低版本解決思路)
Instant Run是不能回退的
程式碼更改可以通過熱拔插快速部署,但是熱拔插會影響應用的初始化,所以我們不得不通過重啟應用來響應這些修改。
展示增量構建,重啟APP,然後回退(這裡回退不了,資料還是4)
Instant Run 技巧與提示
Instant Run是被Android Studio控制的。所以我們只能通過IDE來啟動它,如果通過裝置來啟動應用,Instant Run會出現異常情況。
更多的技巧,請點這裡,然而多數是沒什麼用,不需要記住的。
- 如果應用的minSdkVersion小於21,可能多數的Instant Run功能會掛掉,這裡提供一個解決方法,通過product flavor建立一個minSdkVersion大於21的新分支,用來debug。
- Instant Run目前只能在主程式裡執行,如果應用是多程式的,類似微信,把webView抽出來單獨一個程式,那熱、溫拔插會被降級為冷拔插。
- 在Windows下,Windows Defender Real-Time Protection可能會導致Instant Run掛掉,可用通過新增白名單列表解決,具體操作自行Google
- 暫時不支援Jack compiler,Instrumentation Tests,或者同時部署到多臺裝置。
操作
- 下載:AS1.5及其以上的使用者可以通過增量包直接升級到2.0或者2.1,1.5以下的,個人覺得直接重新官網下載一個就好了,不看好瞎折騰,覺得浪費時間。
- 設定:Instant Run是預設開啟的。設定路徑:Preferences -> Build,Execution,Deployment -> Instant Run
- 使用:和往常一模一樣,只是你會發覺速度飆升,變快了。-0-
相關文章
- Android Studio中Instant RunAndroid
- 揭祕最新android studio instant run(一)Android
- Android 在 Multidex 下使用 Instant RunAndroidIDE
- 深入理解 Android Instant Run 執行機制Android
- Android Studio軟體的快捷鍵用法彙總及常用配置Android
- ThreadLocal用法及原理thread
- Android View 的工作原理AndroidView
- xargs的原理剖析及用法詳解
- Android Studio點選Run背後發生了什麼?Android
- Laravel Query Builder 原理及用法LaravelUI
- Android View的工作原理(上)AndroidView
- Android IntentService 工作原理AndroidIntent
- Exchanger的工作原理及例項
- YUM工作原理及使用
- android studio 安裝報錯 unable to run mksdcard sdk toolAndroid
- Elaticsearch(一)--基礎原理及用法
- ppium簡介及工作原理
- Android 中 Canvas 繪圖之 PorterDuffXfermode 使用及工作原理詳解AndroidCanvas繪圖
- Android中Canvas繪圖之PorterDuffXfermode使用及工作原理詳解AndroidCanvas繪圖
- 深入解析 Android 中 View 的工作原理AndroidView
- Run 流程和 Docker 原理Docker
- Android Studio Run專案出現Failure [INSTALL_FAILED_TEST_ONLY]AndroidAI
- 引入 Tinker 之後如何在 Debug 模式下開啟 Instant Run模式
- STL vector的內部實現原理及基本用法
- Android中IntentService的原理及使用AndroidIntent
- Thanos工作原理及元件簡介元件
- Java ArrayDeque工作原理及實現Java
- Java HashMap工作原理及實現JavaHashMap
- Oracle instant client及pl sql developer的使用OracleclientSQLDeveloper
- 原始碼解析Android中AsyncTask的工作原理原始碼Android
- npm基本用法及原理(10000+)NPM
- webpack基本用法及原理(10000+)Web
- Spring WebFlux 的設計及工作原理剖析SpringWebUX
- SSL解除安裝的工作原理及好處
- springmvc工作原理及原始碼分析SpringMVC原始碼
- 倍數提高工作效率的 Android Studio 奇技Android
- Android開發藝術(3)——View的工作原理AndroidView
- IIC序列匯流排的組成及工作原理