nuwa是什么?
nuwa是一个开源的android应用热修复方案,通过替换存在bug的类,能够在不重新安装app的情况下,修复app存在的问题.
nuwa的基本原理
唯一的一个Application对象必然是由一个ClassLoader对象加载进来的(实际是一个PathClassLoader对象),在此Application对象初始化时(此时绝大部分class还没有加载进来),寻找到该PathClassLoader对象,通过反射方式找到PathClassLoader对象的dexElements数组(里面元素的顺序决定着加载类时dex的顺序),将patch dex文件插入到数组最前面.
nuwa的执行流程
- 将修复了bug的若干类的class文件打包成patch dex文件(gradle实现).
- 为了防止此方案造成的崩溃问题,需要通过ASM使得每个dex文件都引用一个占位类(此机制在apk打包时采用gradle插件实现)
一些验证
- 如果先调用一次需要修复的类,再使用nuwa进行修复(如下代码所示),结果:修复失败.原因:原始类已经加载进来了
Class c=Hello.class;
Nuwa.loadPatch(this, Environment.getExternalStorageDirectory().getAbsolutePath().concat(“/patch.jar”));
- 如果将dexElements内容置为空呢?结果:直接崩溃.原因:加载类失败
- 如果在所有类都加载进来之后将dexElements内容置为空呢?结果:能够正常运行.
nuwa的特点
- 需要应用重启修复才能生效.
- 无法调用原始方法(热修复一般不需要调用原始方法).
参考资料