熱更新簡(jiǎn)述
熱更新 主要是差量更新,避免在apk功能升級(jí)之后 需要重新下載整個(gè)的apk恢氯,避免用戶流量損耗邓馒。而熱更新 主要分為兩派 微信thinker系列 和 阿里andFix系列
微信的thinker
微信Tinker為了解決QQ空間補(bǔ)丁技術(shù)由于插樁帶來(lái)的效率問(wèn)題墙杯,引入DEX差量包。其主要的原理與QQ空間超級(jí)補(bǔ)丁技術(shù)基本相同丑搔,最大區(qū)別在于:不再將Patch.dex增加到Elements數(shù)組中厦瓢,而是差量的方式給出Patch.Dex;然后將Patch.Dex與應(yīng)用的Classes.Dex合并啤月,然后整體替換掉舊的DEX煮仇,達(dá)到修復(fù)的目的。
該方案中通過(guò)自研DexDiff算法谎仲,深度利用Dex格式來(lái)減少差異的大小浙垫,從而做到補(bǔ)丁包足夠小。其缺點(diǎn)在于:不支持實(shí)時(shí)生效郑诺;由于補(bǔ)丁DEX需要和原DEX合并夹姥,需要占用額外內(nèi)存和磁盤(pán)空間,并且很容易因?yàn)?strong>內(nèi)存消耗等原因合并失敗辙诞;與QQ空間補(bǔ)丁技術(shù)相同辙售,同樣需要侵入式打包借帘。
阿里的AndFix
阿里andfix 熱修復(fù)方案通過(guò)Hook本地方法. 并沒(méi)有整體替換class疤苹,整體流程如下:第一步,打開(kāi)鏈接庫(kù)得到操作句柄, 獲取native層內(nèi)部函數(shù), 得到classobject對(duì)象叙身;第二步封拧,修復(fù)訪問(wèn)權(quán)限屬性為Public 志鹃;第三步,得到新舊方法的指針泽西,新方法指向目標(biāo)方法曹铃,實(shí)現(xiàn)方法的替換。
整個(gè)過(guò)程中不侵入打包捧杉,性能無(wú)損耗陕见;同時(shí)可以即時(shí)生效。其缺點(diǎn)同樣明顯:兼容性方面很不穩(wěn)定味抖,需要針對(duì)Dalvik虛擬機(jī)和Art虛擬機(jī)做適配评甜;不支持
類(lèi)方法/字段,以及修改
方法仔涩,也不支持 對(duì)
忍坷;運(yùn)行時(shí)方法被Patch,有Crash風(fēng)險(xiǎn)
阿里Hotfix 1.x版本
阿里Hotfix 1.x在AndFix的基礎(chǔ)上,增加了補(bǔ)丁管理后臺(tái)佩研;同時(shí)基于手淘的實(shí)踐柑肴,針對(duì)AndFix做了大量?jī)?yōu)化, 性能上提高了兼容和穩(wěn)定性旬薯;功能上支持 新增類(lèi)并提供了更小的補(bǔ)丁包(這是因?yàn)榛陬?lèi)方法作為粒度)
1.缺點(diǎn):
1.1不支持資源晰骑、So文件修復(fù);不支持新增類(lèi)方法/類(lèi)字段绊序,這是因?yàn)镠otfix 1.x本質(zhì)上是Hook一個(gè)已存在的的方法硕舆;
1.2 參數(shù)包括Long、Double政模、Float基本類(lèi)型的方法不能被Patch岗宣,同時(shí)參數(shù)超過(guò)8的方法不能被Patch;
1.3被反射調(diào)用的方法不能被Patch淋样,具體來(lái)說(shuō)是非靜態(tài)方法的反射調(diào)用會(huì)提示IllegalArgumentException 異常耗式,當(dāng)靜態(tài)方法被反射調(diào)用,
如果反射調(diào)用不涉及類(lèi)對(duì)象趁猴,則可以被Patch刊咳;
1.4構(gòu)造方法不能被Patch,實(shí)際上不允許修改一個(gè)類(lèi)字段(包括靜態(tài)的和非靜態(tài)的)
1.5正在運(yùn)行的方法不能被Patch儡司,也就是說(shuō)如果一個(gè)方法正在運(yùn)行娱挨,然后方法的在Native層的結(jié)構(gòu)被替換, 那么就很可能導(dǎo)致Crash。
綜上所述
阿里Hotfix和主流的熱修復(fù)方案的效果對(duì)比捕犬□伟樱可以看出,在即時(shí)生效碉碉、性能消耗柴钻、Rom體積、接入復(fù)雜度垢粮、補(bǔ)丁包大小贴届、類(lèi)替換、SO文件替換蜡吧、資源方案等方面毫蚓,百川Hotfix都具有相對(duì)的優(yōu)勢(shì)。
自己實(shí)踐bsdiff
bsdiff 并 不是專(zhuān)門(mén)為 apk增量更新設(shè)計(jì)的昔善,它可以對(duì)任何二進(jìn)制文件進(jìn)行差分 和 合并 元潘。bzip2的功能是利用哈夫曼編碼 對(duì)文件進(jìn)行無(wú)損壓縮 (將差分包 進(jìn)行壓縮便于網(wǎng)絡(luò)傳輸 )和解壓。所以完整的流程是這樣的:
1:bsdiff生成 patch-> bzip2壓縮-> android下載patch-> bzip2解壓patch-> bspatch合并patch-> 新的apk
主要能夠?qū)崿F(xiàn):
1:修復(fù)方法級(jí)別的bug
2:新增類(lèi)文件,資源布局等
3:保證基礎(chǔ)更新的apk 與差量生成patch文件的 基礎(chǔ)apk一一致君仆,否則會(huì)報(bào) 解析包異常 的問(wèn)題