bat比较有意思的代码_腾讯开源的 Unity全系列 代码逻辑热修复方案--InjectFix

14f90b189a0603d6717ef13c5afb0ba5.png

InjectFix

腾讯开源的 Unity 代码逻辑热修复方案

Unity代码逻辑热修复

可用于Unity业务的bug修复,支持Unity全系列,全平台。

几个亮点

  • 直接在Unity工程上修改C#即可更新
  • 老项目无需修改原有代码即可使用
  • 每个游戏一份私有补丁格式,安全更有保障

编译安装

  • Window下打开源码包的SourceVSProjbuild_for_unity.bat,UNITY_HOME变量的值修改为指向本机unity安装目录
  • 运行build_for_unity.bat

复制

这里对应的是一个Unity工程目录

  • IFixToolKit拷贝到Unity项目的Assets同级目录
  • Assets/IFix,Assets/Plugins拷贝到Unity项目的Assets下

接入示例

判断有补丁就加载补丁

var patchPath = "./Assets/IFix/Resources/Assembly-CSharp.ill.bytes";if (File.Exists(patchPath)){ PatchManager.Load(new FileStream(patchPath, FileMode.Open));}

配置

热补丁的实现依赖于提前做些静态代码插入,所以需要配置对哪些类预处理,配置了才能被修复。一般而言,只要不是性能要求很苛刻的类都可以加入。

iFix支持动态和静态列表方式,由于类型往往比较多,动态列表会方便些。下面是一个实例,配置XLua名字空间下除匿名类之外的所有类型。

[Configure]public class InterpertConfig { [IFix] static IEnumerable ToProcess { get { return (from type in Assembly.Load("Assembly-CSharp").GetTypes() where type.Namespace == "XLua" && !type.Name.Contains("

划下重点:

配置类打上Configure标签配置的属性打上IFix标签,而且必须是 static 类型

动态配置除了不用一个个配,还可能有其它额外好处,比如上述配置,后续该名字空间下增删类,都不需要更改配置。

配置好后,打包手机版本会自动预处理,如果希望自动化打包,也可以手动调用IFix.Editor.IFixEditor.InjectAllAssemblys函数。

补丁制作

对需要打补丁的函数打上Patch标签

[Patch]public int Add(int a, int b){ return a + b;}

执行"InjectFix/Fix"菜单。

补丁制作成功后会放到工程目录下,文件名为“{Dll Name}.patch.bytes”(比如:“Assembly-CSharp.patch.bytes”),上传补丁到手机,加载就能看到效果。

注意事项:如果要Patch的函数存在条件编译宏,比如这样的代码:

[Patch]public void Job(int a){#if UNITY_EDITOR Foo();#endif#if !UNITY_EDITOR Bar();#endif}

如果还是直接在编辑器下直接生成补丁,将会比手机上运行多调用了个Foo,少调用了个Bar,这可能会导致各种问题:逻辑不对,调用了编辑器专用函数而导致找不到要调用的函数等等。

这时可以按对应平台的编译参数把Assembly-CSharp.dll编译出来,然后调用IFix.Editor.IFixEditor.GenPatch去生成补丁。

Unity编译是在工程的Temp目录新建一个文件,把命令行参数放到那个文件,然后执行类似(目录根据自己的unity安装情况而定)如下命令进行编译:

"D:Program Files甥楮祴201702EditorDataMonoBleedingEdgebinmono.exe" "D:Program Files甥楮祴201702EditorDataMonoBleedingEdgelibmono4.5mcs.exe" @Temp/UnityTempFile-55a959adddae39f4aaa18507dd165989

你可以尝试一次编辑器下的手机版本打包,然后到工程目录下的Temp目录把那个临时文件拷贝出来(编译完会自动删掉,所以要手快)。

这个文件大多数地方都不会变的,变的主要是C#文件列表,可以改为动态生成这个文件:C#文件列表根据当前项目生成,其它保持不变。然后用这个文件作为输入来编译。

github地址:

https://github.com/tencent/injectfix

更多更优质的资讯,请关注我,你的支持会鼓励我不断分享更多更好的优质文章。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值