2019-04-07 熱更新

熱更新簡(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ī)適配评甜;不支持 \color{#ff0000}{新增} 類(lèi)方法/字段,以及修改 \color{#ff0000}{<init>}方法仔涩,也不支持 對(duì)\color{#ff0000}{資源的替換}忍坷;運(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)題

具體的實(shí)例

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柬批,一起剝皮案震驚了整個(gè)濱河市啸澡,隨后出現(xiàn)的幾起案子袖订,更是在濱河造成了極大的恐慌氮帐,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洛姑,死亡現(xiàn)場(chǎng)離奇詭異上沐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)楞艾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)参咙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人硫眯,你說(shuō)我怎么就攤上這事蕴侧。” “怎么了两入?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵净宵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我裹纳,道長(zhǎng)择葡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任剃氧,我火速辦了婚禮敏储,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朋鞍。我一直安慰自己已添,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布滥酥。 她就那樣靜靜地躺著更舞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恨狈。 梳的紋絲不亂的頭發(fā)上疏哗,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音禾怠,去河邊找鬼返奉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吗氏,可吹牛的內(nèi)容都是我干的芽偏。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼弦讽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼污尉!你這毒婦竟也來(lái)了膀哲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤被碗,失蹤者是張志新(化名)和其女友劉穎某宪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锐朴,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兴喂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了焚志。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衣迷。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酱酬,靈堂內(nèi)的尸體忽然破棺而出壶谒,到底是詐尸還是另有隱情,我是刑警寧澤膳沽,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布汗菜,位于F島的核電站,受9級(jí)特大地震影響贵少,放射性物質(zhì)發(fā)生泄漏呵俏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一滔灶、第九天 我趴在偏房一處隱蔽的房頂上張望普碎。 院中可真熱鬧,春花似錦录平、人聲如沸麻车。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)动猬。三九已至,卻和暖如春表箭,著一層夾襖步出監(jiān)牢的瞬間赁咙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工免钻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彼水,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓极舔,卻偏偏與公主長(zhǎng)得像凤覆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拆魏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 為什么有的人看起來(lái)每天很忙而碌碌無(wú)為盯桦?為什么有的人看起來(lái)一天沒(méi)有什么規(guī)劃卻干了很多事情慈俯?這兩天我自己沒(méi)什么零花錢(qián)了...
    牟欣Demi閱讀 319評(píng)論 0 0
  • 那鄰人聽(tīng)了倒并沒(méi)有堅(jiān)決地表示什么,可是他的母親的臉立刻就紅了拥峦,伸出手去就打了那孩子贴膘。 那孩子很固執(zhí),仍是說(shuō): “是...
    011ddc66a39b閱讀 268評(píng)論 0 0
  • 觀音像有朋友知道是什么東西嗎
    Mymymy_0de0閱讀 208評(píng)論 0 0
  • 我所不能了解的事镣, 花兒為什么不能哼起古老的情歌步鉴。 我所不能了解的, 彎彎的小河怎么不在天空流淌璃哟。 我所不能了解的,...
    心的字閱讀 200評(píng)論 3 0
  • 第一次在這里寫(xiě)東西喊递,很陌生随闪,想起多年前我也是喜歡記日記的人,又有了信心骚勘,從現(xiàn)在開(kāi)始吧铐伴,哪怕流水賬的日記也好...
    靜待花開(kāi)ccll閱讀 172評(píng)論 0 0