android 美团 robust,美团Robust原理解析

private CtClass createPatchClass(CtClass modifiedClass, boolean isInline, String patchName, Set patchMethodSignureSet, String patchPath) throws CannotCompileException, IOException, NotFoundException {

...

//1.将包含修复后逻辑的类clone一份

CtClass temPatchClass = cloneClass(modifiedClass, patchName, methodNoNeedPatchList);

...

for (CtMethod method : temPatchClass.getDeclaredMethods()) {

if (!Config.addedSuperMethodList.contains(method) && reaLParameterMethod != method && !method.getName().startsWith(Constants.ROBUST_PUBLIC_SUFFIX)) {

//2.将字段、方法调用通过反射实现

method.instrument(

new ExprEditor() {

public void edit(FieldAccess f) throws CannotCompileException {

if (Config.newlyAddedClassNameList.contains(f.getClassName())) {

return;

}

Map memberMappingInfo = getClassMappingInfo(f.getField().declaringClass.name);

try {

if (f.isReader()) {

f.replace(ReflectUtils.getFieldString(f.getField(), memberMappingInfo, temPatchClass.getName(), modifiedClass.getName()));

} else if (f.isWriter()) {

f.replace(ReflectUtils.setFieldString(f.getField(), memberMappingInfo, temPatchClass.getName(), modifiedClass.getName()));

}

} catch (NotFoundException e) {

e.printStackTrace();

throw new RuntimeException(e.getMessage());

}

}

@Override

void edit(NewExpr e) throws CannotCompileException {

//inner class in the patched class ,not all inner class

if (Config.newlyAddedClassNameList.contains(e.getClassName()) || Config.noNeedReflectClassSet.contains(e.getClassName())) {

return;

}

try {

if (!ReflectUtils.isStatic(Config.classPool.get(e.getClassName()).getModifiers()) && JavaUtils.isInnerClassInModifiedClass(e.getClassName(), modifiedClass)) {

e.replace(ReflectUtils.getNewInnerClassString(e.getSignature(), temPatchClass.getName(), ReflectUtils.isStatic(Config.classPool.get(e.getClassName()).getModifiers()), getClassValue(e.getClassName())));

return;

}

} catch (NotFoundException e1) {

e1.printStackTrace();

}

e.replace(ReflectUtils.getCreateClassString(e, getClassValue(e.getClassName()), temPatchClass.getName(), ReflectUtils.isStatic(method.getModifiers())));

}

@Override

void edit(Cast c) throws CannotCompileException {

MethodInfo thisMethod = ReflectUtils.readField(c, "thisMethod");

CtClass thisClass = ReflectUtils.readField(c, "thisClass");

def isStatic = ReflectUtils.isStatic(thisMethod.getAccessFlags());

if (!isStatic) {

//inner class in the patched class ,not all inner class

if (Config.newlyAddedClassNameList.contains(thisClass.getName()) || Config.noNeedReflectClassSet.contains(thisClass.getName())) {

return;

}

// static函数是没有this指令的,直接会报错。

c.replace(ReflectUtils.getCastString(c, temPatchClass))

}

}

@Override

void edit(MethodCall m) throws CannotCompileException {

//methods no need reflect

if (Config.noNeedReflectClassSet.contains(m.method.declaringClass.name)) {

return;

}

if (m.getMethodName().contains("lambdaFactory")) {

//method contain modifeid class

m.replace(ReflectUtils.getNewInnerClassString(m.getSignature(), temPatchClass.getName(), ReflectUtils.isStatic(method.getModifiers()), getClassValue(m.getClassName())));

return;

}

try {

if (!repalceInlineMethod(m, method, false)) {

Map memberMappingInfo = getClassMappingInfo(m.getMethod().getDeclaringClass().getName());

if (invokeSuperMethodList.contains(m.getMethod())) {

int index = invokeSuperMethodList.indexOf(m.getMethod());

CtMethod superMethod = invokeSuperMethodList.get(index);

if (superMethod.getLongName() != null && superMethod.getLongName() == m.getMethod().getLongName()) {

String firstVariable = "";

if (ReflectUtils.isStatic(method.getModifiers())) {

//修复static 方法中含有super的问题,比如Aspectj处理后的方法

MethodInfo methodInfo = method.getMethodInfo();

LocalVariableAttribute table = methodInfo.getCodeAttribute().getAttribute(LocalVariableAttribute.tag);

int numberOfLocalVariables = table.tableLength();

if (numberOfLocalVariables > 0) {

int frameWithNameAtConstantPool = table.nameIndex(0);

firstVariable = methodInfo.getConstPool().getUtf8Info(frameWithNameAtConstantPool)

}

}

m.replace(ReflectUtils.invokeSuperString(m, firstVariable));

return;

}

}

m.replace(ReflectUtils.getMethodCallString(m, memberMappingInfo, temPatchClass, ReflectUtils.isStatic(method.getModifiers()), isInline));

}

} catch (NotFoundException e) {

e.printStackTrace();

}

}

});

}

}

...

return patchClass;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值