Android热补丁之Robust原理解析(一)

2018-03-07  本文已影响0人  wayDevelop

整体来说Robust热更新系统分为了四个模块,如下图:


image.png

com.meituan.robust.patch.annotaion.Add 这是自动化补丁使用的注解,用来标记新增的类和方法,目前还不支持新增字段。
com.meituan.robust.patch.annotaion.Modify 这个注解用来标记被改动的方法或者类,如果这个注解是放在一个类A上面,自动化补丁会生成类APatch,APatch会被打入补丁,原始APK中的类A中每个方法都不会被执行,只会执行APatch中的方法,相当于把A类“替换为”APatch类(请注意这里只是和替换一个类有相同的效果,实际上A类依然在APK中,此时的A成为了一个傀儡,APatch才是幕后黑手);如果注解标记的是方法,则表明这个方法是需要被打入补丁中的,只有被标注的方法会打入补丁,打入补丁之后,就会执行补丁的方法,原始方法不会在执行。
com.meituan.robust.utils.EnhancedRobustUtils反射的工具类。
com.meituan.robust.utils.PatchTemplate 补丁的模板类,补丁中的类会填充这个模板生成补丁的转发类(这部分可以参看补丁的结构)com.meituan.robust.ChangeQuickRedirect 这个接口在上面的代码结构中出现的频率比较高,我们在代码中插入的字段就是这个接口,同时这个接口也是上述xxcontrol的实现接口,这个接口包含了两个方法:

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

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

方法isSupport是用来判断方法是否需要被替换,而accessDispatch在自动化补丁中这是对补丁方法的转发。

何时加载补丁

补丁的加载我们推荐越靠前越好,这样对bug的可修复范围就大大的增加,建议在Application onCreate方法或更早的时机加载补丁。
对于使用multidex的项目,需要确保所有的dex都已经加载,再加载补丁,避免被补丁的类由于没有加载而导致补丁应用失败,所以需要在补丁加载之前保证所有dex都已经加载。

上一篇下一篇

猜你喜欢

热点阅读