基于Unity的手游热更新方案

 

现状

Unity目前在手游平台的更新方式主要为脚本更新和C#更新,脚本更新使用比较广泛和稳定的为Tolua和xLua,C#主要为ILRuntime,而且都支持Android和iOS平台。

 

Tolua

Tolua是jarjin写的开源热更新框架,到目前为止有许多成功的项目案例,是一款不错的框架。

tolua:https://github.com/topameng/tolua

框架底层库:https://github.com/jarjin/tolua_rumtime

UGUI版框架:https://github.com/jarjin/LuaFramework_UGUI

NGUI版框架:https://github.com/jarjin/LuaFramework_NGUI

主要原理:游戏启动前将C#要使用到的类函数和类变量通过反射生成对应的wrap文件,游戏启动时将wrap的内容绑定注册到Lua的状态机中供Lua调用。

参考链接:

ToLua原理和使用教程:https://blog.csdn.net/wlk1229/article/details/78776551

tolua之wrap文件的原理和使用教程:https://www.cnblogs.com/blueberryzzz/p/9672342.html

 

xLua

xlua是由腾讯维护的一个开源项目。

官网:https://github.com/Tencent/xLua

配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md

官方FAQ:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md

xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。

xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是:

  1. 可以运行时把C#实现(方法,操作符,属性,事件等等)替换成lua实现;
  2. 出色的GC优化,自定义struct,枚举在Lua和C#间传递无C# gc alloc;
  3. 编辑器下无需生成代码,开发更轻量;

参考链接:

https://blog.csdn.net/VRunSoftYanlz/article/details/81041359

https://gitee.com/U3DDevelopment/xlua-framework

 

ILRuntime

ILRuntime项目为基于C#的平台(例如Unity)提供了一个纯C#实现,快速,方便且可靠的IL运行时,使得能够在不支持JIT的硬件环境(如iOS)能够实现代码的热更新。

主要原理是将需要更新的C#代码编译成dll文件然后通过反射进行调用。

参考链接:

http://ourpalm.github.io/ILRuntime/public/v1/guide/index.html

https://www.cnblogs.com/zhaoqingqing/archive/2019/01/17/10274176.html

 

 

iOS禁止热更新真相:

苹果是禁止热更新技术是因为开发者使用了 JS-Patch Rollout 类库,或者在集成的第三方 SDK 中使用了上述框架。未采用上述框架的热更新技术,目前为止并未收到影响。

JSPatch 的原理是,开发者编写 JavaScript 代码,利用苹果内置的 JavaScriptCore.Framework 执行,以实现热更新功能。这一点看似也符合标准,但是在技术上,存在着重大安全隐患,参考 JSPatch 的业务逻辑:

  1. require('UIView')
  2. var view = UIView.alloc().init()
  3. view.setBackgroundColor(require('UIColor').grayColor())
  4. view.setAlpha(0.5)

简单理解,JSPatch 为所有的 Objective-C API 进行了映射,允许开发者在 JS 端调用任意原生代码,这显然是极其危险的。假设这段代码是通过热更新技术下载执行的,如果在中间存在黑客,把这段代码动态替换掉,比如修改为获取用户通讯录并上传到黑客的服务器,就会造成重大的安全问题。

JSPatch 不同的是,游戏热更新技术主要的实现方式是把动态脚本下载之后,让动态脚本调用游戏引擎提供的接口实现缺陷修复,动态脚本并不能任意调用全部原生代码,而是只能根据游戏引擎提供的接口调用相关功能,也就是说游戏引擎未提供的接口,热更新代码无法调用,也就无法访问苹果禁止访问的原生代码。

你可能感兴趣的:(Unity)