StripAOTDllCommand.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using HybridCLR.Editor.Installer;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Reflection;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using UnityEditor;
  10. using UnityEngine;
  11. using static UnityEngine.Networking.UnityWebRequest;
  12. namespace HybridCLR.Editor.Commands
  13. {
  14. public static class StripAOTDllCommand
  15. {
  16. [MenuItem("HybridCLR/Generate/AOTDlls", priority = 105)]
  17. public static void GenerateStripedAOTDlls()
  18. {
  19. GenerateStripedAOTDlls(EditorUserBuildSettings.activeBuildTarget);
  20. }
  21. static BuildOptions GetBuildPlayerOptions(BuildTarget buildTarget)
  22. {
  23. BuildOptions options = BuildOptions.BuildScriptsOnly;
  24. bool development = EditorUserBuildSettings.development;
  25. if (development)
  26. {
  27. options |= BuildOptions.Development;
  28. }
  29. if (EditorUserBuildSettings.allowDebugging && development)
  30. {
  31. options |= BuildOptions.AllowDebugging;
  32. }
  33. if (EditorUserBuildSettings.connectProfiler && (development || buildTarget == BuildTarget.WSAPlayer))
  34. {
  35. options |= BuildOptions.ConnectWithProfiler;
  36. }
  37. if (EditorUserBuildSettings.buildWithDeepProfilingSupport && development)
  38. {
  39. options |= BuildOptions.EnableDeepProfilingSupport;
  40. }
  41. #if UNITY_2021_2_OR_NEWER
  42. options |= BuildOptions.CleanBuildCache;
  43. #endif
  44. return options;
  45. }
  46. private static string GetLocationPathName(string buildDir, BuildTarget target)
  47. {
  48. switch(target)
  49. {
  50. case BuildTarget.StandaloneWindows:
  51. case BuildTarget.StandaloneWindows64: return $"{buildDir}/{target}";
  52. case BuildTarget.StandaloneOSX: return buildDir;
  53. case BuildTarget.iOS: return buildDir;
  54. case BuildTarget.Android: return buildDir;
  55. case BuildTarget.StandaloneLinux64: return buildDir;
  56. default: return buildDir;
  57. }
  58. }
  59. public static void GenerateStripedAOTDlls(BuildTarget target)
  60. {
  61. string outputPath = $"{SettingsUtil.HybridCLRDataDir}/StrippedAOTDllsTempProj/{target}";
  62. BashUtil.RemoveDir(outputPath);
  63. var buildOptions = GetBuildPlayerOptions(target);
  64. #if UNITY_2021_2_OR_NEWER
  65. buildOptions |= BuildOptions.CleanBuildCache;
  66. #endif
  67. bool oldExportAndroidProj = EditorUserBuildSettings.exportAsGoogleAndroidProject;
  68. #if UNITY_EDITOR_OSX
  69. bool oldCreateSolution = UnityEditor.OSXStandalone.UserBuildSettings.createXcodeProject;
  70. #elif UNITY_EDITOR_WIN
  71. bool oldCreateSolution = UnityEditor.WindowsStandalone.UserBuildSettings.createSolution;
  72. #endif
  73. bool oldBuildScriptsOnly = EditorUserBuildSettings.buildScriptsOnly;
  74. EditorUserBuildSettings.buildScriptsOnly = true;
  75. switch (target)
  76. {
  77. case BuildTarget.StandaloneWindows:
  78. case BuildTarget.StandaloneWindows64:
  79. {
  80. #if UNITY_EDITOR_WIN
  81. UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = true;
  82. #endif
  83. break;
  84. }
  85. case BuildTarget.StandaloneOSX:
  86. {
  87. #if UNITY_EDITOR_OSX
  88. UnityEditor.OSXStandalone.UserBuildSettings.createXcodeProject = true;
  89. #endif
  90. break;
  91. }
  92. case BuildTarget.Android:
  93. {
  94. EditorUserBuildSettings.exportAsGoogleAndroidProject = true;
  95. break;
  96. }
  97. }
  98. Debug.Log($"GenerateStripedAOTDlls build option:{buildOptions}");
  99. BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions()
  100. {
  101. scenes = EditorBuildSettings.scenes.Where(s => s.enabled).Select(s => s.path).ToArray(),
  102. locationPathName = GetLocationPathName(outputPath, target),
  103. options = buildOptions,
  104. target = target,
  105. targetGroup = BuildPipeline.GetBuildTargetGroup(target),
  106. };
  107. var report = BuildPipeline.BuildPlayer(buildPlayerOptions);
  108. EditorUserBuildSettings.buildScriptsOnly = oldBuildScriptsOnly;
  109. switch (target)
  110. {
  111. case BuildTarget.StandaloneWindows:
  112. case BuildTarget.StandaloneWindows64:
  113. {
  114. #if UNITY_EDITOR_WIN
  115. UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = oldCreateSolution;
  116. #endif
  117. break;
  118. }
  119. case BuildTarget.StandaloneOSX:
  120. {
  121. #if UNITY_EDITOR_OSX
  122. UnityEditor.OSXStandalone.UserBuildSettings.createXcodeProject = oldCreateSolution;
  123. #endif
  124. break;
  125. }
  126. case BuildTarget.Android:
  127. {
  128. EditorUserBuildSettings.exportAsGoogleAndroidProject = oldExportAndroidProj;
  129. break;
  130. }
  131. }
  132. if (report.summary.result != UnityEditor.Build.Reporting.BuildResult.Succeeded)
  133. {
  134. throw new Exception("GenerateStripedAOTDlls failed");
  135. }
  136. Debug.Log($"GenerateStripedAOTDlls target:{target} path:{outputPath}");
  137. }
  138. }
  139. }