一、前言
Android中热修复框架比较多,每家公司都有对应的方案和框架,比如阿里的AndFix框架,关于这个框架在之前的文章已经详细讲解了,不了解的同学可以点击这里:AndFix热修复框架原理分析 。本文继续来看另外一个热修复框架,也就是美团团队开发的Robust框架。关于这个框架网上已经有详细解释了,具体用法也有。不过他没有开源,所以本文就先简单介绍他的原理,用一个案例来演示这个框架的作用,但是重点是咋们自己编码将其框架机制实现,让其"闭源"变成"开源"。
二、原理解析
关于热修复技术点,其实虽然每家都有对应的框架,但是核心点都离不开动态加载机制。有了动态加载机制,然后就是具体修复方案问题了,对于Robust修复方案也是比较简单的。下面来简单看一下他的大致原理:
Robust插件对每个产品代码的每个函数都在编译打包阶段自动的插入了一段代码,插入过程对业务开发是完全透明。如State.java的getIndex函数:
public long getIndex() { return 100;}
被处理成如下的实现:
public static ChangeQuickRedirect changeQuickRedirect; public long getIndex() { if(changeQuickRedirect != null) { //PatchProxy中封装了获取当前className和methodName的逻辑,并在其内部最终调用了changeQuickRedirect的对应函数 if(PatchProxy.isSupport(new Object[0], this, changeQuickRedirect, false)) { return ((Long)PatchProxy.accessDispatch(new Object[0], this, changeQuickRedirect, false)).longValue(); } } return 100L;}
可以看到Robust为每个class增加了个类型为ChangeQuickRedirect的静态成员,而在每个方法前都插入了使用changeQuickRedirect相关的逻辑,当changeQuickRedirect不为null时,可能会执行到accessDispatch从而替换掉之前老的逻辑,达到fix的目的。如果需将getIndex函数的返回值改为return 106,那么对应生成的patch,主要包含两个class:PatchesInfoImpl.java和StatePatch.java。
PatchesInfoImpl.java:
public class PatchesInfoImpl implements PatchesInfo { public List<PatchedClassInfo> getPatchedClassesInfo