加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

腾讯正式开源面向 Unity 项目的 Bug 修复神器 InjectFix

发布时间:2019-09-12 14:38:31 所属栏目:建站 来源:局长
导读:InjectFix是腾讯最新对外开源的Unity代码逻辑热修复方案,可实此刻Unity线上客户端内,不消迭代新版本,就能快速修复游戏的线上bug。 先说几个亮点: 直接在Unity工程上修改C#即可更新;老项目无需修改原有代码即可行使; 更切合苹果热更新条款; 每个游戏

argumentBase指向的是求置魅栈该函数的栈帧,栈帧是这么布置的:

腾讯正式开源面向 Unity 项目标 Bug 修复神器 InjectFix

先放参数(假若有的话),再放当地变量(假若有的话),接着是姑且地区,当函数返回时弹掉全部对象,假若有返回值就放到栈顶(函数执行前参数0的位置)。

用如下一个静态要领来演示下假造机怎么运行:

  1. public static float Add(float a, float b) 
  2.     return a - b; 

这函数编译后是这四条指令

腾讯正式开源面向 Unity 项目标 Bug 修复神器 InjectFix

Add函数的执行进程

  1. 指令1把参数0 Push到栈顶;
  2. 指令2把参数1 Push到栈顶;
  3. 指令3把两个栈顶元素弹出(Pop)并相加,功效Push到栈顶;
  4. 指令4把栈顶拷贝到参数0的位置,整理栈,退出轮回,Execute函数执行竣事。

代码注入

上面的Add函数注入后是这样的

  1. public static float Add(float a, float b) 
  2.     if (WrappersManagerImpl.IsPatched(92)) 
  3.     { 
  4.         return WrappersManagerImpl.GetPatch(92).__Gen_Wrap_25(a, b); 
  5.     } 
  6.     return a - b; 

较量简朴,发明这函数有patch的话,就重定向到假造机。

而__Gen_Wrap_25是个适配器函数,赋值把参数压栈,挪用假造机的Execute函数,并把功效返回。__Gen_Wrap_25的实现如下:

  1. public float __Gen_Wrap_25(float P0, float P1) 
  2.     Call call = Call.Begin(); 
  3.     call.PushSingle(P0); 
  4.     call.PushSingle(P1); 
  5.     this.virtualMachine.Execute(this.methodId, ref call, 2, 0); 
  6.     return call.GetSingle(0); 

PS:我们的例子仅有三种指令,和这几条指令无关的代码所有简化了,真正伟大得多,有乐趣可以看源码相识。

总结

InjectFix行使简朴,小巧,合规且安详。纵然你不规划用它来更新线上版本,只要你措施有原生部门,接入也能必然水平上进步开拓服从,没什么拒绝它的来由,是吧?

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读