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

  • 相关阅读:
    小白成长建议(7)-蛛丝马迹-云层
    小白成长建议(5) 缺陷与管理-云层
    小白成长建议(6)-测试的灵魂-云层
    小白成长建议(4) -从头开始-云层
    小白成长建议 (3)-看书和选书-云层
    小白成长建议(2)-扎实基础-云层
    创业神人&当时钢铁侠:Elon Musk
    Oracle数据库学习笔记5
    Oracle数据库学习笔记4
    Oracle数据库学习笔记3
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10945381.html
Copyright © 2011-2022 走看看