你想了解Unity中的managed Stripping Level(托管代码剥离级别)这个设置,它主要用于优化发布包的大小,移除项目中未被使用的.NET托管代码。

一、核心概念解释

managed Stripping Level 是Unity在构建项目时的一个优化选项,作用是分析并移除项目中没有被实际调用的C#(托管)代码、类、方法、字段等,从而减小最终发布包的体积。这个过程也被称为代码剪裁(Code Stripping)

它的本质是:Unity通过静态分析(或运行时分析)识别出“死代码”(未被使用的代码),并在打包时将这些代码从程序集中删除。

二、设置位置

在Unity Editor中,你可以通过以下路径找到该设置:
EditProject SettingsPlayer → 选择对应平台(如Android/iOS/PC) → Other SettingsConfigurationManaged Stripping Level

三、不同级别详解

Unity提供了多个剥离级别,从保守到激进,你可以根据项目需求选择:

级别 名称 作用(通俗解释) 适用场景 风险
0 Disabled 禁用代码剥离,保留所有托管代码 开发调试、排查剥离导致的Bug 包体积最大
1 Low 仅移除最安全的未使用代码(如明显未引用的空类、私有方法) 绝大多数项目的默认选择 极低,几乎不会出问题
2 Medium 更深度的剥离,移除未使用的虚方法、接口实现、泛型实例等 追求更小包体积,且项目无复杂反射 中等,反射调用未标记的代码可能失效
3 High 最激进的剥离,几乎移除所有未被直接引用的代码 对包体积要求极高的移动端项目 高,反射/动态调用极易失效
(特殊) Use micro mscorlib 配合剥离使用,仅保留精简版的mscorlib核心库(仅包含最基础的.NET API) 极端体积优化场景 极高,可能导致基础API缺失

四、关键注意事项(新手必看)

  1. 反射(Reflection)是最大的坑
    代码剥离是静态分析,无法识别通过反射动态调用的代码。例如:

    // 静态分析会认为MyClass未被使用,可能被剥离
    Type type = Type.GetType("MyNamespace.MyClass");
    object instance = Activator.CreateInstance(type);
    

    解决方案

    • 方式1:使用Preserve特性标记需要保留的代码
      using UnityEngine;
      // 标记整个类不被剥离
      [Preserve]
      public class MyClass
      {
          // 标记方法不被剥离
          [Preserve]
          public void MyMethod() { }
      }
      
    • 方式2:创建链接器配置文件(link.xml),指定需要保留的程序集/类
      Assets目录下创建link.xml,内容示例:
      <linker>
        <!-- 保留整个程序集 -->
        <assembly fullname="MyAssemblyName" preserve="all"/>
        <!-- 仅保留指定类 -->
        <assembly fullname="MyAssemblyName">
          <type fullname="MyNamespace.MyClass" preserve="all"/>
        </assembly>
      </linker>
      
  2. 测试至关重要
    选择Medium/High级别后,必须完整测试所有功能,尤其是涉及:

    • 反射(JSON序列化、插件动态调用等)
    • 第三方库(如Newtonsoft.Json、XLua等)
    • 泛型、接口、虚方法调用
  3. 不同平台的差异

    • IL2CPP后端(iOS/Android主流):剥离效果更明显,因为IL2CPP会将托管代码编译为原生代码,剥离后能减少原生代码体积;
    • Mono后端:剥离仅移除IL代码,效果相对弱一些。

五、最佳实践

  1. 开发阶段:设置为DisabledLow,避免调试时因代码被剥离导致奇怪的错误;
  2. 发布测试阶段:先尝试Low,测试通过后再尝试Medium
  3. 正式发布:根据测试结果选择Medium(推荐)或High(需严格验证);
  4. 所有涉及反射的代码,必须通过Preserve特性或link.xml明确保留。

总结

  1. managed Stripping Level的核心作用是移除未使用的托管代码,减小包体积,级别越高优化越激进,但风险也越大;
  2. 反射是剥离的主要“雷区”,必须通过Preserve特性或link.xml标记需要保留的代码;
  3. 建议从低级别开始测试,发布前务必完整验证所有功能,避免因代码被误删导致运行时错误。