unity 无法在ios上热更的原因和应对

26 篇文章 0 订阅

unity 无法在ios上热更的原因和应对

  • 苹果禁止
  • Mono虚拟机支持动态编译,因为苹果禁止,所以不能用

动态编译原理

  • c# -> CIL
  • CIL 通用中间语言
    • 可以被Mono虚拟机解释执行
  • 对Mono来说CIL是一种资源文件
  • CIL到本地指令的即时编译
    • 依赖JIT (Just in Time)技术
  • 在ios上mono是Full AOT模式
    • 一切在运行前都编译成ios的本地代码

CIL原理

  • 高级语言 -> CIL -> 虚拟机运行时生成Native Code并且运行

苹果是如何禁止CIL的

  • 苹果禁止内存区域的可执行模式
    • 运行时分配的内存都不给可执行的权限

如何突破苹果的封锁

  • 这是我推断的,没实验过,当提供一个思路
  • 编译期生成无用的代码占用足够的内存,确定这段内存的地址,如此便获得有可执行权限的内存段A
    • 如果知道一个native code占用多少内存,重复摆放这个native code就占用了内存
    • 函数名是内存的起点,起点+长度是终点
  • 运行时把临时生成的native code复制到内存A里面执行

确定可以绕过苹果的封锁的方法

  • 使用Lua

ios上热更预制资源导致崩溃的原因

  • 直接原因:unity序列化出错
    • 修改了mono代码,资源的序列化方式变更
    • ios不能更新代码,所以用的是旧的序列化设置

哪些操作一定会导致序列化变更

  • 增加/减少mono类field
  • 改变mono类field类型 && 新类型的内存占用和旧的不同

术语

  • JIT:Just in Time
    • 即时编译
      AOT:Ahead of Time
    • 静态编译

备注

  • CIL的VM是基于堆栈的

参考

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Addressable是Unity中的一个工具包,用于管理资源的加载和卸载。iOS指的是在发布应用后,可以通过网络下载新资源文件,实现应用新的功能。 在Unity中使用Addressable可以实现iOS的功能。首先,我们需要将需要的资源文件分割成小块,并上传到服务器上。然后,在应用中使用Addressable加载资源时,可以通过指定资源的地址来加载对应的资源文件。 当应用启动时,可以通过检查服务器上的资源版本号来判断是否需要进行。如果有新的资源文件,可以使用Addressable下载新的资源文件,替换原有的资源文件,以实现应用的新。 使用Addressable进行iOS的好处是可以降低应用的安装包大小,因为可以把一些较大的资源文件分离出来,通过网络进行下载。同时,也可以减少应用的新时间,只需要下载新的资源文件而不是整个应用。 然而,使用Addressable进行也需要注意一些问题。首先,要保证服务器上的资源文件的稳定性和完整性,以免应用在新资源时出现错误。其次,要考虑用户的流量消耗,尽量减少资源文件的大小和下载次数。 总之,通过使用Unity中的Addressable工具包,我们可以实现iOS的功能,实现应用的自动新。这样可以提升用户体验,减少安装包大小和新时间,但也需要注意资源文件的稳定性和用户的流量消耗。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值