腾讯正式开源面向 Unity 项目的 Bug 修复神器 InjectFix
副标题[/!--empirenews.page--]
InjectFix是腾讯最新对外开源的Unity代码逻辑热修复方案,可实现在Unity线上客户端内,不用迭代新版本,就能快速修复游戏的线上bug。 先说几个亮点:
InjectFix经腾讯内部多个项目应用反馈十分良好,不仅能解决线上bug,还可以有效的提高日常开发效率,下面我们聊下这项目的前世今生。 热更方案大乱斗所有支持iOS的热更方案都有个共同点:更新后代码都是解析执行。如果按其更新前是否解析执行,可以分为两大类: 一类是某些模块甚至整个游戏,都一直解析执行。这是最传统的方式,目前市面上所有主流方案(xLua,slua,tolua,ILRuntime,jsb等等)都支持这种方式。这种方式的特点:
ps:也有一种思路是通过一个C#转XX脚本工具来实现C#编码,解析执行,但如果你是一个已有项目想这么转一下,大概率是失败的,除非你一开始就在用这方式在开发,碰到坑就避开,因为这类方案往往不是完整支持全部语法,支持的语法也不一定能完全一致。
另外一类是以原生方式跑,如果有bug,把逻辑重定向到新的,解析执行的逻辑。这种方式的特点:
第二种方式是接下来讨论的重点,方便起见,我们称之为“热修复”,热修复最早的成熟方案是xLua提供,经过两年来的使用已经逐渐被接受,tolua#后来也加入了这功能,也有一些网友基于ILRuntime做了热修复功能。 InjectFix是什么?InjectFix就是一个热修复的实现。那它和其它热修复方案又有什么不同呢? 设想这么个场景,我们有一个一千行代码的函数,其中有一行有问题,我们需要修复它。 如果用xLua,需要用lua去重新实现一遍这个函数,工作量大。而基于ILRuntime的热修复,由于其补丁是另一个程序集,它无法直接访问原类的私有成员,所以那999行正常代码一般也不能直接使用,需要做较多修改。 而InjectFix不需要用lua,也不需要像ILRuntime热修复那样另外建一个工程把那一千行逻辑重实现。只需要在Unity原工程直接改掉这行代码,然后标注这函数要更新即可。 不仅如此,InjectFix还有其它优势:
它也有缺点,不支持新增类,也不支持在已有类新增字段,修bug还是够用的,但难以通过热更为游戏增加新功能。InjectFix就一个纯粹的修bug工具而已。 黑科技由于InjectFix支持重复加载补丁,新加载补丁会自动覆盖上一个,这特性可以用来实现真机代码逻辑实时修改。 (视频地址:https://v.qq.com/x/page/v09240mo6ai.html?&ptag=4_7.2.5.22206_copy) 苹果政策合规性各热更方案群的问的频率最高的问题之一:这方案会不会导致我游戏苹果审核不通过。 让我们看看苹果的热更新条款: 可以看到最新条款允许下载代码解析执行,但前提是不能通过新增特性和功能来把程序改得(和审核时相比)面目全非。再看看通常被拒时的理由中的Guideline 2.5.2里的一句:
有“新增特性和功能”能力的热更新方案的尴尬之处在于有“改得面目全非”的能力。而InjectFix从它提供的能力(只能修改已有函数)来看,并不具备“新增特性和功能”的能力,这本来是弱点,放在这里却成为合规性的保证了。 基本原理InjectFix项目的研发挺曲折的。InjectFix和xLua是同一个作者,也是本文笔者,当时xLua开源后,不断有人提希望提供个C#转lua的工具,而深入研究觉得实现个il虚拟机工作量还更小,这样还能避免lua的一些gc问题。 (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |