Android Studio新功能解析Instant Run

什么是Instant Run堪藐?

我們都知道旭咽,Android Studio功能非常強(qiáng)大幼苛,在各個(gè)功能性方面都要優(yōu)于Eclipse,唯獨(dú)在速度方面被吐糟得比較慘恬涧。Android Studio團(tuán)隊(duì)為此也是做了很多的優(yōu)化注益,在Android Studio 2.0中,對(duì)速度方面進(jìn)行了大幅度的改進(jìn):

可以看到溯捆,Android Studio 2.0中編譯和部署的速度都有了很大程度的提升丑搔,但唯獨(dú)安裝速度沒有得到提升,這很正常嘛现使,畢竟應(yīng)用程序的安裝快慢是由我們手機(jī)的硬件配置來決定的低匙,和開發(fā)工具有什么關(guān)系呢。

但是Android Studio團(tuán)隊(duì)并不滿足于此碳锈,他們想將速度提升到極致,于是在Android Studio 2.0中加入了Instant Run功能欺抗。當(dāng)然售碳,只要你的Android Studio版本在2.0以上,你不需要進(jìn)行任何學(xué)習(xí)就可以使用Instant Run绞呈,但是如果懂得了它背后的原理贸人,你將可以使用得更好。

傳統(tǒng)情況下佃声,我們修改程序后重新運(yùn)行一次程序需要經(jīng)歷 代碼重新編譯 -> 停止程序 -> 重新安裝 -> 重新啟動(dòng) 這樣一個(gè)過程艺智,而Instant Run則嘗試只將程序變更的部分部署到手機(jī)上,盡量避免重新安裝或重新啟動(dòng)程序圾亏,以此大大提升調(diào)試程序的效率十拣。

當(dāng)我們第一次運(yùn)行程序之后,Android Studio中的運(yùn)行按鈕會(huì)變成這個(gè)樣子:

可以看到志鹃,運(yùn)行的三角形旁邊多了一個(gè)閃電符號(hào)夭问,這就說明現(xiàn)在可以使用Instant Run了。

Instant Run主要分為三種類型曹铃,hot swap缰趋、warm swap和cold swap,Android Studio會(huì)根據(jù)代碼的修改情況自動(dòng)選擇使用哪種swap類型,下面我們就來針對(duì)這三種swap類型詳細(xì)地學(xué)習(xí)一下秘血。

Hot Swap

hot swap是所有swap方式中效率最高的一種味抖,應(yīng)用程序不需要重新安裝,也不需要重啟就可以完成程序變更灰粮。但是hot swap不會(huì)對(duì)程序中的對(duì)象進(jìn)行重新初始化仔涩,也就是說可能某些場(chǎng)景下需要重啟Activity才能看出具體的變更內(nèi)容。Android Studio對(duì)于hot swap這種情況默認(rèn)是重啟Activity的谋竖,當(dāng)然你也可以到設(shè)置中去改變這一默認(rèn)行為红柱,具體路徑是 Settings -> Build, Execution, Deployment -> Instant Run -> Restart activity on code changes。

hot swap的適用條件比較少蓖乘,只有一種情況會(huì)被Android Studio視為hot swap類型锤悄,就是修改一個(gè)現(xiàn)有方法中的代碼,效果如下圖所示:

可以看到嘉抒,我只改動(dòng)了一個(gè)現(xiàn)有方法的內(nèi)部代碼零聚,重新運(yùn)行后編譯和部署的速度都非常快些侍,最關(guān)鍵的是隶症,應(yīng)用程序并沒有重新安裝或重啟,甚至于Activity都沒有重啟(由于我進(jìn)行了上述的設(shè)置)岗宣,然后修改的代碼就成功替換了蚂会。

Warm Swap

warm swap也非常快耗式,這種swap類型同樣不需要重新安裝或重啟程序就可以完成程序變更胁住,但是warm swap要求必須重啟Activity。你會(huì)在界面上看到屏幕很快地閃一下刊咳,同時(shí)Activity的生命周期會(huì)重新執(zhí)行彪见。

warm swap的適用條件也比較局限,只有一種情況會(huì)被Android Studio視為warm swap類型娱挨,就是修改或刪除一個(gè)現(xiàn)有的資源文件余指,效果如下圖所示:

可以看到,我改動(dòng)了布局文件中的內(nèi)容跷坝,重新運(yùn)行后速度仍然很快酵镜,應(yīng)用程序并沒有重新安裝或重啟,只是Activity重啟了一下探孝,因?yàn)橐獙⑿薷暮蟮牟季謨?nèi)容展示到界面上笋婿。

Cold Swap

cold swap相對(duì)而言就要更慢一些了,Android Studio會(huì)自動(dòng)記錄我們項(xiàng)目的每次修改顿颅,然后將修改的這部分內(nèi)容打成一個(gè)dex文件發(fā)送到手機(jī)上缸濒,盡管這種swap類型仍然不需要去安裝一個(gè)全新的APK,但是為了加載這個(gè)新的dex文件,整個(gè)應(yīng)用程序必須進(jìn)行重啟才行庇配。另外斩跌,cold swap的工作原理是基于multidex機(jī)制來實(shí)現(xiàn)的,在不引入外部library的情況下捞慌,只有5.0及以上的設(shè)備才支持multidex耀鸦,因此,如果你使用了5.0以下的設(shè)備啸澡,那么cold swap就無法工作了袖订,這種情況會(huì)執(zhí)行最原始的完整APK安裝過程。

cold swap的適用條件非常多嗅虏,下面我列出一個(gè)詳細(xì)的清單洛姑,有哪些情況會(huì)被Android Studio視為cold swap類型:

添加、刪除或修改一個(gè)注解

添加皮服、刪除或修改一個(gè)字段

添加楞艾、刪除或修改一個(gè)方法

添加一個(gè)類

修改一個(gè)類的繼承結(jié)構(gòu)

修改一個(gè)類的接口實(shí)現(xiàn)

修改一個(gè)類的static修飾符

涉及資源文件id的改動(dòng)

那么我們還是來看一下演示效果吧,如下圖所示:

可以看到龄广,這里我給第二個(gè)Button添加了一個(gè)新的點(diǎn)擊事件方法硫眯,添加一個(gè)方法是滿足cold swap條件的,那么我們明顯可以看出择同,應(yīng)用程序重新啟動(dòng)了两入,但是整體的速度依然很快,整個(gè)重新運(yùn)行的過程在5秒種之內(nèi)完成的敲才,我的截圖都是實(shí)時(shí)速度谆刨,沒有進(jìn)行加速播放。

Full APK

除了滿足以上條件的其他程序變更归斤,Instant Run目前都還不支持,主要包括以下一些情況:

改變AndroidManifest.xml文件的內(nèi)容

改變被AndroidManifest.xml文件所引用的資源刁岸,比如string.xml中的app_name

改變桌面widget的UI相關(guān)元素

當(dāng)程序變更不被Instant Run所支持時(shí)脏里,就會(huì)執(zhí)行完整的APK安裝過程,同時(shí)Android Studio會(huì)給出這樣的提示:

由于這種情況重新運(yùn)行時(shí)間比較長虹曙,就不給大家截圖演示了迫横,以前我們使用低于2.0版本的Android Studio開發(fā)時(shí),每次都是執(zhí)行的這種情況酝碳。

當(dāng)然矾踱,這只是目前的Instant Run規(guī)則,Android Studio團(tuán)隊(duì)還會(huì)一直進(jìn)行優(yōu)化疏哗,增加hot swap和warm swap的條件呛讲,減少cold swap和full apk的條件,相信未來的Android Studio會(huì)更加好用。

Rerun

盡管Instant Run盡可能地想要變得更智能贝搁,但是它也沒有時(shí)光倒流的能力吗氏。比如hot swap或者warm swap是根本不會(huì)重啟程序的,而如果你修改了一些只有在程序啟動(dòng)的時(shí)候才會(huì)初始化的代碼雷逆,那么Instant Run對(duì)此也是無能為力的弦讽,因?yàn)樾薷牡拇a根本就沒有執(zhí)行到。

針對(duì)這種情況膀哲,Android Studio專門提供了一個(gè)Rerun按鈕:

中間那個(gè)按鈕就是Rerun按鈕往产,使用這個(gè)按鈕來重新運(yùn)行程序,應(yīng)用程序會(huì)被強(qiáng)制重啟某宪,從而初始化的一些代碼就能夠執(zhí)行到了仿村。Android Studio無法得知改動(dòng)的代碼是不是在程序初始化的時(shí)候才執(zhí)行的,而我們卻可以知道缩抡,所以確保你理解了Rerun這個(gè)按鈕的作用奠宜,并在恰當(dāng)?shù)臅r(shí)機(jī)使用它。

補(bǔ)充

hot swap由于其工作原理的限制還有一些特殊問題瞻想。hot swap會(huì)在應(yīng)用程序的內(nèi)部開啟一個(gè)服務(wù)器压真,然后由Android Studio自動(dòng)計(jì)算出方法內(nèi)實(shí)現(xiàn)的變更,將變更代碼發(fā)送到服務(wù)器蘑险,服務(wù)器再利用類加載器和委托機(jī)制將新的代碼實(shí)現(xiàn)注入到現(xiàn)有應(yīng)用程序中滴肿,從而完成替換工作。

但是整個(gè)過程中佃迄,新的代碼實(shí)現(xiàn)并沒有被保存到本地泼差,也就是說一旦設(shè)備和Android Studio的連接斷掉了(比如拔掉數(shù)據(jù)線),我們使用hot swap替換的代碼也就隨之不見了呵俏。當(dāng)你再次打開程序的時(shí)候堆缘,你會(huì)看到這樣的提示:

看到這個(gè)提示并不用感到驚奇,這就說明你的hot swap代碼失效了普碎,現(xiàn)在的程序仍然使用的老的代碼吼肥。遇到這種情況只需要將手機(jī)連上電腦,然后在Android Studio中重新運(yùn)行一下程序就可以解決了麻车。另外只有在debug模式下才可能會(huì)出現(xiàn)這個(gè)提示缀皱,release模式下是不可能出現(xiàn)的,所以不用擔(dān)心這個(gè)提示會(huì)讓用戶感到困惑动猬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啤斗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赁咙,更是在濱河造成了極大的恐慌钮莲,老刑警劉巖免钻,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異臂痕,居然都是意外死亡伯襟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門握童,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姆怪,“玉大人,你說我怎么就攤上這事澡绩』遥” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵肥卡,是天一觀的道長溪掀。 經(jīng)常有香客問我,道長步鉴,這世上最難降的妖魔是什么揪胃? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮氛琢,結(jié)果婚禮上喊递,老公的妹妹穿的比我還像新娘。我一直安慰自己阳似,他們只是感情好骚勘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撮奏,像睡著了一般俏讹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畜吊,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天泽疆,我揣著相機(jī)與錄音,去河邊找鬼玲献。 笑死于微,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的青自。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼驱证,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼延窜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抹锄,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤逆瑞,失蹤者是張志新(化名)和其女友劉穎荠藤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體获高,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哈肖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了念秧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淤井。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摊趾,靈堂內(nèi)的尸體忽然破棺而出币狠,到底是詐尸還是另有隱情,我是刑警寧澤砾层,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布漩绵,位于F島的核電站,受9級(jí)特大地震影響肛炮,放射性物質(zhì)發(fā)生泄漏止吐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一侨糟、第九天 我趴在偏房一處隱蔽的房頂上張望碍扔。 院中可真熱鬧,春花似錦粟害、人聲如沸蕴忆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽套鹅。三九已至,卻和暖如春汰具,著一層夾襖步出監(jiān)牢的瞬間卓鹿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工留荔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吟孙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓聚蝶,卻偏偏與公主長得像杰妓,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碘勉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 如何編譯運(yùn)行app 我們要編譯運(yùn)行一個(gè)AS工程巷挥,只需在AndroidStudio上點(diǎn)擊幾下按鈕就行了。Instan...
    EsonJack閱讀 2,054評(píng)論 0 5
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 在Instant Run剛出來的時(shí)候验靡,反編譯源碼寫過一篇Instant Run原理解析倍宾,但過于基于源碼雏节,感覺沒有寫...
    皓云觀閱讀 599評(píng)論 0 1
  • 第一節(jié) 嘆息 “好了,林渝高职,我很遺憾钩乍,你很可能活不過一個(gè)月了≌浚”醫(yī)生沉重的語氣寥粹,打破了這里的寂靜。 “謝謝产禾∨抛鳎”坐在...
    愛恨情仇丶滄海桑田閱讀 270評(píng)論 0 0
  • 作為幾十年都不上朝的奇葩皇帝萬歷呢今兒不是主角,雖然萬歷皇帝更有扯的亚情,但今天想和大家聊聊他弟弟潞王妄痪。 下面和大家扒...
    余七澤閱讀 5,986評(píng)論 9 9