Android 热修复
本文链接:https://blog.youkuaiyun.com/feather_wch/article/details/132052856
方案对比
AndFix@Deprecate
1、AndFix为什么可以实时生效?
在native层动态替换掉Java层的方法,通过native层hook java层代码。
2、如何拿到补丁包的有注解Method?
- 补丁包包含Test.class
- 类加载Test.class
- 反射Method
- 拿到注解(标记了要替换谁),找到目标类
3、如何完成两个对象的替换?bug method => fix method
Java层伪代码:
BugMethod.clazz = FixMethod.clazz
Native层代码:
replace(env, jobject bug, jobject fix)
{
// 把bug method的所有属性,都替换为,补丁method的所有属性
}
4、后续拿到的都是修复后的Method.class类对象
Robust-即时生效
美团方案:抖音还在用,纯Java实现
- 对每个函数插入一段代码,字节码插桩技术。
- 编译阶段,在class字节码写代码
- 插入开关: 如果没有补丁包,就返回原先逻辑。有补丁包,交给补丁。
class State{
public static ChangeQuickRedirect changeQuickRedirect;
public long getIndex{
if(changeQuickRedirect != null){
return PatchProxy.accessDispatch(xxxx);
}
return 100;
}
}
- 拿到补丁包内的类对State.changeQuickRedirect进行赋值
Class<StatePatch> clz = StatePatch.class; // 拿到补丁包的类
State.changeQuickRedirect = clz.newInstance();