Android熱更新七:Tinker熱更新原理

很早之前就想深入的研究和學(xué)習(xí)一下熱修復(fù)暇检,由于時間的原因一直拖著涉枫,現(xiàn)在才執(zhí)筆弄起來梧田。


Android而更新系列:
Android熱更新一:JAVA的類加載機制
Android熱更新二:理解Java反射
Android熱更新三:Android類加載機制
Android熱更新四:熱修復(fù)機制
Android熱更新五:四大熱修復(fù)方案分析
Android熱更新六:Qzone熱更新原理
Android熱更新七:Tinker熱更新原理
Android熱更新八:AndFix熱更新原理
Android熱更新九:Robust熱更新原理
Android熱更新十:自己寫一個Android熱修復(fù)


微信針對QQ空間超級補丁技術(shù)的不足提出了一個提供DEX差量包萌业,整體替換DEX的方案蔚袍。主要的原理是與QQ空間超級補丁技術(shù)基本相同乡范,區(qū)別在于不再將patch.dex增加到elements數(shù)組中,而是差量的方式給出patch.dex啤咽,然后將patch.dex與應(yīng)用的classes.dex合并晋辆,然后整體替換掉舊的DEX文件,以達到修復(fù)的目的宇整。


我們來逆向微信的APK看一下具體的實現(xiàn):

先找到應(yīng)用入口TinkerApplication瓶佳,在onBaseContextAttached()調(diào)用了loadTinker(),

進入TinkerLoader的tryLoad()方法中,


從方法名可以預(yù)見鳞青,在tryLoadPatchFilesInternal()中嘗試加載本地的補丁霸饲,再經(jīng)過跳轉(zhuǎn)進入核心修復(fù)功能類SystemClassLoaderAdder.class中。


代碼中可以看出臂拓,根據(jù)Android版本的不同贴彼,分別采取具體的修復(fù)操作,不過原理都是一樣的埃儿。我們以V19為例器仗,


從代碼中可以看到,通過反射操作得到PathClassLoader的DexPatchList,反射調(diào)用patchlist的makeDexElements()方法吧本地的dex文件直接替換到Element[]數(shù)組中去童番,達到修復(fù)的目的精钮。

對于如何進行patch.dex與classes.dex的合并操作,這里微信開啟了一個新的進程剃斧,開啟新進程的服務(wù)TinkerPatchService進行合并轨香。


整體的流程如下:


從流程圖來看,同樣可以很明顯的找到這種方式的特點:

優(yōu)勢:

合成整包幼东,不用在構(gòu)造函數(shù)插入代碼臂容,防止verify,verify和opt在編譯期間就已經(jīng)完成根蟹,不會在運行期間進行脓杉。
性能提高。兼容性和穩(wěn)定性比較高简逮。
開發(fā)者透明球散,不需要對包進行額外處理。
不足:

  1. 與超級補丁技術(shù)一樣散庶,不支持即時生效蕉堰,必須通過重啟應(yīng)用的方式才能生效凌净。

  2. 需要給應(yīng)用開啟新的進程才能進行合并,并且很容易因為內(nèi)存消耗等原因合并失敗屋讶。

  3. 合并時占用額外磁盤空間冰寻,對于多DEX的應(yīng)用來說,如果修改了多個DEX文件皿渗,就需要下發(fā)多個patch.dex與對應(yīng)的classes.dex進行合并操作時這種情況會更嚴(yán)重性雄,因此合并過程的失敗率也會更高。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羹奉,一起剝皮案震驚了整個濱河市秒旋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诀拭,老刑警劉巖迁筛,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耕挨,居然都是意外死亡细卧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門筒占,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贪庙,“玉大人,你說我怎么就攤上這事翰苫≈褂剩” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵奏窑,是天一觀的道長导披。 經(jīng)常有香客問我,道長埃唯,這世上最難降的妖魔是什么撩匕? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮墨叛,結(jié)果婚禮上止毕,老公的妹妹穿的比我還像新娘。我一直安慰自己漠趁,他們只是感情好扁凛,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棚潦,像睡著了一般令漂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丸边,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天叠必,我揣著相機與錄音,去河邊找鬼妹窖。 笑死纬朝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骄呼。 我是一名探鬼主播共苛,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜓萄!你這毒婦竟也來了隅茎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤嫉沽,失蹤者是張志新(化名)和其女友劉穎辟犀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绸硕,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡堂竟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了玻佩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片出嘹。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咬崔,靈堂內(nèi)的尸體忽然破棺而出税稼,到底是詐尸還是另有隱情,我是刑警寧澤垮斯,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布娶聘,位于F島的核電站,受9級特大地震影響甚脉,放射性物質(zhì)發(fā)生泄漏丸升。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一牺氨、第九天 我趴在偏房一處隱蔽的房頂上張望狡耻。 院中可真熱鬧,春花似錦猴凹、人聲如沸夷狰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沼头。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間进倍,已是汗流浹背土至。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猾昆,地道東北人陶因。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像垂蜗,于是被迫代替她去往敵國和親楷扬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361