天天看點

歡迎使用CSDN-markdown編輯器Android熱修複技術選型的三大流派解析

Android熱修複技術選型的三大流派解析

2015年以來,Android開發領域裡對熱修複技術的讨論和分享越來越多,同時也出現了一些不同的解決方案,如QQ空間更新檔方案、阿裡AndFix以及微信Tinker,它們在原理各有不同,适用場景各異,到底采用哪種方案,通過介紹QQ空間更新檔、Tinker以及基于AndFix的阿裡百川HotFix技術的原理分析和橫向比較

一、熱修複的技術的發展史

熱修複技術的由來

  1. 從傳統的開發流程來講,存在很多弊端:
    • 重新發版本的代價太大
    • 使用者下載下傳安裝成本太高
    • 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[],達到修複目的
               
歡迎使用CSDN-markdown編輯器Android熱修複技術選型的三大流派解析
歡迎使用CSDN-markdown編輯器Android熱修複技術選型的三大流派解析
優勢:
        1、沒有整合包(這是和下面微信的Tinker比起來),産物表較小,比較靈活
        2、可以實作類替換,相容性高。(某些三星手機不起作用)
    不足:
        1、不會及時生效,必須通過重新開機才能生效。
        2、耗時嚴重,會增加啟動時間,導緻ANR的機率明顯增大
           

2、微信Tinker

微信針對QQ空間超級更新檔技術的不足提出了一個提供DEX差量包,整體替換DEX的方案。主要的原理
是與QQ空間超級更新檔技術基本相同,差別在于不再将 patch.dex增加到elements數組中,而是差量
的方式給出patch.dex,然後将patch.dex與應用的classes.dex合并,然後整體替換掉舊的DEX,達
到修複的目的。
           
歡迎使用CSDN-markdown編輯器Android熱修複技術選型的三大流派解析
歡迎使用CSDN-markdown編輯器Android熱修複技術選型的三大流派解析
優勢:
        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、得到新舊方法的指針,新的方法指向目标方法,實作方法的替換
           
歡迎使用CSDN-markdown編輯器Android熱修複技術選型的三大流派解析
歡迎使用CSDN-markdown編輯器Android熱修複技術選型的三大流派解析
歡迎使用CSDN-markdown編輯器Android熱修複技術選型的三大流派解析
優勢:
       1、bug的修複的及時性
       2、更新檔包同樣采用差量技術,生成patch體積最小
       3、對應用無入侵,幾乎無性能損耗

    不足:
      1、不支援四大元件的新增和修改以及主題資源的配置。
      2、由于是其平台内部是判别是熱修複還是冷修複,是以有時候可能無法達到自己想要的結果。
           

三、總結:

QQ空間超級更新檔技術和微信Tinker 支援新增類和資源的替換,但對應用的性能和穩定會有的一定的影響;阿裡百川HotFix雖然
支援新增類和資源的替換,但也有所限制,但是作為一項定位為線上緊急
BUG的熱修複的服務來說,能夠真正做到BUG即時修複使用者無感覺,同時保證對應用性能
不産生不必要的損耗,在熱修複方面不失為一個好的選擇
           
歡迎使用CSDN-markdown編輯器Android熱修複技術選型的三大流派解析