BuildPostProcessor.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #if UNITY_EDITOR
  2. // System
  3. using System;
  4. // Unity
  5. using UnityEditor;
  6. using UnityEditor.Callbacks;
  7. #if UNITY_2018_1_OR_NEWER
  8. using UnityEditor.Build.Reporting;
  9. #endif
  10. #if UNITY_5_6_OR_NEWER
  11. using UnityEditor.Build;
  12. #endif
  13. namespace OPS.Obfuscator
  14. {
  15. #if UNITY_2018_2_OR_NEWER
  16. public class BuildPostProcessor : IPostBuildPlayerScriptDLLs
  17. #elif UNITY_2018_1_OR_NEWER
  18. public class BuildPostProcessor : IPostprocessBuildWithReport
  19. #elif UNITY_5_6_OR_NEWER
  20. public class BuildPostProcessor : IPostprocessBuild
  21. #else
  22. public class BuildPostProcessor
  23. #endif
  24. {
  25. //Defines if an Obfuscation Process took place.
  26. private static bool hasObfuscated = false;
  27. //The Main Obfuscation Program
  28. private static OPS.Obfuscator.Obfuscator obfuscator;
  29. //Check if unityObjects got obfuscated.
  30. private static bool unityObjectsAssetsNeedReverting = false;
  31. //Check if extern assemblys got obfuscated.
  32. private static bool assemblysNeedReverting = false;
  33. //Revert Unity Assets and external Assemblies, if postprocess got not called or update got cleared!
  34. [InitializeOnLoad]
  35. public static class OnInitializeOnLoad
  36. {
  37. static OnInitializeOnLoad()
  38. {
  39. EditorApplication.update += RestoreUnityObjects;
  40. EditorApplication.update += RestoreAssemblies;
  41. }
  42. }
  43. //Obfuscate Assemblies after first scene build.
  44. [PostProcessScene(1)]
  45. public static void OnPostProcessScene()
  46. {
  47. if (!hasObfuscated)
  48. {
  49. if (BuildPipeline.isBuildingPlayer && !EditorApplication.isPlayingOrWillChangePlaymode)
  50. {
  51. try
  52. {
  53. UnityEditor.EditorApplication.LockReloadAssemblies();
  54. //Load Settings
  55. var var_Settings = new Setting.Settings();
  56. var_Settings.LoadSettings();
  57. #if UNITY_2018_2_OR_NEWER
  58. var_Settings.IsLaterUnity_2018_2 = true;
  59. #endif
  60. //Init
  61. obfuscator = new Obfuscator(var_Settings);
  62. //Obfuscate Assemblies
  63. bool var_NoError = obfuscator.Obfuscate(UnityEditor.EditorUserBuildSettings.activeBuildTarget, new System.Collections.Generic.List<string>());
  64. if (var_NoError)
  65. {
  66. //
  67. EditorApplication.update += RestoreAssemblies;
  68. assemblysNeedReverting = true;
  69. //Obfuscate Assets
  70. obfuscator.ObfuscateAssets();
  71. //
  72. EditorApplication.update += RestoreUnityObjects;
  73. unityObjectsAssetsNeedReverting = true;
  74. //Save Assemblies
  75. obfuscator.Save();
  76. }
  77. hasObfuscated = true;
  78. }
  79. catch(Exception e)
  80. {
  81. UnityEngine.Debug.LogError("[OPS] Error: " + e.ToString());
  82. }
  83. finally
  84. {
  85. UnityEditor.EditorApplication.UnlockReloadAssemblies();
  86. }
  87. }
  88. }
  89. }
  90. public int callbackOrder
  91. {
  92. get
  93. {
  94. return 1;
  95. }
  96. }
  97. //Revert Unity Assets and external Assemblies.
  98. #if UNITY_2018_2_OR_NEWER
  99. public void OnPostBuildPlayerScriptDLLs(BuildReport report)
  100. #elif UNITY_2018_1_OR_NEWER
  101. public void OnPostprocessBuild(BuildReport report)
  102. #elif UNITY_5_6_OR_NEWER
  103. public void OnPostprocessBuild(BuildTarget _Target, string _PathToBuiltProject)
  104. #else
  105. [PostProcessBuildAttribute(1)]
  106. private static void OnPostprocessBuild(BuildTarget _Target, string _PathToBuiltProject)
  107. #endif
  108. {
  109. if (hasObfuscated)
  110. {
  111. if (unityObjectsAssetsNeedReverting)
  112. {
  113. RestoreUnityObjects();
  114. }
  115. if (assemblysNeedReverting)
  116. {
  117. RestoreAssemblies();
  118. }
  119. }
  120. RefreshAll();
  121. }
  122. private static void RestoreUnityObjects()
  123. {
  124. if (BuildPipeline.isBuildingPlayer == false)
  125. {
  126. try
  127. {
  128. unityObjectsAssetsNeedReverting = false;
  129. if (obfuscator == null)
  130. {
  131. //Load Settings
  132. var var_Settings = new Setting.Settings();
  133. var_Settings.LoadSettings();
  134. #if UNITY_2018_2_OR_NEWER
  135. var_Settings.IsLaterUnity_2018_2 = true;
  136. #endif
  137. obfuscator = new Obfuscator(var_Settings);
  138. }
  139. obfuscator.RevertAssets();
  140. EditorApplication.update -= RestoreUnityObjects;
  141. }
  142. catch (Exception e)
  143. {
  144. unityObjectsAssetsNeedReverting = true;
  145. UnityEngine.Debug.LogWarning("[OPS.OBF] " + e.ToString());
  146. }
  147. }
  148. }
  149. private static void RestoreAssemblies()
  150. {
  151. if (BuildPipeline.isBuildingPlayer == false)
  152. {
  153. try
  154. {
  155. assemblysNeedReverting = false;
  156. if (obfuscator == null)
  157. {
  158. return;
  159. }
  160. obfuscator.RestoreTemporaryAssemblies();
  161. EditorApplication.update -= RestoreAssemblies;
  162. }
  163. catch (Exception e)
  164. {
  165. assemblysNeedReverting = true;
  166. UnityEngine.Debug.LogWarning("[OPS.OBF] " + e.ToString());
  167. }
  168. }
  169. }
  170. public static void ManualRestore()
  171. {
  172. RestoreUnityObjects();
  173. RestoreAssemblies();
  174. }
  175. private static void RefreshAll()
  176. {
  177. hasObfuscated = false;
  178. }
  179. }
  180. }
  181. #endif