关于热更的杂记

JIT与AOT

ILRUNTIME可以根据平台设置,如果是安卓就用JIT,如果是IOS就用解释器来解释执行

关于IOS为什么不能通过DLL热更
原因:UNITY在IOS上是AOT编译的,即在程序运行前已经将IL代码编译成了本地机器码,
https://blog.csdn.net/yy405145590/article/details/41282669?locationNum=14

【编译MONO源码实现代码热更】
MONO源码中有一个接口mono_image_open_from_data_with_name,功能是用来加载Assembly-CSharp.dll,
这个接口在安卓与IOS都一样,在安卓上可以通过修改它来实现热更,在IOS却不行,猜测原因:
1,安卓支持JIT,mono_image_open_from_data_with_name返回的IL代码可以在程序运行时边解释边执行
2,IOS,U3D在IOS平台执行的是FULL AOT,即在IPA安装时调用mono_image_open_from_data_with_name来加载Assembly-CSharp.dll并进行编译,生成本地机器码并存储到手机上,以后每次运行执行的都是安装时生成的机器码,所以实现不了热更

参考资料:https://blog.csdn.net/yy405145590/article/details/41282669?locationNum=14


这个接口

参考:
1,https://www.iteye.com/blog/wanzhanzhuce-2265055
2,我们知道C#脚本首先会被编译成IL代码,然后再由CLR从内存中读取这些IL代码并将其转化为原生代码,这是.NET程序的运行机制,而Mono是.NET在开源社区中的一种实现,Mono对C#代码的编译分为两种,即即时编译JIT(动态)和提前编译AOT(静态),这是Mono能为我们提供的两种编译方式。而从客观上来讲,iOS禁止通过JIT这种方式来编译,所以你无法绕过AppStore直接对程序进行更新,因为即使你更新了C#脚本,由于这些脚本是没有经过编译的,它是无法直接运用到实际环境里的,而使用Lua进行热更新,实际上改变的是应用层的逻辑,核心逻辑依然是在游戏发布时就和应用程序一起打包了,因为Lua无需编译,所以它可以像普通文本资源一样更新,和C#一样Lua无法在运行时期间产生新的代码,它永远都是调用已存在的代码。所以综上所述,Unity引擎在iOS上无法热更新的关键是在iOS系统禁止了即时编译JIT这种权限,这个锅Unity和Mono都不背,谢谢!

Mono在Full AOT模式下的限制
https://www.cnblogs.com/tekkaman/p/3973452.html?utm_source=tuicool&utm_medium=referral

AOT是在安装时执行编译的,比如基于UNITY的APK安装时,会将IL代码编译为本机的本地代码,保存在手机的存储中,
因此AOT会使增加安装时间。
好处是: 程序启动快,内存占用小,包体小
JIT是运行开一个线程,一边编译一边执行,一般以函数为单位,编译过的机器码会缓存起来,下一次用到时直接取用。


IOS禁用JIT的原理是:禁用了堆上的代码执行权限。


参考资料:
1,https://www.zhihu.com/question/23874627
2,https://www.jianshu.com/p/a07bd632337a
3,https://www.cnblogs.com/murongxiaopifu/p/4278947.html


利用domain进行热更的原理:
https://www.cnblogs.com/Leo_wl/p/4255533.html

unity热更- 2 游戏大版本更新和热更新
https://blog.csdn.net/u014748818/article/details/78812728?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

Unity Android 动态更新 Assembly-CSharp.dll
http://blog.sina.com.cn/s/blog_9e5d42ee0102vvtg.html

猜你喜欢

转载自www.cnblogs.com/timeObjserver/p/12594394.html
今日推荐