Version: 5.6
优化 IL2CPP 构建时间
事件系统

使用 IL2CPP 进行托管字节码剥离

Managed byte code stripping is always enabled when the IL2CPP scripting backend is used. In this case, the Stripping Level option is replaced with an Boolean option named Strip Engine Code. If this option is enabled, unused modules and classes in the Unity Engine code will be removed. If it is disabled, all of the modules and classes in the Unity Engine code will be preserved.

The link.xml file (described below) can be used to effectively disable bytecode stripping by preserving both types and full assemblies. For example, to prevent the System assembly from being stripped, the following link.xml file can be used:

<linker>
       <assembly fullname="System" preserve="all"/>
</linker>

提示

使用反射时如何处理剥离

剥离在很大程度上取决于静态代码分析,有时无法有效完成,尤其是在使用反射等动态特性时。在这种情况下,有必要提供一些关于不应触及哪些类的提示。Unity 支持每个项目的自定义剥离黑名单。使用黑名单很简单,只需创建一个 link.xml 文件并将其放入 Assets 文件夹(或 Assets 的任何子目录)即可。下面提供了 link.xml 文件内容的示例。标记为保留状态的类不受剥离的影响:

<linker>
       <assembly fullname="System.Web.Services">
               <type fullname="System.Web.Services.Protocols.SoapTypeStubInfo" preserve="all"/>
               <type fullname="System.Web.Services.Configuration.WebServicesConfigurationSectionHandler" preserve="all"/>
       </assembly>

       <assembly fullname="System">
               <type fullname="System.Net.Configuration.WebRequestModuleHandler" preserve="all"/>
               <type fullname="System.Net.HttpRequestCreator" preserve="all"/>
               <type fullname="System.Net.FileWebRequestCreator" preserve="all"/>
       </assembly>

       <assembly fullname="mscorlib">
               <type fullname="System.AppDomain" preserve="fields"/>
               <type fullname="System.InvalidOperationException" preserve="fields">
                       <method signature="System.Void .ctor()"/>
               </type>
               <type fullname="System.Object" preserve="nothing">
                      <method name="Finalize"/>
               </type>
       </assembly>
</linker>

一个项目可以包含多个 link.xml 文件。每个 link.xml 文件可指定许多不同的选项。 assembly 元素指示应该应用嵌套指令的托管程序集。

type 元素用于指示应如何处理特定类型。它必须是 assembly 元素的子元素。fullname 属性可接受“*”通配符匹配一个或多个字符。

preserve 属性可以采用以下三个值之一:

  • all: Keep everything from the given type (or assembly, for IL2CPP only).
  • fields: Keep only the fields of the given type.
  • nothing: Keep only the given type, bug none of its contents.

method 元素用于指示应保留特定方法。它必须是 type 元素的子元素。可按名称或签名来指定方法。

剥离的程序集将输出到项目中 Temp 目录下的目录(具体位置因目标平台而异)。原始的未剥离程序集在未剥离的目录中与剥离的程序集位于相同的位置。可使用 ILSpy 之类的工具来检查剥离的和未剥离的程序集,从而确定删除了代码的哪些部分。


优化 IL2CPP 构建时间
事件系统