Android熱補丁之Robust原理解析(一)

整體來說Robust熱更新系統(tǒng)分為了四個模塊,如下圖:


image.png
  • autopatchbase是整個項目的一個基礎(chǔ)庫,用于存放公共的代碼
  • gradle-plugin是Robust的插樁插件嫉晶,會對指定的類插入靜態(tài)字段ChangeQuickRedirect盯另,對類的方法插入樁判定代碼桨菜,是Robust的核心思想庫
  • auto-patch-plugin這個庫是整個項目最復(fù)雜的一塊涉瘾,需要針對不同的代碼風格、ReProguard補丁代碼巢价,生成一個可用的補丁牲阁。這部分的難點重點體現(xiàn)在Proguard對代碼進行混淆之后,補丁中的代碼也需要按照之前的Proguard規(guī)則來進行重新一次Proguard壤躲,我把這個過程稱為ReProguard城菊。這部分可以參考一下之前的博客:Android熱更新方案Robust開源
  • patch是補丁加載的核心,這部分控制了如何加載補丁碉克,可以根據(jù)自己的需求定制化自己的補丁加載凌唬、校驗等策略。

com.meituan.robust.patch.annotaion.Add 這是自動化補丁使用的注解漏麦,用來標記新增的類和方法法瑟,目前還不支持新增字段。
com.meituan.robust.patch.annotaion.Modify 這個注解用來標記被改動的方法或者類唁奢,如果這個注解是放在一個類A上面,自動化補丁會生成類APatch窝剖,APatch會被打入補丁麻掸,原始APK中的類A中每個方法都不會被執(zhí)行,只會執(zhí)行APatch中的方法赐纱,相當于把A類“替換為”APatch類(請注意這里只是和替換一個類有相同的效果脊奋,實際上A類依然在APK中熬北,此時的A成為了一個傀儡,APatch才是幕后黑手)诚隙;如果注解標記的是方法讶隐,則表明這個方法是需要被打入補丁中的,只有被標注的方法會打入補丁久又,打入補丁之后巫延,就會執(zhí)行補丁的方法,原始方法不會在執(zhí)行地消。
com.meituan.robust.utils.EnhancedRobustUtils反射的工具類炉峰。
com.meituan.robust.utils.PatchTemplate 補丁的模板類,補丁中的類會填充這個模板生成補丁的轉(zhuǎn)發(fā)類(這部分可以參看補丁的結(jié)構(gòu))com.meituan.robust.ChangeQuickRedirect 這個接口在上面的代碼結(jié)構(gòu)中出現(xiàn)的頻率比較高脉执,我們在代碼中插入的字段就是這個接口疼阔,同時這個接口也是上述xxcontrol的實現(xiàn)接口,這個接口包含了兩個方法:

   public interface ChangeQuickRedirect {
    Object accessDispatch(String methodName, Object[] paramArrayOfObject);

    boolean isSupport(String methodName, Object[] paramArrayOfObject);
}

方法isSupport是用來判斷方法是否需要被替換半夷,而accessDispatch在自動化補丁中這是對補丁方法的轉(zhuǎn)發(fā)婆廊。

何時加載補丁

補丁的加載我們推薦越靠前越好,這樣對bug的可修復(fù)范圍就大大的增加巫橄,建議在Application onCreate方法或更早的時機加載補丁淘邻。
對于使用multidex的項目,需要確保所有的dex都已經(jīng)加載嗦随,再加載補丁列荔,避免被補丁的類由于沒有加載而導(dǎo)致補丁應(yīng)用失敗,所以需要在補丁加載之前保證所有dex都已經(jīng)加載枚尼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贴浙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子署恍,更是在濱河造成了極大的恐慌崎溃,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盯质,死亡現(xiàn)場離奇詭異袁串,居然都是意外死亡,警方通過查閱死者的電腦和手機呼巷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門囱修,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人王悍,你說我怎么就攤上這事破镰。” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵鲜漩,是天一觀的道長源譬。 經(jīng)常有香客問我,道長孕似,這世上最難降的妖魔是什么踩娘? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮喉祭,結(jié)果婚禮上养渴,老公的妹妹穿的比我還像新娘。我一直安慰自己臂拓,他們只是感情好厚脉,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胶惰,像睡著了一般傻工。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孵滞,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天中捆,我揣著相機與錄音,去河邊找鬼泄伪。 笑死,一個胖子當著我的面吹牛匿级,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痘绎,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼孤页!你這毒婦竟也來了尔苦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤行施,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛾号,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鲜结,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年展运,在試婚紗的時候發(fā)現(xiàn)自己被綠了斩芭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡乐疆,死狀恐怖贬养,靈堂內(nèi)的尸體忽然破棺而出挤土,到底是詐尸還是另有隱情误算,我是刑警寧澤仰美,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布儿礼,位于F島的核電站,受9級特大地震影響蚊夫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜知纷,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琅轧。 院中可真熱鬧,春花似錦乍桂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忍疾。三九已至,卻和暖如春卤妒,著一層夾襖步出監(jiān)牢的瞬間甥绿,已是汗流浹背则披。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留士复,地道東北人翩活。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓便贵,卻偏偏與公主長得像菠镇,于是被迫代替她去往敵國和親承璃。 傳聞我的和親對象是個殘疾皇子利耍,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

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