这里阅览了很多网上关于修复的资料,一一贴在这里便于查看:
https://github.com/alibaba/AndFix 这是官方处 要了解使用,一定得看看这里。
http://www.jianshu.com/p/479b8c7ec3e3 如果你看不懂官方的,就看看这里。
http://blog.csdn.net/lpftobetheone/article/details/50435371 适合初步了解使用,一个简单的Demo(这篇文章里面有对补丁只能加载一次问题的解决)
http://www.cnblogs.com/common1140/p/5287040.html 这一篇更贴近于我们的实际开发,如何使用修复- 产生 - 上传补丁 -下载补丁
https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a&scene=1&srcid=1106Imu9ZgwybID13e7y2nEi#wechat_redirect 这里是寻找原理的地方
下面说一下修复的几种方式:
AndFix修复:
① 不支持YunOS
② 无法添加新类和新的字段
③ 需要使用加固前的apk制作补丁,但是补丁文件很容易被反编译,也就是修改过的类源码容易泄露。
④ 使用加固平台可能会使热补丁功能失效(看到有人在360加固提了这个问题,自己还未验证)。
⑤ andfix不支持布局资源等的修改
⑥ 官网:AndFix supports Android version from 2.3 to 7.0, both ARM and X86 architecture, both Dalvik and ART runtime, both 32bit and 64bit.
⑦ 应用patch不需要重启。但由于从实现上直接跳过了类初始化,设置为初始化完毕,所以像是静态函数、静态成员、构造函数都会出现问题,复杂点的类Class.forname很可能直接就会挂掉。
⑧ AndFix的一个潜在问题:
加载一次补丁后,out.apatch文件会copy到getFilesDir目录下的/apatch文件夹中,在下次补丁更新时,会检测补丁是否已经添加在apatch文件夹下,已存在就不会复制加载sdcard的out.apatch。
源码:
public void addPatch(String path) throws IOException { File src = new File(path); File dest = new File(mPatchDir, src.getName()); if(!src.exists()){ throw new FileNotFoundException(path); } if (dest.exists()) { Log.d(TAG, "patch [" + path + "] has be loaded."); return; } FileUtil.copyFile(src, dest);// copy to patch‘s directory Patch patch = addPatch(dest); if (patch != null) { loadPatch(patch); } }