你真的瞭解Instant Run嗎?

什麼是Instant Run?服務器

咱們都知道,Android Studio功能很是強大,在各個功能性方面都要優於Eclipse,惟獨在速度方面被吐糟得比較慘。Android Studio團隊爲此也是作了不少的優化,在Android Studio 2.0中,對速度方面進行了大幅度的改進:app

能夠看到,Android Studio 2.0中編譯和部署的速度都有了很大程度的提高,但惟獨安裝速度沒有獲得提高,這很正常嘛,畢竟應用程序的安裝快慢是由咱們手機的硬件配置來決定的,和開發工具備什麼關係呢。
可是Android Studio團隊並不知足於此,他們想將速度提高到極致,因而在Android Studio 2.0中加入了Instant Run功能。固然,只要你的Android Studio版本在2.0以上,你不須要進行任何學習就可使用Instant Run,可是若是懂得了它背後的原理,你將可使用得更好。ide

傳統狀況下,咱們修改程序後從新運行一次程序須要經歷 代碼從新編譯 -> 中止程序 -> 從新安裝 -> 從新啓動 這樣一個過程,而Instant Run則嘗試只將程序變動的部分部署到手機上,儘可能避免從新安裝或從新啓動程序,以此大大提高調試程序的效率。工具

當咱們第一次運行程序以後,Android Studio中的運行按鈕會變成這個樣子:佈局

能夠看到,運行的三角形旁邊多了一個閃電符號,這就說明如今可使用Instant Run了。
Instant Run主要分爲三種類型,hot swap、warm swap和cold swap,Android Studio會根據代碼的修改狀況自動選擇使用哪一種swap類型,下面咱們就來針對這三種swap類型詳細地學習一下。學習

Hot Swap開發工具

hot swap是全部swap方式中效率最高的一種,應用程序不須要從新安裝,也不須要重啓就能夠完成程序變動。可是hot swap不會對程序中的對象進行從新初始化,也就是說可能某些場景下須要重啓Activity才能看出具體的變動內容。Android Studio對於hot swap這種狀況默認是重啓Activity的,固然你也能夠到設置中去改變這一默認行爲,具體路徑是 Settings -> Build, Execution, Deployment -> Instant Run -> Restart activity on code changes。優化

hot swap的適用條件比較少,只有一種狀況會被Android Studio視爲hot swap類型,就是修改一個現有方法中的代碼,效果以下圖所示:ui


能夠看到,我只改動了一個現有方法的內部代碼,從新運行後編譯和部署的速度都很是快,最關鍵的是,應用程序並無從新安裝或重啓,甚至於Activity都沒有重啓(因爲我進行了上述的設置),而後修改的代碼就成功替換了。
Warm Swapdebug

warm swap也很是快,這種swap類型一樣不須要從新安裝或重啓程序就能夠完成程序變動,可是warm swap要求必須重啓Activity。你會在界面上看到屏幕很快地閃一下,同時Activity的生命週期會從新執行。

warm swap的適用條件也比較侷限,只有一種狀況會被Android Studio視爲warm swap類型,就是修改或刪除一個現有的資源文件,效果以下圖所示:


能夠看到,我改動了佈局文件中的內容,從新運行後速度仍然很快,應用程序並無從新安裝或重啓,只是Activity重啓了一下,由於要將修改後的佈局內容展現到界面上。
Cold Swap

cold swap相對而言就要更慢一些了,Android Studio會自動記錄咱們項目的每次修改,而後將修改的這部份內容打成一個dex文件發送到手機上,儘管這種swap類型仍然不須要去安裝一個全新的APK,可是爲了加載這個新的dex文件,整個應用程序必須進行重啓才行。另外,cold swap的工做原理是基於multidex機制來實現的,在不引入外部library的狀況下,只有5.0及以上的設備才支持multidex,所以,若是你使用了5.0如下的設備,那麼cold swap就沒法工做了,這種狀況會執行最原始的完整APK安裝過程。

cold swap的適用條件很是多,下面我列出一個詳細的清單,有哪些狀況會被Android Studio視爲cold swap類型:

添加、刪除或修改一個註解
添加、刪除或修改一個字段
添加、刪除或修改一個方法
添加一個類
修改一個類的繼承結構
修改一個類的接口實現
修改一個類的static修飾符
涉及資源文件id的改動
那麼咱們仍是來看一下演示效果吧,以下圖所示:


能夠看到,這裏我給第二個Button添加了一個新的點擊事件方法,添加一個方法是知足cold swap條件的,那麼咱們明顯能夠看出,應用程序從新啓動了,可是總體的速度依然很快,整個從新運行的過程在5秒種以內完成的,個人截圖都是實時速度,沒有進行加速播放。
Full APK

除了知足以上條件的其餘程序變動,Instant Run目前都還不支持,主要包括如下一些狀況:

改變AndroidManifest.xml文件的內容
改變被AndroidManifest.xml文件所引用的資源,好比string.xml中的app_name
改變桌面widget的UI相關元素
當程序變動不被Instant Run所支持時,就會執行完整的APK安裝過程,同時Android Studio會給出這樣的提示:

因爲這種狀況從新運行時間比較長,就不給你們截圖演示了,之前咱們使用低於2.0版本的Android Studio開發時,每次都是執行的這種狀況。
固然,這只是目前的Instant Run規則,Android Studio團隊還會一直進行優化,增長hot swap和warm swap的條件,減小cold swap和full apk的條件,相信將來的Android Studio會更加好用。

Rerun

儘管Instant Run儘量地想要變得更智能,可是它也沒有時光倒流的能力。好比hot swap或者warm swap是根本不會重啓程序的,而若是你修改了一些只有在程序啓動的時候纔會初始化的代碼,那麼Instant Run對此也是無能爲力的,由於修改的代碼根本就沒有執行到。

針對這種狀況,Android Studio專門提供了一個Rerun按鈕:

中間那個按鈕就是Rerun按鈕,使用這個按鈕來從新運行程序,應用程序會被強制重啓,從而初始化的一些代碼就可以執行到了。Android Studio沒法得知改動的代碼是否是在程序初始化的時候才執行的,而咱們卻能夠知道,因此確保你理解了Rerun這個按鈕的做用,並在恰當的時機使用它。

補充

hot swap因爲其工做原理的限制還有一些特殊問題。hot swap會在應用程序的內部開啓一個服務器,而後由Android Studio自動計算出方法內實現的變動,將變動代碼發送到服務器,服務器再利用類加載器和委託機制將新的代碼實現注入到現有應用程序中,從而完成替換工做。

可是整個過程當中,新的代碼實現並無被保存到本地,也就是說一旦設備和Android Studio的鏈接斷掉了(好比拔掉數據線),咱們使用hot swap替換的代碼也就隨之不見了。當你再次打開程序的時候,你會看到這樣的提示:


看到這個提示並不用感到驚奇,這就說明你的hot swap代碼失效了,如今的程序仍然使用的老的代碼。遇到這種狀況只須要將手機連上電腦,而後在Android Studio中從新運行一下程序就能夠解決了。另外只有在debug模式下才可能會出現這個提示,release模式下是不可能出現的,因此不用擔憂這個提示會讓用戶感到困惑。

做者: 郭霖 連接:http://www.imooc.com/article/8679 來源:慕課網 本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做!

相關文章
相關標籤/搜索