Skip to content

Robust插桩平台的使用说明

何定旭 edited this page Nov 24, 2017 · 4 revisions

Robust提供了一个基础的插桩平台,任何业务方如果想借助Robust的埋点(在基本所有的方法体体插入静态代理的代码),均可以通过实现Robust提供的相关接口,来完成自己独特的功能,比如在每个方法的方法体前打印log等操作,具体使用如下:

实现的接口:

public interface RobustExtension  {
    /**
     *
     * @return 关于接入方信息的描述,请保证各个业务方独立不同,且唯一不变。
     * 建议使用各个业务方包名+一些功能性描述,比如:com.meituan.robust android热更新系统
     */
    String describeSelfFunction();
 
    /**
     * 通知监听者信息,通知哪个监听者被执行了
     * @param msg,msg是describeSelfFunction中的返回内容
     */
    void notifyListner(String msg);
    /**
     * @param paramsArray 原方法的参数列表
     * @param current 当前对象的引用,即this对象,如果是static方法,值为null
     * @param methodNumber 方法的唯一编号
     * @param paramsTypeArray 方法参数类型列表
     * @param returnType 方法的返回值类型
     * 在方法的方法体最先执行的代码逻辑,请注意这个方法执行之后,原方法体中的其他逻辑不在执行
     * @return
     *
     */
    Object accessDispatch(RobustArguments robustArguments);
 
    /**
     *@param paramsArray 原方法的参数列表
     * @param current 当前对象的引用,即this对象,如果是static方法,值为null
     * @param methodNumber 方法的唯一编号
     * @param paramsTypeArray 方法参数类型列表
     * @param returnType 方法的返回值类型
     *
     * @return return true 代表不继续执行原有方法体,只执行accessDispatch方法的逻辑,并把accessDispatch的方法返回值作为原函数的返回值
     *          return false 代表执行其他的RobustExtension的实现或者原有方法体,但是可以在isSupport方法里面添加额外的逻辑,比如说记录当前的方法调用栈或者日志等
     */
    boolean isSupport(RobustArguments robustArguments);
 
}

例如我们实现一个在每个方法前打印log的功能:

public class LogExtension implements RobustExtension {
    @Override
    public String describeSelfFunction() {
        return "LogExtension Example";
    }
 
    @Override
    public void notifyListner(String msg) {
        //you can know here which RobustExtension execute by msg
    }
 
    @Override
    public Object accessDispatch(RobustArguments robustArguments) {
        return null;
    }
 
    @Override
    public boolean isSupport(RobustArguments robustArguments) {
        Log.d("LogExtension","arrived here class name is ");
        return false;
    }
}

我们只是在方法体前面打印了Log,当然你还可以做很多事情,Robust热更新提供了一个窗口,可以在每个方法体内部逻辑执行前,执行一段其他的代码。

接口的注册

//在合适的位置注册到robust平台 PatchProxy.register(new LogExtension());

到此为止,你已经完成了对Robust平台插桩代码的接入,其中的重点在于LogExtension的实现。有问题欢迎反馈hedingxu#meituan.com

关于注册多个接口执行先后顺序的问题: 1、Robust热更新系统优先执行,也就是说只要打了补丁,优先保证补丁最先执行,其余注册的Extension将被忽略 2、如果没有补丁,那就按照注册的先后顺序,FIFO来执行Extension,但是事件只会被消费一次