14.Unity使用IL2CPP打包注意事项

  1. 14.Unity使用IL2CPP打包注意事项
    1. 14.1 题目
    2. 14.2 深入解析
    3. 14.3 答题示例
    4. 14.4 关键词联想
      1. IL2CPP相关
      2. 保留方式
      3. 场景易触发

14.Unity使用IL2CPP打包注意事项


14.1 题目

Unity使用IL2CPP打包时,我们应该注意什么?如何避免(可以举例说明)


14.2 深入解析

在使用IL2CPP进行Unity打包时,需要特别注意代码裁剪问题。IL2CPP会自动将认为不会被使用的代码裁剪掉,这可能导致在运行时出现异常或错误。比如在使用Lua等脚本语言时,其实会用到很多UnityEngine或者我们自己写的C#代码,但是这些代码并不会在引擎中直接使用,都是在Lua中使用的,此时最容易出现的问题就是代码裁剪,导致打包后出现异常和报错。

为了避免IL2CPP的代码裁剪,我们可以采取以下方法:

  1. 设置打包时的裁剪等级

    • Unity提供了不同的裁剪等级选项,如Strip Assemblies、Strip ByteCode等。通过设置适当的裁剪等级,可以控制裁剪的严格程度,避免不必要的代码被裁剪。
  2. 通过link.xml文件配置明确规定哪些内容不裁剪

    • 可以通过自定义的xml文件配置明确指定哪些代码不应该被裁剪掉。这样可以确保重要的代码不会被误删。
  3. 在静态方法中显式调用不想被裁剪的内容

    • 通过在静态方法中显式地调用不想被裁剪的内容,可以告诉IL2CPP编译器这部分代码是需要保留的,不要进行裁剪。

通过以上方法,可以有效地减轻 IL2CPP 代码裁剪带来的问题,保证应用正常运行。


14.3 答题示例

在使用 IL2CPP 打包时,最需要注意的是 代码裁剪(Code Stripping) 问题。IL2CPP 会移除未被静态分析引用的代码,可能导致运行时异常,特别是 反射、Lua调用C#泛型方法 等未显式调用的部分。

解决方式包括:

  • 使用 link.xml 保留必要类型/方法

    <linker>
      <assembly fullname="Assembly-CSharp">
        <type fullname="MyNamespace.MyClass" preserve="all"/>
      </assembly>
    </linker>
    
  • 在静态方法中显式调用不想被裁剪的内容

    [RuntimeInitializeOnLoadMethod]
    static void Preserve()
    {
        var t = typeof(MyNamespace.MyClass); // 确保类型被引用
    }
    
  • 合理配置 Player Settings 中的 Stripping Level,避免过度裁剪。

举例:如果你用 Lua 热更框架调用 UnityEngine.Debug.Log,但主工程里没写到这行代码,打 IL2CPP 包时可能会把 Debug.Log 给裁了,导致 Lua 调用时报错。此时就需要在 link.xml 或保留函数中显式引用。


14.4 关键词联想

IL2CPP相关

  • 代码裁剪(Code Stripping)
  • AOT 编译 / 反射 / 泛型

保留方式

  • link.xml
  • RuntimeInitializeOnLoadMethod
  • Dummy 保留引用
  • PlayerSettings → Managed Stripping Level

场景易触发

  • Lua 调用 C#
  • XLua / HybridCLR
  • 热更新框架 / 动态资源绑定


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏