android熱修復相關的意義就不多說了,最近需求之余在看相關的內容,接下來的文章會抽空分析一下熱修復相關的知識點,先來看一下目前比較知名的方案。
熱修復方案的類型
從原理上來分大致有以下三類:native方案,classloader方案和插入靜態變量埋點方案。
native 方案主要強調的是即時生效,主要來自于阿里系:
Andfix:https://github.com/alibaba/AndFix
Sophix:阿里最新的熱更新方案,通過整體替換ArtMethod提高兼容性,同時結合classloader方案融入冷啟動,進行自動切換,可惜未開源。classloader方案的鼻祖來自于QQ空間,但是QQ空間沒有開源,這里只列出開源方案,主要來自于騰訊系:
Nuwa: https://github.com/jasonross/Nuwa
HotFix:https://github.com/dodola/HotFix
Tinker: https://github.com/Tencent/tinker插入靜態變量埋點方案最早來源于InstantRun的熱部署方案,主要指的是美團的Robust,此外還有蘑菇街的Aceso。
Robust:https://github.com/Meituan-Dianping/Robust
Aceso:https://github.com/meili/Aceso
對于整個android系統來說,熱修復方案其實是一種逆向行為,無論是哪種方案,都可能存在兼容性問題的,而且每次android新版本發布,尤其對虛擬機等做優化時,基本上都會成為熱修復的“坑”。不管別的,熱修復里面涉及到的知識點都是值得我們學習的,所以我決定較為系統的學習一下,提升自己的技能。
熱修復方案的特點
最突出的優點
native方案:即時生效,無需重啟,這基本上是native方法的唯一優點。
classloader方案:修復范圍廣,包括代碼,資源,so等均可修復。
埋點方案:兼容性好缺點
native方案:兼容性較差,過于底層,bug不好定位,雖然阿里的sophix進行了修復,我個人認為還是存在兼容性問題的,據同事測試反映,基本上熱啟動的幾率很小,大部分都走的是冷啟動方案。
classloader方案:之前不了解時覺得這個方案除了需要重啟生效外,沒有其他明顯的缺點,后來發現這個方案其實最大的問題在于Art虛擬機不斷優化帶來的兼容性問題。
埋點方案:修復范圍小,且打patch較復雜,雖然已經實現了自動化patch,也有一些情況自動化patch無法完成或者有誤。
熱修復方案的選擇
大的選擇無非就是用別人的還是自己開發。除非公司支持,否則短時間開發出一個穩定的熱修復方案是非常不容易的一件事,而且對基礎要求比較高,需要不斷的實踐,填坑。如果選擇開源方案,建議選擇靠譜的方案,比如Tinker或者Sophix,技術支持做的很好,但是方案確實非常重。至于美團的Robust,技術支持相對做的較差,或者人家就是給大家個思路,沒打算做技術支持,我們完全可以參照Robust自行實現一套,我司目前的熱修復方案就是參照Robust完成的。
個人建議:如果項目采用的是插件化架構,最好做的徹底點,盡量架空主項目,在主項目中使用類Robust方案,結合動態下發插件;如果是組件化方案,可以考慮接入Tinker或者Sophix,畢竟修復范圍要廣的多。
熱修復研究的意義
native方案:想要弄懂,需要去深入了解虛擬機相關知識,包括虛擬機底層執行類和方法的流程,雖然native方案存在兼容性問題,但是完全可以應用于逆向分析領域,可以和如下的逆向分析開源庫歸為一類。
- Xposed(hook鼻祖級神器) https://github.com/rovo89/Xposed
- substrate(底層hook神器) http://www.cydiasubstrate.com
- legend(java版andfix) https://github.com/asLody/legend
- epic(andfix變種,利用java層的Method替換代替ArtMethod替換) https://github.com/tiann/epic
YAHFA(Yet Another Hook Framework for ART,類andfix) https://github.com/rk700/YAHFA
classloader方案:涉及到MultiDex,InstantRun,類加載器原理,dalvik的dexopt,art的dexoat等知識
埋點方案:涉及到InstantRun及字節碼相關技術。
這篇文章只是作為一個基本的介紹,不涉及任何原理。從下一篇文章開始具體介紹各個方案的技術點。
目前本人在公司負責熱修復相關的工作,主要是基于robust的熱修復相關工作。感興趣的同學歡迎進群交流。