2019-04-07 熱更新

熱更新簡述

熱更新 主要是差量更新,避免在apk功能升級之后 需要重新下載整個的apk,避免用戶流量損耗。而熱更新 主要分為兩派 微信thinker系列阿里andFix系列



微信的thinker

微信Tinker為了解決QQ空間補(bǔ)丁技術(shù)由于插樁帶來的效率問題,引入DEX差量包。其主要的原理與QQ空間超級補(bǔ)丁技術(shù)基本相同,最大區(qū)別在于:不再將Patch.dex增加到Elements數(shù)組中,而是差量的方式給出Patch.Dex;然后將Patch.Dex與應(yīng)用的Classes.Dex合并,然后整體替換掉舊的DEX,達(dá)到修復(fù)的目的。

該方案中通過自研DexDiff算法,深度利用Dex格式來減少差異的大小,從而做到補(bǔ)丁包足夠小。其缺點(diǎn)在于:不支持實時生效;由于補(bǔ)丁DEX需要和原DEX合并,需要占用額外內(nèi)存和磁盤空間,并且很容易因為內(nèi)存消耗等原因合并失敗;與QQ空間補(bǔ)丁技術(shù)相同,同樣需要侵入式打包。



阿里的AndFix

阿里andfix 熱修復(fù)方案通過Hook本地方法. 并沒有整體替換class,整體流程如下:第一步,打開鏈接庫得到操作句柄, 獲取native層內(nèi)部函數(shù), 得到classobject對象;第二步,修復(fù)訪問權(quán)限屬性為Public ;第三步,得到新舊方法的指針,新方法指向目標(biāo)方法,實現(xiàn)方法的替換。

整個過程中不侵入打包,性能無損耗;同時可以即時生效。其缺點(diǎn)同樣明顯:兼容性方面很不穩(wěn)定,需要針對Dalvik虛擬機(jī)Art虛擬機(jī)適配;不支持 \color{#ff0000}{新增} 類方法/字段,以及修改 \color{#ff0000}{<init>}方法,也不支持\color{#ff0000}{資源的替換};運(yùn)行時方法被Patch,有Crash風(fēng)險



阿里Hotfix 1.x版本

阿里Hotfix 1.x在AndFix的基礎(chǔ)上,增加了補(bǔ)丁管理后臺;同時基于手淘的實踐,針對AndFix做了大量優(yōu)化, 性能提高兼容穩(wěn)定性;功能上支持 新增類并提供了更小補(bǔ)丁包(這是因為基于類方法作為粒度)

 1.缺點(diǎn):
        1.1不支持資源、So文件修復(fù);不支持新增類方法/類字段,這是因為Hotfix 1.x本質(zhì)上是Hook一個已存在的的方法;

        1.2 參數(shù)包括Long、Double、Float基本類型的方法不能被Patch,同時參數(shù)超過8的方法不能被Patch;

        1.3被反射調(diào)用的方法不能被Patch,具體來說是非靜態(tài)方法的反射調(diào)用會提示IllegalArgumentException 異常,當(dāng)靜態(tài)方法被反射調(diào)用,
           如果反射調(diào)用不涉及類對象,則可以被Patch;

        1.4構(gòu)造方法不能被Patch,實際上不允許修改一個類字段(包括靜態(tài)的和非靜態(tài)的) 
       
        1.5正在運(yùn)行的方法不能被Patch,也就是說如果一個方法正在運(yùn)行,然后方法的在Native層的結(jié)構(gòu)被替換, 那么就很可能導(dǎo)致Crash。



綜上所述

阿里Hotfix和主流的熱修復(fù)方案的效果對比??梢钥闯?,在即時生效、性能消耗、Rom體積、接入復(fù)雜度、補(bǔ)丁包大小、類替換、SO文件替換、資源方案等方面,百川Hotfix都具有相對的優(yōu)勢。



自己實踐bsdiff

bsdiff 并 不是專門apk增量更新設(shè)計的,它可以對任何二進(jìn)制文件進(jìn)行差分合并 。bzip2的功能是利用哈夫曼編碼 對文件進(jìn)行無損壓縮 (將差分包 進(jìn)行壓縮便于網(wǎng)絡(luò)傳輸 )和解壓。所以完整的流程是這樣的:

 1:bsdiff生成 patch->  bzip2壓縮->  android下載patch->   bzip2解壓patch->  bspatch合并patch->    新的apk

主要能夠?qū)崿F(xiàn):
1:修復(fù)方法級別的bug
2:新增類文件,資源布局等
3:保證基礎(chǔ)更新的apk 與差量生成patch文件的 基礎(chǔ)apk一一致,否則會報 解析包異常 的問題

具體的實例

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 為什么有的人看起來每天很忙而碌碌無為?為什么有的人看起來一天沒有什么規(guī)劃卻干了很多事情?這兩天我自己沒什么零花錢了...
    牟欣Demi閱讀 357評論 0 0
  • 那鄰人聽了倒并沒有堅決地表示什么,可是他的母親的臉立刻就紅了,伸出手去就打了那孩子。 那孩子很固執(zhí),仍是說: “是...
    011ddc66a39b閱讀 306評論 0 0
  • 觀音像有朋友知道是什么東西嗎
    Mymymy_0de0閱讀 246評論 0 0
  • 我所不能了解的, 花兒為什么不能哼起古老的情歌。 我所不能了解的, 彎彎的小河怎么不在天空流淌。 我所不能了解的,...
    心的字閱讀 223評論 3 0
  • 第一次在這里寫東西,很陌生,想起多年前我也是喜歡記日記的人,又有了信心,從現(xiàn)在開始吧,哪怕流水賬的日記也好...
    靜待花開ccll閱讀 224評論 0 0

友情鏈接更多精彩內(nèi)容