熱更新簡述
熱更新 主要是差量更新,避免在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ī)做適配;不支持
類方法/字段,以及修改
方法,也不支持 對
;運(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一一致,否則會報 解析包異常 的問題