1.Unity之IL2CPP
Unity之IL2CPP
在Unity4.6.1 p5及以后版本中,脚本后处理(Scripting Backend)的选项包括mono和il2cpp。IL2CPP是Unity引入的一种新型方式,它将.Net平台的量比指标源码IL(中间语言)转换为C++源码,再交由各平台的C++编译器进行编译,实现平台兼容性。IL2CPP由两部分组成,AOT编译器将IL转换为C++源码,运行时库提供诸如垃圾回收、线程/文件获取等服务与抽象。相较于mono,图文直播 源码IL2CPP的代码生成效率有显著提高。
IL2CPP AOT编译器执行文件名为il2cpp.exe,其路径随Unity安装环境的不同而变化。在Windows下,该文件位于Editor\Data\il2cpp目录内;对于OSX平台,企业flash源码则在Contents/Frameworks/il2cpp/build目录中。il2cpp.exe是一个由C#编写的托管代码可执行文件,在开发过程中,使用.NET和Mono编译器对其进行编译。
在使用IL2CPP打包时,粉碎文件源码需注意其运行效率优势,几乎在实际项目中直接使用该方式。然而,由于不能在运行时动态生成代码和类型,编译时必须确定所有需要用到的人物透视源码类型。类型裁剪是IL2CPP打包过程中的关键特性,Unity会自动裁剪未引用的Unity工程DLL中的类型,以减小发布后的ipa包尺寸。但同时,这也可能导致运行时出现找不到类型异常,特别是在通过反射等方式在编译时无法得知的函数调用中。
为避免类型被意外裁剪,Unity提供了link.xml文件来指定不能裁剪的类型。在Assets目录下创建该文件,按照格式指定需要保留的类型。对于泛型实例和方法,需采取相应措施以确保其在运行时可用。使用CLR绑定或在主工程中定义公有变量作为泛型实例,可实现IL2CPP对泛型的完整保留,避免运行时问题。在热更DLL中避免调用Unity主工程的泛型方法,以防止因缺少调用导致代码在运行时出现问题。在遇到iOS运行时错误时,可在Unity主工程中随便定义一个静态方法并调用,仅用作告知IL2CPP需要该方法的指示。