阿里巴巴 「百川解碼「第一期精彩回顧:熱修復的坑和阿里的解

熱修復是不少開發者關心的技術,8月27日晚,阿里百川組織了「百川解碼」在線直播,以「熱修復的坑和阿里的解」爲主題,邀請了三位業界嘉賓對熱修復技術進行了探討,並介紹了阿里百川全面接受公測的熱修復解決方案:阿里百川HotFix,就網友提出的相關問題進行了解答。本文是這次直播的精彩回顧。編程

嘉賓簡介數組

歩川,阿里巴巴資深開發工程師,《讓App像Web同樣發佈新版本》一文做者,在OPPO從事Android Framework兩年,騰訊QQ空間工做一年半,熱衷研究安卓熱補丁方案。目前在手機淘寶終端架構,主要負責動態部署加強和優化、存儲相關工做。安全

劉昭,中華英才網Android技術負責人,具備豐富的移動開發經驗,崇尚開源社區文化,關注性能優化、研發效率、熱修復、插件化、數據驅動等,善於評估技術方案,解決疑難雜症。性能優化

澤胤,阿里巴巴無線技術專家,阿里百川HotFix項目負責人,無線事業部初創技術員工之一。經歷阿里巴巴無線技術從小到大的整個過程,參與過多個無線的重要項目,包括無線的H5建站,無線統一接入層,阿里的無線PUSH系統,以及初版的Android客戶端等。主要技術方向是在線高併發和高可用性的維護與實現。網絡

  1. 熱修復是什麼數據結構

劉昭認爲,熱修復是在應用的App包發佈到市場以後,出現了Bug,無需替換包來進行在線更新的一種技術,對用戶是無感知的。架構

澤胤認爲,談到熱修復,就應該和動態部署的概念進行區分。熱修復是特指對微小改動進行修復的一個技術,它強調快速和無感的修復。而動態部署會複雜更多,它涵蓋的東西也更多,但核心的技術仍是熱修復技術。併發

步川認爲,熱修復能夠從技術上來理解並和動態部署進行區分。他提到,目前廣義上有兩種方案能夠實現代碼的替換,一種是類的替換,基於Classloader,另外一種是方法的替換,而這兩種方式各有優缺點。編程語言

方法的替換:只能替換方法的內容,因此不可以對要patch的類進行方法的新增和刪除;但同時,方法的替換能夠在應用不重啓的狀況下實現。它包小、快速、功能單1、比較輕量,這種方案是熱修復。
類的替換:能夠修改類結構,功能更加的強大;可是必需要重啓一次纔會有效,由於已經加載過的類是不可以被替換的。這種方案叫作「動態部署」。它幾乎可以適應任何代碼的變動,因此很適合進行業務功能的迭代。函數

  1. 熱修復技術對比

目前,業內有不少的熱修復方案,步川就熱修復技術向觀衆進行了對比講解。他提到,從廣義上來說,熱修復的實現方式能夠被分爲類的替換和方法的替換。

類的替換

如圖1所示,APK包中包含了代碼和資源,代碼存放在classes.dex中,資源存放在APK的res目錄下,系統會經過ClassLoader裝載classes.dex來進行類加載。若是有多個classes.dex,那麼這多個classes.dex會在ClassLoader中會用數組的形式來進行組織,而後從前日後進行遍歷查找。

圖片描述

圖1

一種具體的方案如圖2所示,是利用多dex從前日後遍歷的有序特性,把patch.dex插入到數組的最前面,對patch進行有限查找,達到替換的目的,這時候就會出現preverify問題,爲了繞過這個問題,就必須往每一個類的構造函數裏面進行插樁防止安裝期間的校驗,把校驗從編譯期間移動到了運行期間,致使運行期間每加載一個類,都要進行校驗和優化,下降了運行性能。

圖片描述

圖2

劉昭認爲,這種方案利用了ClassLoader,思想是比較好的,可是若是工程中的類比較多,就會在性能上形成比較大的影響。同時,有可能會致使patch包比較大。

步川提到,爲了解決上述性能問題,出現了另外一種方案,如圖3所示:就是全量替換dex,下發一個patch.dex,而後把原來的dex和下發的patch.dex,合成一個新的全量dex,這個dex會全量替換原來的dex,最終本質上也只會在這個全量的dex中查找,從而不會出現preverify問題,因此這種方案不用插入構造函數,不會影響性能。可是,這種方案的包也可能會比較大,只改動了一行代碼,也必須合成一個全量的dex,如圖4所示,而後再dexopt出一個全量的odex。

圖片描述

圖3

圖片描述

圖4

方法的替換

如圖5所示,方法的替換的原理以下:在Android底層,有個數據結構記錄着類的信息,好比成員變量的個數,方法的個數,每一個方法的code執行地址,程序運行的時候會根據這個地址跳轉到具體的code區域執行代碼。方法的替換就是替換這些地址,把地址指向另外一個類的方法,從而達到了替換的目的。這種方式的包比較小,並且也不須要插樁來影響性能,可是它沒法修改類的結構(好比方法數的增刪),並且有可能會有兼容性問題,例如廠商修改了類和方法的底層結構。

圖片描述

圖5

因此基於他們的優勢和限制,區分熱修復和動態部署這兩種場景,能夠在這兩種不一樣的狀況下,選擇最優的方案,達到修復的目的。

  1. 如何選擇熱修復技術方案

劉昭認爲,熱修復技術方案的選擇應該對應具體的使用場景。在patch包的數量、大小方面,HotFix是佔優點的;可是HotFix不能新增類、新增字段(下文澤胤有迴應),從這個角度考慮,ClassLoader更好,可是會有必定的性能損耗;合成dex的方式,則須要知道用戶手機的ROM有多大,能不能提供20多M的空間來。

  1. 基於AndFix的阿里百川HotFix作了哪些優化工做

阿里百川HotFix是基於AndFix的,澤胤提到,手機淘寶(下文簡稱「手淘」)對於Andfix實踐了大約一年左右,在工程和技術上作了一些改善,提升了其在穩定性、周邊工具鏈的性能和穩定性等方面的表現,使得這項技術更加成熟,同時也解決了不能新增類等問題,併成功落地手淘App。

具體的優化工做包括:在產品化方面,接入簡單,2行代碼便可接入,通常開發者1個小時便可徹底跑通流程,大大下降工程成本;提供了相對完善的周邊工具鏈,經過後臺操做自由控制patch發佈,最大化保證用戶體驗。針對patch打包慢的問題進行優化,持續在工具鏈方面進行優化;在「打包工具交互」方面,開發了一個獨立的可執行文件,能夠在工程裏面,用GRADLE、ANT中集成,甚至在JENKINS裏面去執行,提升了靈活性。

在產品化方面,接入簡單,2行代碼便可接入,通常開發者1個小時便可徹底跑通流程,大大下降工程成本;提供了相對完善的周邊工具鏈,經過後臺操做自由控制patch發佈,最大化保證用戶體驗。

在安全方面,澤胤也作了說明:第一,阿里會提供一個私有RSA加密的功能,開發者在本地打出包之後用本身的RSA密鑰對中的私鑰加密,而後上傳百川平臺,再在SDK中放置本身的公鑰做爲解碼用,這樣上傳的內容徹底加密確保絕對的信息安全,且不會被阿里看到;第二,傳輸層面,在設計上採用兩級的加密,動態密鑰和靜態密鑰相結合,所以網絡攔截沒法竊取到包內容。

  1. 熱修復的將來

從商業價值上來說,開發者目前很是須要熱修復技術,因此有必定的價值,可是將來,若是官方提供相應的功能,或者說React Native 等技術減弱了開發者對熱修復技術的依賴,則會對熱修復的技術產品形成衝擊。對於這樣的狀況,澤胤認爲,做爲技術人員,要不斷學習進步。一項技術若是沒有了被使用的價值,那麼它是應該被淘汰掉的,例如歷史上不少編程語言或者技術的消亡。澤胤表示,產品的迭代和消亡也是很正常的。很樂意看到有新的,知足開發者需求的技術能夠代替老的技術。

步川認爲,從方案講,熱修復和動態部署不是互相排斥的,在特定的場景下二者均可以作到最優,配合使用更佳。手淘同時使用這兩項技術,用熱修復解決Bug,用動態部署來迭代業務,相互配合好則會達到很完美的狀態。

劉昭提出,Android Studio 2.0以後,提供了Instant Run這樣的功能,從思想上來說是很是好地解決了熱修復patch的問題,以後的熱修復有沒有可能借鑑其思想?對於這個問題,步川認爲,Instant Run的更新力度比較大,同時又在代碼中增長了預埋邏輯,侵入性比較大。若基於Class Loader來開發一個工具,或許會更簡單。

  1. 阿里百川HotFix開始公測

澤胤提到,市場上缺乏阿里百川HotFix這樣的產品,雖然熱修復原理解析不少,可是真正難的是把這項技術作成熟、作穩定。基於手淘App這個大平臺,由工程實踐出來的阿里百川HotFix產品,能夠推出獨立的服務來知足市場上的需求。澤胤提到,阿里百川會有專門的團隊持續跟進該產品,解決問題,吸納用戶意見。

阿里百川HotFix從直播當晚開始正式進行公測,你還沒申請公測?

來吧點我!阿里百川HotFix公測申請

相關文章
相關標籤/搜索