Unity3D的IL2CPP平台找不到默认构造函数的坑

最初发现这个问题的情况是,当游戏用IL2CPP平台发布IOS版本的时候,会遇到某些dll格式的插件会导致游戏抛异常崩溃,比如FullInspector和Behavior Designer。所抛的异常是找不到某些类的默认构造函数。

后来发现,不只是某些插件会报这种异常,很多json格式的序列化功能也会在IL2CPP平台上抛找不到默认构造函数的异常。

导致这个问题的原因是,IL2CPP版本在AOT编译时的一些优化机制导致的。想要详细了解这个机制的话可以看文档:http://docs.unity3d.com/Manual/iphone-playerSizeOptimization.html

其实问题就出在函数的静态调用和利用反射进行动态调用的区别上。在AOT阶段编译的时候,凡是检查到某个类或某个函数完全没有使用到,编译器就会抛弃它。这是一个优化机制,但问题就是这种检查只能检查静态引用,对于利用反射机制进行的调用编译器发现不了。这就导致了,没有进行静态引用的函数,会被编译器抛弃掉,然后在企图通过反射机制进行调用的时候,就会导致找不到要调用的函数。

举个例子,有些序列化插件,比如FullSerializer,在生成新对象的时候没有用new(静态引用),而是用了Activator泛型(动态反射)。所以类的构造函数会在编译的时候抛弃掉,然后Activator企图动态访问其动态函数的时候,问题就出现了。

解决这个问题的方法,比较直接的做法在代码中加入丢失的构造函数的静态引用,也就是随便找个地方new一个出来。这样可以防止IL2CPP在优化的时候被抛弃。这种做法的问题是会留一个无用的对象在内存里。

更好的做法是用Unity3D的link.xml功能。这个link.xml的功能就是在AOT编译的时候,告诉编译器,link.xml里指定的这些类,不管有没有引用到,都要保留下来。虽然可以精确指向到某个类,但是比较简单的做法是,把整个出问题的插件的命名空间全部包含进去就可以了。

举个例子,在对应FullInspector和Behavior Designer的时候,link.xml大概是长这个样子的:

<linker>

<assembly fullname="FullInspector-Core">

<namespace fullname="FullInspector" preserve="all"/>

</assembly>

<assembly fullname="BehaviorDesignerRuntime">

< namespace fullname="BehaviorDesigner.Runtime " preserve="all"/>

</assembly>

</linker>

这样这两个插件里的类和函数都会被完整的保留下来了,问题解决。

时间: 2024-12-28 01:41:40

Unity3D的IL2CPP平台找不到默认构造函数的坑的相关文章

实体类No default constructor found 找不到默认构造函数;

root cause org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.hs.model.StudentModel]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.hs.model.StudentModel.<init>() org.

更改CloudStack中KVM平台的Windows虚拟机默认磁盘类型为VirtIO

前言 本文的目的是为了解决在使用CloudStack(CloudPlatform)时,基于KVM虚拟化平台,Windows虚拟机的性能低下的问题. 此性能,主要指磁盘IO和网卡性能. 相关文档 由于CS文档中,只强调了PV这个概念,根据PV模式区分使用不同的硬件接口类型.所以收集部分链接给大家扫盲. 关于PV(Paravirtualization-半虚拟化)模式的概念,请参阅: http://www.rackspace.com/knowledge_center/article/choosing-

[转载]Unity3D在各平台上的路径

原文地址 http://blog.csdn.net/u010377179/article/details/52922727 关于Unity3D在各平台上的路径问题,网上有好多的资料,如下是比较好的参考资料: 1.http://www.manew.com/thread-23491-1-1.html 2.http://www.xuanyusong.com/archives/2656 这里我不详细解释和路径的用法,只把各个路径对应的位置和访问方式总结一下. 1.Resources路径 Resource

随笔——判断Unity3D的运行平台

今天研究了一下Unity3D的运行平台,在这里做个笔记,免得以后又忘了! 1.新建项目 2.新建Scripts和Scenes文件夹,用来存放脚本和场景 3.添加Text,显示输出信息 4.新建GameController脚本 5.运行游戏,查看结果 6.其他 开始吧! 1.新建项目 新建一个项目,名字叫DeltaTimeTest吧,因为我今天顺便要测试一下DeltaTime函数.完成后的界面见下图: 2.新建Scripts和Scenes文件夹,用来存放脚本和场景 到项目浏览器窗口新建Script

砖石OTC跑分系统源码开发--跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发

跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发 跑分系统开发平台优势:可以解决大额量的交易问题,目前传统支付已经被严重限制,甚至存在资金冻结问题,风险比较大,而大额交易目前市面上也没有什么更好的方式! App.手机网页.PC商城.小程序,微商管理系统.扫码红包.质量追溯.分销.全返.分红.拼团.区块链商城,农场养殖系统,果园种植游戏,养殖游戏系统,区块链钱包系统,区块链挖矿系统,定制服务·系统开发提

微信跑分APP定制开发--跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发

跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发 跑分系统开发平台优势:可以解决大额量的交易问题,目前传统支付已经被严重限制,甚至存在资金冻结问题,风险比较大,而大额交易目前市面上也没有什么更好的方式! App.手机网页.PC商城.小程序,微商管理系统.扫码红包.质量追溯.分销.全返.分红.拼团.区块链商城,农场养殖系统,果园种植游戏,养殖游戏系统,区块链钱包系统,区块链挖矿系统,定制服务·系统开发提

支付宝跑分软件模式开发--跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发

跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发 跑分系统开发平台优势:可以解决大额量的交易问题,目前传统支付已经被严重限制,甚至存在资金冻结问题,风险比较大,而大额交易目前市面上也没有什么更好的方式! App.手机网页.PC商城.小程序,微商管理系统.扫码红包.质量追溯.分销.全返.分红.拼团.区块链商城,农场养殖系统,果园种植游戏,养殖游戏系统,区块链钱包系统,区块链挖矿系统,定制服务·系统开发提

微信跑分系统模式开发--跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发

跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发 跑分系统开发平台优势:可以解决大额量的交易问题,目前传统支付已经被严重限制,甚至存在资金冻结问题,风险比较大,而大额交易目前市面上也没有什么更好的方式! App.手机网页.PC商城.小程序,微商管理系统.扫码红包.质量追溯.分销.全返.分红.拼团.区块链商城,农场养殖系统,果园种植游戏,养殖游戏系统,区块链钱包系统,区块链挖矿系统,定制服务·系统开发提

砖石OTC跑分系统模式开发-跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发

跑分系统开发平台找:黄经理137-1912-1181 / 微:LING1995hhh,跑分软件,跑分APP,跑分模式,跑分平台,跑分系统定制开发 跑分系统开发平台优势:可以解决大额量的交易问题,目前传统支付已经被严重限制,甚至存在资金冻结问题,风险比较大,而大额交易目前市面上也没有什么更好的方式! App.手机网页.PC商城.小程序,微商管理系统.扫码红包.质量追溯.分销.全返.分红.拼团.区块链商城,农场养殖系统,果园种植游戏,养殖游戏系统,区块链钱包系统,区块链挖矿系统,定制服务·系统开发提