这两天花了点时间,了解和使用了下阿里的热修复框架Sophix。
使用起来是简单,高效的,没有什么侵入性代码,完全是傻瓜模式。
缺点就是要收费。
好消息是,你的app只赚了点微不足道的小钱,那么不收你费。如果要收你费了,你应该感到高兴!
热修复在原理上,有两种:一种是native层修改ArtMethod, 还有就是类加载模式。
修复的内容包括,java代码,so, 资源。
Sophix不支持新增四大组件。
- 修改ArtMethod
这种模式市面上只有阿里使用。是热部署!
当dex文件加载进内存后, 每一个方法的信息都会在虚拟机内存上有一个对应的ArtMethod对象。只要替换掉这个ArtMethod,就能实现热修复。
下面的代码是Sophix热修复的核心原理。
JNIEXPORT jstring JNICALL
Java_com_study_MainActivity_replaceMethod(JNIEnv *env, jobject thiz, jobject src,
jobject des) {
smeth = (art:mirror:ArtMethod*)env->FromReflectedMethod(src);//核心
dmeth = (art:mirror:ArtMethod*)env->FromReflectedMethod(des);//核心
memcpy(smeth, dmeth, sizeof(ArtMethod))
}
sizeof(ArtMethod), 不同手机品牌或者型号,有的会魔改ArtMethod内容。导致size不统一。
他们想到了,在手机上动态测定size的方法,因为ArtMethod是以链式的方式存放的,所以相邻两个ArtMethod的地址差值,那就是size。
是不是很简单? 不简单的,还需要解决Java编译特性导致的各种问题。比如方法数增加。
下面这本书是他们团队出的,有详细的介绍: