1. 程式人生 > >Android Studio新功能解析,你真的瞭解Instant Run嗎?

Android Studio新功能解析,你真的瞭解Instant Run嗎?

轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/51271369
本篇文章首發於我的微信公眾號,由於網上講解Android Studio中Instant Run功能的文章實在是太少了,為了讓更多人可以瞭解這個技術,我將這篇文章同步到我的部落格上面。想看更多技術文章的朋友可以掃一掃本篇文章底部的二維碼來關注我的微信公眾號,每週都會有技術文章推送。

先扯點題外話,我是2010年8月份開始自學Android的,到現在已經快有6年的時間了。當時為了自學我專門買了一本書,叫《Android高階程式設計》,作者是Reto Meier,這本書現在仍然還在我的書架上,這是我剛拍的一張略顯陳舊的照片:


然後最近在學習Instant Run,看了下Android的官方視訊,我意外地發現,這位幫助我入門的帥哥竟然已經加入Google了。

現在我就想知道《第一行程式碼》的作者何時可以加入Google?這裡寫圖片描述

扯蛋就先扯到這裡,我們來進入今天的正題。

什麼是Instant Run?

我們都知道,Android Studio功能非常強大,在各個功能性方面都要優於Eclipse,唯獨在速度方面被吐糟得比較慘。Android Studio團隊為此也是做了很多的優化,在Android Studio 2.0中,對速度方面進行了大幅度的改進:


可以看到,Android Studio 2.0中編譯和部署的速度都有了很大程度的提升,但唯獨安裝速度沒有得到提升,這很正常嘛,畢竟應用程式的安裝快慢是由我們手機的硬體配置來決定的,和開發工具有什麼關係呢。

但是Android Studio團隊並不滿足於此,他們想將速度提升到極致,於是在Android Studio 2.0中加入了Instant Run功能。當然,只要你的Android Studio版本在2.0以上,你不需要進行任何學習就可以使用Instant Run,但是如果懂得了它背後的原理,你將可以使用得更好。

傳統情況下,我們修改程式後重新執行一次程式需要經歷 程式碼重新編譯 -> 停止程式 -> 重新安裝 -> 重新啟動 這樣一個過程,而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型別,就是修改一個現有方法中的程式碼,效果如下圖所示:


可以看到,我只改動了一個現有方法的內部程式碼,重新執行後編譯和部署的速度都非常快,最關鍵的是,應用程式並沒有重新安裝或重啟,甚至於Activity都沒有重啟(由於我進行了上述的設定),然後修改的程式碼就成功替換了。

Warm Swap

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模式下是不可能出現的,所以不用擔心這個提示會讓使用者感到困惑。

關注我的技術公眾號,每天都有優質技術文章推送。關注我的娛樂公眾號,工作、學習累了的時候放鬆一下自己。

微信掃一掃下方二維碼即可關注: