你真的了解Instant Run嗎?

Android Studio.png

在Instant Run剛出來的時候爷抓,反編譯源碼寫過一篇Instant Run原理解析势决,但過于基于源碼,感覺沒有寫清楚蓝撇,這周Android Developers推出了Instant Run: An Android Tool Time Deep Dive來講解Instant Run原理果复,既然是官方推出的,當(dāng)然要重點看看渤昌,整理了一下虽抄,算是對Instant Run有了更全面的了解。

完整構(gòu)建和部署

首先我們來看下沒有使用Instant Run独柑,代碼改變之后的完整構(gòu)建和部署的流程

完整構(gòu)建和部署流程.png
Android Build Process流程圖.png

我們可以看到迈窟,在沒有Instant Run時,代碼變更之后運(yùn)行忌栅,需要構(gòu)建Application车酣,你的Mainfest文件被合并,和資源文件一起被打包到APK里面索绪,類似的湖员,Java文件被編譯成字節(jié)碼,然后轉(zhuǎn)換成DEX文件瑞驱,最后部署App娘摔,重新啟動App,重新啟動Activity唤反,最終變更的代碼才能變執(zhí)行凳寺。之間需要花費(fèi)大量的時間,工程小還好彤侍,一旦大了就需要花費(fèi)幾分鐘甚至幾十分鐘時間肠缨,嚴(yán)重影響了我們開發(fā)的效率和心情(最重要的是心情!)拥刻,還能不能愉快地編程了怜瞒!Google真是急人之所急,我們的救世主呀,在Android Studio 2.0之后就推出了Instant Run功能吴汪,看字面意思就知道是即時運(yùn)行的意思惠窄,本著工程師探索原理的精神,讓我們一探究竟漾橙。

Instant Run分類

Instant Run .png

我們可以看到杆融,和完整構(gòu)建、停止霜运、重新安裝和加載App相比脾歇,Instant Run 只增量構(gòu)建和部署代碼改變的部分,在很大程度上縮短構(gòu)建和部署的時間淘捡。Instant Run有3種交換類型藕各,分別是Hot Swap、Warm Swap和Cold Swap焦除,Instant Run會根據(jù)改變代碼的類型激况,自動決定使用哪種類型。

Instant Run如何工作

Instant Run構(gòu)建

Instant Run構(gòu)建流程.png

根據(jù)上圖膘魄,我們可以看到Instant Run構(gòu)建流程乌逐,首先增加字節(jié)碼到你的Class文件,用來讓我們之后進(jìn)行替換创葡,然后增加一個新的App Server Class運(yùn)行在之后你的App里面浙踢,用來傳輸之后在運(yùn)行期變化的代碼,Gradle也會將修改Mainfest進(jìn)行合并灿渴,讓我們運(yùn)行實時代碼的改變洛波。

App Server運(yùn)行

App Server運(yùn)行流程.png

當(dāng)你在Android Studio點擊Run按鈕時,首先會檢測在你的App里是否有一個開啟Socket端口的Server在運(yùn)行骚露,來確定Instant Run是否可用奋岁,在發(fā)送變化的代碼之前它也會檢測App構(gòu)建的ID來確定是期望的版本,當(dāng)你在開發(fā)過程中荸百,Android Studio會監(jiān)控哪些文件已經(jīng)被改變,運(yùn)行一個自定義的Gradle Task為那些改變的class文件創(chuàng)建一個DEX文件滨攻,這個新的DEX文件會被Android Studio部署到我們運(yùn)行的App Server里面够话,App Server接收到之后就會加載和部署被更新的classes,使用之前注入到我們原始類光绕,委托方法來調(diào)用我們剛才加載覆蓋的新classes里的方法女嘲。

Hot Swap

Hot Swap.png

Hot Swap主要用于改變現(xiàn)有方法的實現(xiàn)代碼導(dǎo)致的代碼改變,這是最快的一種交換方式诞帐,不需要重啟App或者Activity欣尼,在你下一次調(diào)用方法時,新的實現(xiàn)就能被調(diào)用。

Warm Swap

Warm Swap.png

Warm Swap主要用于修改或者刪除已經(jīng)存在的資源文件愕鼓,這個交換仍然非掣铺快,但需要重啟Activity菇晃,因為加載這些被影響的資源册倒,重啟是必須的。雖然改變的所有資源都需要被重新打包磺送,但我們是增量開發(fā)驻子,可以只打包和部署已經(jīng)改變的資源,不過和Mainfest相關(guān)的資源改變或者M(jìn)ainfest自身的改變估灿,Warm Swap不會有任何作用崇呵,那是因為從Mainfest里面讀取值,在APK被安裝的時候就已經(jīng)被確定下來馅袁,所以那些改變就需要重新安裝才能看到域慷。從這里我們就能看出來,Instant Run并不支持改變定義App名稱的字符串或者App圖標(biāo)司顿。

Cold Swap

Cold Swap.png

Cold Swap支持新增芒粹、移除、修改注釋大溜、實例或者靜態(tài)字段化漆,實例或者靜態(tài)方法簽名、改變父類classes或者類靜態(tài)初始化钦奋。這種交換會慢一點座云,雖然不需要完整構(gòu)建一個新的APK,但需要重啟Application付材。原理就是發(fā)送有效代碼的DEX文件到指定設(shè)備朦拖,通過App加載多個DEX來實現(xiàn)代碼的改變,這就需要ART厌衔,所以Cold Swap只在Android 5.0及以上的設(shè)備才有效璧帝,那些Android 5.0以下的設(shè)備就需要部署一個完整的APK。

總結(jié)

到目前為止富寿,我想大家已經(jīng)理解了這3種交換類型的原理睬隶,也能了解其中的局限性,做到知其然页徐,知其所以然苏潜。最后祝大家利用好Instant Run,享受即時編程变勇。

參考資料

官方視頻
About Instant Run

可以隨意轉(zhuǎn)發(fā)恤左,也歡迎關(guān)注我的簡書,我會堅持給大家?guī)矸窒怼?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市飞袋,隨后出現(xiàn)的幾起案子戳气,更是在濱河造成了極大的恐慌,老刑警劉巖授嘀,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件物咳,死亡現(xiàn)場離奇詭異,居然都是意外死亡蹄皱,警方通過查閱死者的電腦和手機(jī)览闰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巷折,“玉大人压鉴,你說我怎么就攤上這事《途校” “怎么了油吭?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長署拟。 經(jīng)常有香客問我婉宰,道長,這世上最難降的妖魔是什么推穷? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任心包,我火速辦了婚禮,結(jié)果婚禮上馒铃,老公的妹妹穿的比我還像新娘蟹腾。我一直安慰自己,他們只是感情好区宇,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布娃殖。 她就那樣靜靜地躺著,像睡著了一般议谷。 火紅的嫁衣襯著肌膚如雪炉爆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天卧晓,我揣著相機(jī)與錄音叶洞,去河邊找鬼。 笑死禀崖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的螟炫。 我是一名探鬼主播波附,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掸屡?” 一聲冷哼從身側(cè)響起封寞,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仅财,沒想到半個月后狈究,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盏求,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年抖锥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碎罚。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡磅废,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荆烈,到底是詐尸還是另有隱情拯勉,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布憔购,位于F島的核電站宫峦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏玫鸟。R本人自食惡果不足惜导绷,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞋邑。 院中可真熱鬧诵次,春花似錦、人聲如沸枚碗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肮雨。三九已至遵堵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怨规,已是汗流浹背陌宿。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留波丰,地道東北人壳坪。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像掰烟,于是被迫代替她去往敵國和親爽蝴。 傳聞我的和親對象是個殘疾皇子沐批,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,078評論 25 707
  • 如何編譯運(yùn)行app 我們要編譯運(yùn)行一個AS工程,只需在AndroidStudio上點擊幾下按鈕就行了蝎亚。Instan...
    EsonJack閱讀 2,051評論 0 5
  • 在Instant Run剛出來的時候九孩,反編譯源碼寫過一篇Instant Run原理解析,但過于基于源碼发框,感覺沒有寫...
    皓云觀閱讀 599評論 0 1
  • 一襲涼風(fēng)鋪面而來梅惯,它輕吻著我的額頭宪拥,似乎想要告訴我生活有多美好。天空中星星都在眨眼睛个唧,我總喜歡對這些“小眼睛”微...
    熱風(fēng)_閱讀 250評論 0 4
  • 十里桃花玉生煙江解, 萬丈紅梅俏春寒。 走過夏秋輪回路徙歼, 回眸只為一容顏犁河。
    夢雨森閱讀 175評論 0 1