zoukankan      html  css  js  c++  java
  • 热修复技术沉思:jspatch

    硬修复:

    直接修改工程源码,重新发版;

    冷修复:

    打补丁包,使用动态库和hook技术,在程序启动时完成问题代码修复;案例:iOS逆向工程;

    特征:不修改原始代码、补丁发布、目前不支持动态发布;

    热修复:

    可执行文件内直接继承热修复启动机制;

    程序启动后热修复引擎动态检查家在补丁包,完成动态hook;

    原理:

    1、修复引擎包含更新检查;

    2、消息重定向;将需要修改的功能和新添加的功能重定向到JPForwardInvocation;

    在JPForwardInvocation中区别对待无修改和修改过的函数;

    修改过的函数最终会调用js进行解释执行;

    3、js包含的修改过的功能最终会解释为oc执行;

    这个方法成功调用会经历哪些流程呢?

    基本上这就是一个Patch方法调用的流程。
    首先点击按钮调用handlebtn方法,其IMP未找到跑到消息转发流程,经过resolveInstanceMethod->forwardingTargetForSelector->forwardInvocation等方法,因为最后的forwardInvocation方法被用method swizzling 转换成了JPForwardInvocation,所以JPForwardInvocation被调用。
    首先查找方法对应的JPSelector是否存在,如果不存在调用原forward方法,如果存在调用JPSelector对应的IMP。
    记得上一篇我们在patch(即demo.js)加载时说过,会将Patch方法以JSValue的形式存储在OC的列表__JSOverrideMethods里面。
    这个JPSelector的IMP的功能就是找到以JSValue形式存储的Patch方法,然后调用它。

    https://www.mobilezhao.com/?tag=jspatch

  • 相关阅读:
    /tmp/orbit-oracle/目录inode耗尽
    sp_change_users_login 'Update_One', '用户名', '登录名';
    自动载入Python虚拟环境
    Windows下安装MySQL详细教程
    python版本下载时时,官方目录web-based与executable和embeddable 的区别
    print,printf,println
    大文件文本数据处理
    通过文件指针插入文件内容
    sizeof和strlen的使用
    java八大基本数据类型
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10945381.html
Copyright © 2011-2022 走看看