翼度科技»论坛 编程开发 .net 查看内容

Unity的IUnityLinkerProcessor:深入解析与实用案例

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
Unity IUnityLinkerProcessor

Unity IUnityLinkerProcessor是Unity引擎中的一个接口,它允许开发者在Unity项目构建时对代码进行链接处理。这个接口可以用来优化项目构建大小,减少不必要的代码和资源,提高项目的性能和加载速度。
接口定义

IUnityLinkerProcessor接口定义如下:
  1. namespace UnityEditor.Build.IPA
  2. {
  3. <linker>
  4.   <assembly fullname="Assembly-CSharp" />
  5. </linker><linker>
  6.   <assembly fullname="Assembly-CSharp" />
  7. </linker>public interface IUnityLinkerProcessor
  8. <linker>
  9.   <assembly fullname="Assembly-CSharp" />
  10. </linker><linker>
  11.   <assembly fullname="Assembly-CSharp" />
  12. </linker>{
  13. <linker>
  14. <linker>
  15.   <assembly fullname="Assembly-CSharp" />
  16. </linker><assembly fullname="AssemblyName">
  17. <linker>
  18.   <assembly fullname="Assembly-CSharp" />
  19. </linker><linker>
  20.   <assembly fullname="Assembly-CSharp" />
  21. </linker><type fullname="TypeName" preserve="method" />
  22. <linker>
  23.   <assembly fullname="Assembly-CSharp" />
  24. </linker></assembly>
  25. </linker>void OnBeforeRun(LinkXml linkXml);
  26. <linker>
  27. <linker>
  28.   <assembly fullname="Assembly-CSharp" />
  29. </linker><assembly fullname="AssemblyName">
  30. <linker>
  31.   <assembly fullname="Assembly-CSharp" />
  32. </linker><linker>
  33.   <assembly fullname="Assembly-CSharp" />
  34. </linker><type fullname="TypeName" preserve="method" />
  35. <linker>
  36.   <assembly fullname="Assembly-CSharp" />
  37. </linker></assembly>
  38. </linker>void OnProcessAssembly(string inputFile, string[] searchDirs, string outputFile);
  39. <linker>
  40.   <assembly fullname="Assembly-CSharp" />
  41. </linker><linker>
  42.   <assembly fullname="Assembly-CSharp" />
  43. </linker>}
  44. }
复制代码
其中,OnBeforeRun方法在Unity构建项目之前被调用,可以用来处理Link.xml文件。OnProcessAssembly方法在Unity构建项目时被调用,可以用来处理每个输入程序集。
Link.xml文件

Link.xml文件是Unity项目中的一个XML文件,用于指定需要保留的程序集、类型和成员。Link.xml文件的格式如下:
  1. <linker>
  2. <linker>
  3.   <assembly fullname="Assembly-CSharp" />
  4. </linker><assembly fullname="AssemblyName">
  5. <linker>
  6.   <assembly fullname="Assembly-CSharp" />
  7. </linker><linker>
  8.   <assembly fullname="Assembly-CSharp" />
  9. </linker><type fullname="TypeName" preserve="method" />
  10. <linker>
  11.   <assembly fullname="Assembly-CSharp" />
  12. </linker></assembly>
  13. </linker>
复制代码
其中,assembly元素指定需要保留的程序集,fullname属性指定程序集的完整名称。type元素指定需要保留的类型,fullname属性指定类型的完整名称,preserve属性指定需要保留的成员类型,可以是method、field、property、event等。
使用例子

下面给出三个使用例子,分别演示如何使用IUnityLinkerProcessor接口来优化Unity项目的构建大小。
例子1:保留指定程序集

在Link.xml文件中指定需要保留的程序集,其他程序集将被删除。
  1. <linker>
  2.   <assembly fullname="Assembly-CSharp" />
  3. </linker>
复制代码
在IUnityLinkerProcessor接口的OnBeforeRun方法中读取Link.xml文件,将需要保留的程序集添加到LinkerOptions中。
  1. public void OnBeforeRun(LinkXml linkXml){<linker>
  2.   <assembly fullname="Assembly-CSharp" />
  3. </linker><linker>
  4.   <assembly fullname="Assembly-CSharp" />
  5. </linker>foreach (var assembly in linkXml.Assemblies)<linker>
  6.   <assembly fullname="Assembly-CSharp" />
  7. </linker><linker>
  8.   <assembly fullname="Assembly-CSharp" />
  9. </linker>{<linker>
  10. <linker>
  11.   <assembly fullname="Assembly-CSharp" />
  12. </linker><assembly fullname="AssemblyName">
  13. <linker>
  14.   <assembly fullname="Assembly-CSharp" />
  15. </linker><linker>
  16.   <assembly fullname="Assembly-CSharp" />
  17. </linker><type fullname="TypeName" preserve="method" />
  18. <linker>
  19.   <assembly fullname="Assembly-CSharp" />
  20. </linker></assembly>
  21. </linker>if (assembly.Fullname == "Assembly-CSharp")<linker>
  22. <linker>
  23.   <assembly fullname="Assembly-CSharp" />
  24. </linker><assembly fullname="AssemblyName">
  25. <linker>
  26.   <assembly fullname="Assembly-CSharp" />
  27. </linker><linker>
  28.   <assembly fullname="Assembly-CSharp" />
  29. </linker><type fullname="TypeName" preserve="method" />
  30. <linker>
  31.   <assembly fullname="Assembly-CSharp" />
  32. </linker></assembly>
  33. </linker>{<linker>
  34. <linker>
  35.   <assembly fullname="Assembly-CSharp" />
  36. </linker><assembly fullname="AssemblyName">
  37. <linker>
  38.   <assembly fullname="Assembly-CSharp" />
  39. </linker><linker>
  40.   <assembly fullname="Assembly-CSharp" />
  41. </linker><type fullname="TypeName" preserve="method" />
  42. <linker>
  43.   <assembly fullname="Assembly-CSharp" />
  44. </linker></assembly>
  45. </linker><linker>
  46.   <assembly fullname="Assembly-CSharp" />
  47. </linker><linker>
  48.   <assembly fullname="Assembly-CSharp" />
  49. </linker>LinkerOptions.LinkAssemblies.Add(assembly.Fullname);<linker>
  50. <linker>
  51.   <assembly fullname="Assembly-CSharp" />
  52. </linker><assembly fullname="AssemblyName">
  53. <linker>
  54.   <assembly fullname="Assembly-CSharp" />
  55. </linker><linker>
  56.   <assembly fullname="Assembly-CSharp" />
  57. </linker><type fullname="TypeName" preserve="method" />
  58. <linker>
  59.   <assembly fullname="Assembly-CSharp" />
  60. </linker></assembly>
  61. </linker>}<linker>
  62.   <assembly fullname="Assembly-CSharp" />
  63. </linker><linker>
  64.   <assembly fullname="Assembly-CSharp" />
  65. </linker>}}
复制代码
例子2:保留指定类型和成员

在Link.xml文件中指定需要保留的类型和成员,其他类型和成员将被删除。
[code]

举报 回复 使用道具