你真的瞭解Instant Run嗎?
在Instant Run剛出來的時候,反編譯原始碼寫過一篇Instant Run原理解析,但過於基於原始碼,感覺沒有寫清楚,這周Android Developers推出了Instant Run: An Android Tool Time Deep Dive來講解Instant Run原理,既然是官方推出的,當然要重點看看,整理了一下,算是對Instant Run有了更全面的瞭解。
完整構建和部署
首先我們來看下沒有使用Instant Run,程式碼改變之後的完整構建和部署的流程
完整構建和部署流程.png
Android Build Process流程圖.png
我們可以看到,在沒有Instant Run時,程式碼變更之後執行,需要構建Application,你的Mainfest檔案被合併,和資原始檔一起被打包到APK裡面,類似的,Java檔案被編譯成位元組碼,然後轉換成DEX檔案,最後部署App,重新啟動App,重新啟動Activity,最終變更的程式碼才能變執行。之間需要花費大量的時間,工程小還好,一旦大了就需要花費幾分鐘甚至幾十分鐘時間,嚴重影響了我們開發的效率和心情(最重要的是心情!),還能不能愉快地程式設計了!Google真是急人之所急,我們的救世主呀,在Android Studio 2.0之後就推出了Instant Run功能,看字面意思就知道是即時執行的意思,本著工程師探索原理的精神,讓我們一探究竟。
Instant Run分類
Instant Run .png
我們可以看到,和完整構建、停止、重新安裝和載入App相比,Instant Run 只增量構建和部署程式碼改變的部分,在很大程度上縮短構建和部署的時間。Instant Run有3種交換型別,分別是Hot Swap、Warm Swap和Cold Swap,Instant Run會根據改變程式碼的型別,自動決定使用哪種型別。
Instant Run如何工作
Instant Run構建
Instant Run構建流程.png
根據上圖,我們可以看到Instant Run構建流程,首先增加位元組碼到你的Class檔案,用來讓我們之後進行替換,然後增加一個新的App Server Class執行在之後你的App裡面,用來傳輸之後在執行期變化的程式碼,Gradle也會將修改Mainfest進行合併,讓我們執行實時程式碼的改變。
App Server執行
App Server執行流程.png
當你在Android Studio點選Run按鈕時,首先會檢測在你的App裡是否有一個開啟Socket埠的Server在執行,來確定Instant Run是否可用,在傳送變化的程式碼之前它也會檢測App構建的ID來確定是期望的版本,當你在開發過程中,Android Studio會監控哪些檔案已經被改變,執行一個自定義的Gradle Task為那些改變的class檔案建立一個DEX檔案,這個新的DEX檔案會被Android Studio部署到我們執行的App Server裡面,App Server接收到之後就會載入和部署被更新的classes,使用之前注入到我們原始類,委託方法來呼叫我們剛才載入覆蓋的新classes裡的方法。
Hot Swap
Hot Swap.png
Hot Swap主要用於改變現有方法的實現程式碼導致的程式碼改變,這是最快的一種交換方式,不需要重啟App或者Activity,在你下一次呼叫方法時,新的實現就能被呼叫。
Warm Swap
Warm Swap.png
Warm Swap主要用於修改或者刪除已經存在的資原始檔,這個交換仍然非常快,但需要重啟Activity,因為載入這些被影響的資源,重啟是必須的。雖然改變的所有資源都需要被重新打包,但我們是增量開發,可以只打包和部署已經改變的資源,不過和Mainfest相關的資源改變或者Mainfest自身的改變,Warm Swap不會有任何作用,那是因為從Mainfest裡面讀取值,在APK被安裝的時候就已經被確定下來,所以那些改變就需要重新安裝才能看到。從這裡我們就能看出來,Instant Run並不支援改變定義App名稱的字串或者App圖示。
Cold Swap
Cold Swap.png
Cold Swap支援新增、移除、修改註釋、例項或者靜態欄位,例項或者靜態方法簽名、改變父類classes或者類靜態初始化。這種交換會慢一點,雖然不需要完整構建一個新的APK,但需要重啟Application。原理就是傳送有效程式碼的DEX檔案到指定裝置,通過App載入多個DEX來實現程式碼的改變,這就需要ART,所以Cold Swap只在Android 5.0及以上的裝置才有效,那些Android 5.0以下的裝置就需要部署一個完整的APK。
總結
到目前為止,我想大家已經理解了這3種交換型別的原理,也能瞭解其中的侷限性,做到知其然,知其所以然。最後祝大家利用好Instant Run,享受即時程式設計。
文/不二先生的世界(簡書作者)
原文連結:http://www.jianshu.com/p/b92f879553bf
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。
相關推薦
你真的瞭解Instant Run嗎?
在Instant Run剛出來的時候,反編譯原始碼寫過一篇Instant Run原理解析,但過於基於原始碼,感覺沒有寫清楚,這周Android Developers推出了Instant Run: An Android Tool Time Deep Dive來講解Inst
Android Studio新功能解析,你真的瞭解Instant Run嗎?
轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/51271369 本篇文章首發於我的微信公眾號,由於網上講解Android Studio中Instant Run功能的文章實在是太少了,為了讓更多
校園網路安全CTF 第一題 和 你真瞭解我嗎?
第一題: 需要先找到相應頭(REsponse header中的tips) <?php$flag = "***";if (isset($_GET['repo']))//檢測變數是否設定 { if (strcmp($_GET['repo'], $flag) == 0) //比較兩個
你真的瞭解[super ]關鍵字嗎?
前言 此篇文章是看了阮老師的es6教程,看到super關鍵字的時候覺得有必要總結梳理一下,原文還是參考 ECMAScript 6入門。 正文 super 這個關鍵字,既可以當作函式使用,也可以當作物件使用。 1.當作函式使用 super作為函式呼叫時,代表父類的建構函式。ES6 要
你真的瞭解新媒體嗎?黎想將淺談一個成功的新媒體所必須具備的基本要素?
在正式介紹前,為了幫助大家更好的瞭解新媒體,避免認識上的誤區。藝形藝意工作室創始人、騰訊網、百度網、搜狐網知名專欄作者黎想將首先教你用一招輕鬆區別的方法: 新媒體涵蓋了所有數字化的媒體形式,包括所有數字化的傳統媒體、網路媒體、移動端媒體、數字電視、數字報刊雜誌等;自媒體是基於擁有眾多粉絲
Java中執行緒池,你真的瞭解會用嗎
在《 深入原始碼分析Java執行緒池的實現原理 》這篇文章中,我們介紹過了Java中執行緒池的常見用法以及基本原理。 在文中有這樣一段描述: 可以通過Executors靜態工廠構建執行緒池,但一般不建議這樣使用。 關於這個問題,在那篇文章中並沒有深入的展開。作者之所以這
遇見未來 | 讀完這篇文章,你真的瞭解超融合嗎?
超融合的概念自2012年被提出到現在,經歷了6年的時間。其技術已經從最初的以儲存的融合為重點,經歷過計算、儲存、網路的全面融合,到現在,重心落在雲端計算平臺的交付,整個技術趨於成熟。 今天我們有幸邀請到青雲QingCloud青立方產品總監廖洋(Lester)老師,請
你真的瞭解volatile關鍵字嗎?
一、Java記憶體模型想要理解volatile為什麼能確保可見性,就要先理解Java中的記憶體模型是什麼樣的。Java記憶體模型規定了所有的變數都儲存在主記憶體中。每條執行緒中還有自己的工作記憶體,執行緒的工作記憶體中儲存了被該執行緒所使用到的變數(這些變數是從主記憶體中拷貝
你真的瞭解計算機除法嗎
前不久看了《C++反彙編與逆向分析技術揭祕》看到除法的介紹部分,裡面有1道題,8 % -3 = ?;-8 % -3 = ?;-8 % 3 = ?;大家能答的上來嗎?反正我當時是沒答上來,我想肯定很多人也一時答不上來,下面是上題的答案: 8 % -
深入淺出ES6(一):你真的瞭解箭頭函式嗎
前言 這個系列主要是說明ES6的新特性,從2015年到現在,es6出來也有挺長一段時間了,在專案中也在普遍使用這些特性.,網上的寫es6的文章也大把, 但我感覺可能還是停留在會用的階段,,至於為什麼要這麼用, 又為什麼會出現這個特性,解決了什麼樣的問題,這些都
你真的瞭解分層架構嗎?——寫給被PetShop"毒害"的朋友們
一葉障目 .NET平臺上的分層架構(很多朋友稱其為“三層架構”),似乎是一個長盛不衰的話題。經常看到許多朋友對其進行分析、探討、辯論甚至是抨擊。筆者在仔細閱讀了大量這方面文章後,認為許多朋友在分層架構的理解上存在兩個比較大的偏頗: 1.沒有從本質角度去理解分層的內涵,而只
你真的瞭解Android ListView嗎?
什麼是Android ListView? ListView是一個顯示可滾動的專案列表檢視組。 該列表中的專案使用的是自動插入到列表Adapter ,拉從源內容,如陣列或資料庫查詢,把每個專案導如成被放置到列表的檢視。 在android開發中ListView是
你真的瞭解模運算嗎?
問題 假設我們需要編寫一個字母表右移對映的程式(可能用於實現某種加密演算法),說起來似乎有些抽象,舉個例子便清晰了: 譬如字母表為 { ‘a’, ‘b’, ‘c’, ‘d’, ‘e’ }, 右移3位的話, 字母表便被對映為 { ‘d’, ‘e’, ‘a’,
你真的瞭解單例嗎
又到了一個老生常談的話題,單例模式,可能在面試時我們也經常會遇到,但是看似很簡單的問題,卻能看出一個人對單例理解的深度。要寫一個單例,首先需要讓構造器私有,還需要對外提供一個可以獲取單例的一個入口,通常我們可能會這樣寫:第一種:public class SingleT
你真的瞭解Grid佈局嗎?
Grid網格佈局 概述:Grid將容器劃分為一個個網格,通過任意組合不同的網格,做出你想想要的佈局 Grid與flex佈局相似,將整個Grid分為了容器與子項(格子) Grid容器的三個重要的概念: 行和列 單元格 網格線 行和列 行和列的概念和柵格系統的的概念相似 單元格在水
你真的瞭解Object原始碼嗎
歡迎點贊閱讀,一同學習交流,有疑問請留言 。 GitHub上也有開源 JavaHouse 歡迎star 引入 Object 應該是比較簡單的原始碼了。現在我們來分析一下他。Object 是類層次結構的根。Java體系裡面的每個類預設都有一個超類就是 Object。總之,所有物件,包含陣列,都預設實現該類的
JavaScript 你真的瞭解this指向嗎
JavaScript 你真的瞭解this指向嗎 前言 終於開始寫this指向了,相信這對很多JavaScript的學習者來說是一個非常恐怖的環節,個人認為也算是JavaScript中最難理解的一個知識點,this非常的方便但是在你不熟悉它的情況下可能會出現很多坑。 本篇文章將帶你充分了解this指
你真的瞭解串列埠嗎(示波器串列埠波形分析)
串列埠是最常用的外設了,串列埠基本都是微控制器的標配。串列埠通訊只需要3條線組成,分別為RX、TX、GND。下面將重點分析串列埠資料幀組成。 一、 串列埠通訊幀 串列埠通訊幀資料如此,每幀由空閒位、起始位、資料位、校驗位、停止位組成 傳輸的資料是低位在前高位
線程池你真不來了解一下嗎?
java並發編程 新建 out 沒有 在線 dex keepal AD 定性 前言 只有光頭才能變強 回顧前面: ThreadLocal就是這麽簡單 多線程三分鐘就可以入個門了! 多線程基礎必要知識點!看了學習多線程事半功倍 Java鎖機制了解一下 AQS簡簡單單過一
OTA近場測量你真的瞭解嗎?
如果你在百度搜索OTA,排在最上面的一定是線上旅遊,可是對於我們射頻工程師來說,OTA就別有一番意思了 我們一起來看一下 今日份重點: 1.近場測量技術及場地的發展 2.近場測量的分類 3.現今主流近場多探頭OTA系統簡介 4.小結 1.近場測量技術及場地的發展 近場測量的理論基