StripAOTDllCommand.cs 7.1 KB

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