整體來說Robust熱更新系統(tǒng)分為了四個模塊,如下圖:
-
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)加載枚尼。