腾讯Unity热补丁InjectFix底层原理

腾讯Unity热补丁InjectFix底层原理首先 Calculator 使用乘法来实现错误的 Add 方法 现在我们先改成正确的为 return a b 然后打一个补丁

欢迎大家来到IT世界,在知识的湖畔探索吧!

InjectFix项目是腾讯研发团队用于给Unity项目代码逻辑热修复实现的的解决方案,可用于Unity业务的bug修复,支持Unity全系列,全平台。

项目本身提供了HelloWorld的Demo案例,按照案例操作即可。

public class Calculator { public int Add(int a, int b) { return a * b; } } 

欢迎大家来到IT世界,在知识的湖畔探索吧!

首先,Calculator使用乘法来实现错误的Add方法,现在我们先改成正确的为return a * b,然后打一个补丁。然后再把代码还原为错误乘法return a * b,对项目进行注入操作。将打的补丁
Assembly-CSharp.patch.bytes拷贝到\Assets\IFix\Resources下,重新执行,可以看到已经修复到新逻辑,说明补丁产生了效果。

补丁分析

在进行打补丁调用CodeTranslator.Process()方法处理时,会调用getMethodId()方法,执行allocMethodId()为每个方法分配一个自增的ID,然后通过变量Dictionary<int, List<Core.Instruction>> codes映射存储该方法的所有指令。

腾讯Unity热补丁InjectFix底层原理

欢迎大家来到IT世界,在知识的湖畔探索吧!

然后调用CodeTranslatorSerialize()序列化成补丁,把方法的指令列表,挨个写入到补丁文件中。

腾讯Unity热补丁InjectFix底层原理

除了方法的指令,还要把方法和方法的ID写入补丁文件。

腾讯Unity热补丁InjectFix底层原理

注入分析

这里我们通过ILSpy工具,反编译注入后的DLL代码:

腾讯Unity热补丁InjectFix底层原理

执行注入操作会对我们原来的代码进行打桩,根据
WrappersManagerImpl.IsPatched查看是否有补丁,有补丁的话就跳转运行虚拟机指令。

这里的注入逻辑可以查看
CodeTranslator.idAccessInject按照ID的方式注入逻辑:

腾讯Unity热补丁InjectFix底层原理

腾讯Unity热补丁InjectFix底层原理

调用IL处理器ILProcessor的插入方法,来实现打桩的逻辑。通过对比发现,IL的插入代码逻辑和生成的IL指令分别对应。

运行分析

游戏运行启动时,会调用PatchManager.Load()加载补丁文件,解析所有方法的指令列表,针对每个补丁文件会生成一个虚拟机VirtualMachine,维护所有指令。

腾讯Unity热补丁InjectFix底层原理

实例化补丁方法的管理器WrappersManagerImpl,通过读取补丁文件获取所有方法ID,调用CreateWrapper生成补丁方法,根据方法的索引进行赋值

腾讯Unity热补丁InjectFix底层原理

方法被注入之后,会先判断是否有补丁,决定是否执行补丁逻辑。补丁逻辑,例如这里的
WrappersManagerImpl.GetPatch(4).__Gen_Wrap_1(this, a, b) 逻辑,最终会执行虚拟机VirtualMachine.Execute()方法,其内部就是遍历方法的所有指令,然后按照操作码和数据进行执行

腾讯Unity热补丁InjectFix底层原理

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/121556.html

(0)
上一篇 9小时前
下一篇 9小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信