-
Notifications
You must be signed in to change notification settings - Fork 808
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,但是事件只会被消费一次