Unity的managed Stripping Level
你想了解Unity中的managed Stripping Level(托管代码剥离级别)这个设置,它主要用于优化发布包的大小,移除项目中未被使用的.NET托管代码。
一、核心概念解释
managed Stripping Level 是Unity在构建项目时的一个优化选项,作用是分析并移除项目中没有被实际调用的C#(托管)代码、类、方法、字段等,从而减小最终发布包的体积。这个过程也被称为代码剪裁(Code Stripping)。
它的本质是:Unity通过静态分析(或运行时分析)识别出“死代码”(未被使用的代码),并在打包时将这些代码从程序集中删除。
二、设置位置
在Unity Editor中,你可以通过以下路径找到该设置:
Edit → Project Settings → Player → 选择对应平台(如Android/iOS/PC) → Other Settings → Configuration → Managed Stripping Level
三、不同级别详解
Unity提供了多个剥离级别,从保守到激进,你可以根据项目需求选择:
| 级别 | 名称 | 作用(通俗解释) | 适用场景 | 风险 |
|---|---|---|---|---|
| 0 | Disabled |
禁用代码剥离,保留所有托管代码 | 开发调试、排查剥离导致的Bug | 包体积最大 |
| 1 | Low |
仅移除最安全的未使用代码(如明显未引用的空类、私有方法) | 绝大多数项目的默认选择 | 极低,几乎不会出问题 |
| 2 | Medium |
更深度的剥离,移除未使用的虚方法、接口实现、泛型实例等 | 追求更小包体积,且项目无复杂反射 | 中等,反射调用未标记的代码可能失效 |
| 3 | High |
最激进的剥离,几乎移除所有未被直接引用的代码 | 对包体积要求极高的移动端项目 | 高,反射/动态调用极易失效 |
| (特殊) | Use micro mscorlib |
配合剥离使用,仅保留精简版的mscorlib核心库(仅包含最基础的.NET API) | 极端体积优化场景 | 极高,可能导致基础API缺失 |
四、关键注意事项(新手必看)
-
反射(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>
- 方式1:使用
-
测试至关重要
选择Medium/High级别后,必须完整测试所有功能,尤其是涉及:- 反射(JSON序列化、插件动态调用等)
- 第三方库(如Newtonsoft.Json、XLua等)
- 泛型、接口、虚方法调用
-
不同平台的差异
- IL2CPP后端(iOS/Android主流):剥离效果更明显,因为IL2CPP会将托管代码编译为原生代码,剥离后能减少原生代码体积;
- Mono后端:剥离仅移除IL代码,效果相对弱一些。
五、最佳实践
- 开发阶段:设置为
Disabled或Low,避免调试时因代码被剥离导致奇怪的错误; - 发布测试阶段:先尝试
Low,测试通过后再尝试Medium; - 正式发布:根据测试结果选择
Medium(推荐)或High(需严格验证); - 所有涉及反射的代码,必须通过
Preserve特性或link.xml明确保留。
总结
managed Stripping Level的核心作用是移除未使用的托管代码,减小包体积,级别越高优化越激进,但风险也越大;- 反射是剥离的主要“雷区”,必须通过
Preserve特性或link.xml标记需要保留的代码; - 建议从低级别开始测试,发布前务必完整验证所有功能,避免因代码被误删导致运行时错误。