Android熱修複技術選型的三大流派解析
2015年以來,Android開發領域裡對熱修複技術的讨論和分享越來越多,同時也出現了一些不同的解決方案,如QQ空間更新檔方案、阿裡AndFix以及微信Tinker,它們在原理各有不同,适用場景各異,到底采用哪種方案,通過介紹QQ空間更新檔、Tinker以及基于AndFix的阿裡百川HotFix技術的原理分析和橫向比較
一、熱修複的技術的發展史
熱修複技術的由來
- 從傳統的開發流程來講,存在很多弊端:
- 重新發版本的代價太大
- 使用者下載下傳安裝成本太高
- bug修複不及時,使用者體驗太差
2、熱修複開發流程
上線版本–使用者安裝–發現bug–緊急修複–打出更新檔,推送給使用者–自動拉取更新檔修複
而熱修複的開發流程顯得更加靈活,優勢很多:
- 無需重新發版,實時高效熱修複
- 使用者無感覺修複,無需下載下傳新的應用,代價小
- 修複成功率高,把損失降到最低
二、三大主流的熱修複技術
1、QQ空間超級更新檔技術
超級更新檔技術基于DEX分包方案,使用了多DEX加載的原理,大緻的過程就是:
把BUG方法修複以後,放到一個單獨的DEX裡,插入到dexElements數組的最前面,讓虛拟機去加載
修複完後的方法。當patch.dex中包含Test.class時就會優先加載,在後續的DEX中遇到Test.class的
話就會直接傳回而不去加載,這樣就達到了修複的目的。
但是有一個問題是,當兩個調用關系的類不在同一個DEX時,就會産生異常報錯。我們知道,在APK
安裝時,虛拟機需要将classes.dex優化成odex檔案,然後才會執行。在這個過程中,會進行類的verify
操作,如果調用關系的類都在同一個 DEX中的話就會被打上CLASS_ISPREVERIFIED的标志,然後才會寫入odex檔案。
是以,為了可以正常的進行打更新檔修複,必須避免類被打上CLASS_ISPREVERIFIED 标志,具體的做法就是
單獨放一個類在另外DEX中,讓其他類調用。
修複的主要步驟:
1、可以看出是通過擷取到目前應用的Classloader 2、通過反射調用pathList的dexElements方法把patch.dex轉化為Element[] 3、兩個Element[]進行合并,把patch.dex放到最前面去 4、加載Element[],達到修複目的
優勢:
1、沒有整合包(這是和下面微信的Tinker比起來),産物表較小,比較靈活
2、可以實作類替換,相容性高。(某些三星手機不起作用)
不足:
1、不會及時生效,必須通過重新開機才能生效。
2、耗時嚴重,會增加啟動時間,導緻ANR的機率明顯增大
2、微信Tinker
微信針對QQ空間超級更新檔技術的不足提出了一個提供DEX差量包,整體替換DEX的方案。主要的原理
是與QQ空間超級更新檔技術基本相同,差別在于不再将 patch.dex增加到elements數組中,而是差量
的方式給出patch.dex,然後将patch.dex與應用的classes.dex合并,然後整體替換掉舊的DEX,達
到修複的目的。
優勢:
1、合成整包,不用在構造函數插入代碼,防止verify,verify和opt在編
譯期間就已經完成,不會在運作期間進行
2、性能提高。相容性和穩定性比較高
3、開發者透明,不需要對包進行額外處理(不需要在構造函數中添加代碼)
劣勢:
1、與超級更新檔技術一樣,不支援即時生效,必須通過重新開機應用的方式才能效
2、需要給應用開啟新的程序才能進行合并,并且很容易因為記憶體消耗等原因合并失敗。
3、合并時占用額外磁盤空間,對于多DEX的應用來說,如果修改了多個DEX檔案,就需要下發
多個patch.dex與對應的classes.dex進行合并操作時這種情況會更嚴重,是以合并過
程的失敗率也會更高
3、阿裡百川HotFix
阿裡百川推出的熱修複HotFix服務,相對于QQ空間超級更新檔技術和微信Tinker來說,定位于緊
急bug修複的場景下,能夠最及時的修複bug,下拉更新檔立即生效無需等待。
實作的原理:
AndFix不同于QQ空間超級更新檔技術和微信Tinker通過增加或替換整個DEX的
方案,提供了一種運作時在Native修改Filed指針的方式,實作方法的替
換,達到即時生效無需重新開機,對應用無性能消耗的目的
實作的過程步驟:
1、打開連結庫操作句柄,獲得native層内部函數,得到ClassObject對象
2、修改通路權限屬性為public(Classloader 不同)
3、得到新舊方法的指針,新的方法指向目标方法,實作方法的替換
優勢:
1、bug的修複的及時性
2、更新檔包同樣采用差量技術,生成patch體積最小
3、對應用無入侵,幾乎無性能損耗
不足:
1、不支援四大元件的新增和修改以及主題資源的配置。
2、由于是其平台内部是判别是熱修複還是冷修複,是以有時候可能無法達到自己想要的結果。
三、總結:
QQ空間超級更新檔技術和微信Tinker 支援新增類和資源的替換,但對應用的性能和穩定會有的一定的影響;阿裡百川HotFix雖然
支援新增類和資源的替換,但也有所限制,但是作為一項定位為線上緊急
BUG的熱修複的服務來說,能夠真正做到BUG即時修複使用者無感覺,同時保證對應用性能
不産生不必要的損耗,在熱修複方面不失為一個好的選擇