public void CollectReferences(string path, bool collectMethods, float progressValue, bool ignoreSystemDlls) { this._progressValue = progressValue; this._assemblyDefinitions = new HashSet <AssemblyDefinition>(); string[] array = (!Directory.Exists(path)) ? new string[0] : Directory.GetFiles(path); DefaultAssemblyResolver assemblyResolver = AssemblyReferenceChecker.AssemblyResolverFor(path); string[] array2 = array; for (int i = 0; i < array2.Length; i++) { string text = array2[i]; if (!(Path.GetExtension(text) != ".dll")) { AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(text, new ReaderParameters { AssemblyResolver = assemblyResolver }); if (!ignoreSystemDlls || !AssemblyReferenceChecker.IsIgnoredSystemDll(assemblyDefinition.Name.Name)) { this._assemblyFileNames.Add(Path.GetFileName(text)); this._assemblyDefinitions.Add(assemblyDefinition); } } } AssemblyDefinition[] array3 = this._assemblyDefinitions.ToArray <AssemblyDefinition>(); this._referencedTypes = MonoAOTRegistration.BuildReferencedTypeList(array3); if (collectMethods) { this.CollectReferencedAndDefinedMethods(array3); } }
private void CollectReferencesFromRootsRecursive(string dir, IEnumerable <string> roots, bool ignoreSystemDlls) { DefaultAssemblyResolver assemblyResolver = AssemblyReferenceChecker.AssemblyResolverFor(dir); foreach (string current in roots) { string fileName = Path.Combine(dir, current); if (!this._assemblyFileNames.Contains(current)) { AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(fileName, new ReaderParameters { AssemblyResolver = assemblyResolver }); if (!ignoreSystemDlls || !AssemblyReferenceChecker.IsIgnoredSystemDll(assemblyDefinition.Name.Name)) { this._assemblyFileNames.Add(current); this._assemblyDefinitions.Add(assemblyDefinition); foreach (AssemblyNameReference current2 in assemblyDefinition.MainModule.AssemblyReferences) { string text = current2.Name + ".dll"; if (!this._assemblyFileNames.Contains(text)) { this.CollectReferencesFromRootsRecursive(dir, new string[] { text }, ignoreSystemDlls); } } } } } }
public static AssemblyReferenceChecker AssemblyReferenceCheckerWithUpdateProgressAction(Action action) { var checker = new AssemblyReferenceChecker(); checker._updateProgressAction = action; return(checker); }
public static bool GetScriptsHaveMouseEvents(string path) { AssemblyReferenceChecker assemblyReferenceChecker = new AssemblyReferenceChecker(); assemblyReferenceChecker.CollectReferences(path, true, 0f, true); return(assemblyReferenceChecker.HasMouseEvent); }
internal static AssemblyReferenceChecker AssemblyReferenceCheckerWithUpdateProgressAction(Action action, INetStandardPathProvider netStandardPathProvider) { var checker = new AssemblyReferenceChecker(netStandardPathProvider); checker._updateProgressAction = action; return(checker); }
public static bool GetScriptsHaveMouseEvents(string path) { AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); checker.CollectReferences(path, true, 0f, true); return(checker.HasDefinedMethod("OnMouse")); }
static public void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker, string stagingAreaDataManaged) { WriteCPlusPlusFileForStaticAOTModuleRegistration(buildTarget, file, crossCompileOptions, advancedLic, targetDevice, stripping, usedClassRegistry, checker, stagingAreaDataManaged, null); }
public static void GenerateDependencies(string strippedAssemblyDir, string icallsListFile, RuntimeClassRegistry rcr, out HashSet <string> nativeClasses, out HashSet <string> nativeModules) { string[] userAssemblies = CodeStrippingUtils.GetUserAssemblies(strippedAssemblyDir); nativeClasses = ((!PlayerSettings.stripEngineCode) ? null : CodeStrippingUtils.GenerateNativeClassList(rcr, strippedAssemblyDir, userAssemblies)); if (nativeClasses != null) { CodeStrippingUtils.ExcludeModuleManagers(ref nativeClasses); } nativeModules = CodeStrippingUtils.GetNativeModulesToRegister(nativeClasses); if (nativeClasses != null && icallsListFile != null) { HashSet <string> modulesFromICalls = CodeStrippingUtils.GetModulesFromICalls(icallsListFile); int derivedFromClassID = BaseObjectTools.StringToClassID("GlobalGameManager"); foreach (string current in modulesFromICalls) { int[] moduleClasses = ModuleMetadata.GetModuleClasses(current); int[] array = moduleClasses; for (int i = 0; i < array.Length; i++) { int num = array[i]; if (BaseObjectTools.IsDerivedFromClassID(num, derivedFromClassID)) { nativeClasses.Add(BaseObjectTools.ClassIDToString(num)); } } } nativeModules.UnionWith(modulesFromICalls); } AssemblyReferenceChecker assemblyReferenceChecker = new AssemblyReferenceChecker(); assemblyReferenceChecker.CollectReferencesFromRoots(strippedAssemblyDir, userAssemblies, true, 0f, true); }
private static HashSet <string> CollectManagedTypeReferencesFromRoots(string directory, string[] rootAssemblies) { HashSet <string> set = new HashSet <string>(); AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); bool withMethods = false; bool ignoreSystemDlls = false; checker.CollectReferencesFromRoots(directory, rootAssemblies, withMethods, 0f, ignoreSystemDlls); string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); foreach (AssemblyDefinition definition in assemblyDefinitions) { foreach (TypeDefinition definition2 in definition.MainModule.Types) { if (definition2.Namespace.StartsWith("UnityEngine") && (((definition2.Fields.Count > 0) || (definition2.Methods.Count > 0)) || (definition2.Properties.Count > 0))) { string name = definition2.Name; set.Add(name); } } } AssemblyDefinition definition3 = null; for (int i = 0; i < assemblyFileNames.Length; i++) { if (assemblyFileNames[i] == "UnityEngine.dll") { definition3 = assemblyDefinitions[i]; } } foreach (AssemblyDefinition definition4 in assemblyDefinitions) { if (definition4 != definition3) { IEnumerator <TypeReference> enumerator = definition4.MainModule.GetTypeReferences().GetEnumerator(); try { while (enumerator.MoveNext()) { TypeReference current = enumerator.Current; if (current.Namespace.StartsWith("UnityEngine")) { string item = current.Name; set.Add(item); } } } finally { if (enumerator == null) { } enumerator.Dispose(); } } } return(set); }
private static HashSet <string> CollectManagedTypeReferencesFromRoots(string directory, string[] rootAssemblies) { HashSet <string> stringSet = new HashSet <string>(); AssemblyReferenceChecker referenceChecker = new AssemblyReferenceChecker(); bool withMethods = false; bool ignoreSystemDlls = false; referenceChecker.CollectReferencesFromRoots(directory, (IEnumerable <string>)rootAssemblies, withMethods, 0.0f, ignoreSystemDlls); string[] assemblyFileNames = referenceChecker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = referenceChecker.GetAssemblyDefinitions(); foreach (AssemblyDefinition assemblyDefinition in assemblyDefinitions) { using (Collection <TypeDefinition> .Enumerator enumerator = assemblyDefinition.get_MainModule().get_Types().GetEnumerator()) { // ISSUE: explicit reference operation while (((Collection <TypeDefinition> .Enumerator)@enumerator).MoveNext()) { // ISSUE: explicit reference operation TypeDefinition current = ((Collection <TypeDefinition> .Enumerator)@enumerator).get_Current(); if (((TypeReference)current).get_Namespace().StartsWith("UnityEngine") && (current.get_Fields().get_Count() > 0 || current.get_Methods().get_Count() > 0 || current.get_Properties().get_Count() > 0)) { string name = ((TypeReference)current).get_Name(); stringSet.Add(name); } } } } AssemblyDefinition assemblyDefinition1 = (AssemblyDefinition)null; for (int index = 0; index < assemblyFileNames.Length; ++index) { if (assemblyFileNames[index] == "UnityEngine.dll") { assemblyDefinition1 = assemblyDefinitions[index]; } } foreach (AssemblyDefinition assemblyDefinition2 in assemblyDefinitions) { if (assemblyDefinition2 != assemblyDefinition1) { using (IEnumerator <TypeReference> enumerator = assemblyDefinition2.get_MainModule().GetTypeReferences().GetEnumerator()) { while (((IEnumerator)enumerator).MoveNext()) { TypeReference current = enumerator.Current; if (current.get_Namespace().StartsWith("UnityEngine")) { string name = current.get_Name(); stringSet.Add(name); } } } } } return(stringSet); }
private static HashSet<string> CollectManagedTypeReferencesFromRoots(string directory, string[] rootAssemblies) { HashSet<string> set = new HashSet<string>(); AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); bool withMethods = false; bool ignoreSystemDlls = false; checker.CollectReferencesFromRoots(directory, rootAssemblies, withMethods, 0f, ignoreSystemDlls); string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); foreach (AssemblyDefinition definition in assemblyDefinitions) { foreach (TypeDefinition definition2 in definition.MainModule.Types) { if (definition2.Namespace.StartsWith("UnityEngine") && (((definition2.Fields.Count > 0) || (definition2.Methods.Count > 0)) || (definition2.Properties.Count > 0))) { string name = definition2.Name; set.Add(name); } } } AssemblyDefinition definition3 = null; for (int i = 0; i < assemblyFileNames.Length; i++) { if (assemblyFileNames[i] == "UnityEngine.dll") { definition3 = assemblyDefinitions[i]; } } foreach (AssemblyDefinition definition4 in assemblyDefinitions) { if (definition4 != definition3) { IEnumerator<TypeReference> enumerator = definition4.MainModule.GetTypeReferences().GetEnumerator(); try { while (enumerator.MoveNext()) { TypeReference current = enumerator.Current; if (current.Namespace.StartsWith("UnityEngine")) { string item = current.Name; set.Add(item); } } } finally { if (enumerator == null) { } enumerator.Dispose(); } } } return set; }
private void CollectReferencedAndDefinedMethods(IEnumerable <AssemblyDefinition> assemblyDefinitions) { foreach (AssemblyDefinition current in assemblyDefinitions) { bool isSystem = AssemblyReferenceChecker.IsIgnoredSystemDll(current.Name.Name); foreach (TypeDefinition current2 in current.MainModule.Types) { this.CollectReferencedAndDefinedMethods(current2, isSystem); } } }
private static HashSet <string> CollectManagedTypeReferencesFromRoots(string directory, string[] rootAssemblies, StrippingInfo strippingInfo) { HashSet <string> set = new HashSet <string>(); AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); bool collectMethods = false; bool ignoreSystemDlls = false; checker.CollectReferencesFromRoots(directory, rootAssemblies, collectMethods, 0f, ignoreSystemDlls); string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); foreach (AssemblyDefinition definition in assemblyDefinitions) { foreach (TypeDefinition definition2 in definition.MainModule.Types) { if (definition2.Namespace.StartsWith("UnityEngine") && (((definition2.Fields.Count > 0) || (definition2.Methods.Count > 0)) || (definition2.Properties.Count > 0))) { string name = definition2.Name; set.Add(name); if ((strippingInfo != null) && !AssemblyReferenceChecker.IsIgnoredSystemDll(definition.Name.Name)) { strippingInfo.RegisterDependency(name, "Required by Scripts"); } } } } AssemblyDefinition definition3 = null; for (int i = 0; i < assemblyFileNames.Length; i++) { if (assemblyFileNames[i] == "UnityEngine.dll") { definition3 = assemblyDefinitions[i]; } } foreach (AssemblyDefinition definition4 in assemblyDefinitions) { if (definition4 != definition3) { foreach (TypeReference reference in definition4.MainModule.GetTypeReferences()) { if (reference.Namespace.StartsWith("UnityEngine")) { string item = reference.Name; set.Add(item); if ((strippingInfo != null) && !AssemblyReferenceChecker.IsIgnoredSystemDll(definition4.Name.Name)) { strippingInfo.RegisterDependency(item, "Required by Scripts"); } } } } } return(set); }
private static HashSet <string> CollectManagedTypeReferencesFromRoots(string directory, string[] rootAssemblies) { HashSet <string> hashSet = new HashSet <string>(); AssemblyReferenceChecker assemblyReferenceChecker = new AssemblyReferenceChecker(); bool withMethods = false; bool ignoreSystemDlls = false; assemblyReferenceChecker.CollectReferencesFromRoots(directory, rootAssemblies, withMethods, 0f, ignoreSystemDlls); string[] assemblyFileNames = assemblyReferenceChecker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = assemblyReferenceChecker.GetAssemblyDefinitions(); AssemblyDefinition[] array = assemblyDefinitions; for (int i = 0; i < array.Length; i++) { AssemblyDefinition assemblyDefinition = array[i]; foreach (TypeDefinition current in assemblyDefinition.MainModule.Types) { if (current.Namespace.StartsWith("UnityEngine") && (current.Fields.Count > 0 || current.Methods.Count > 0 || current.Properties.Count > 0)) { string name = current.Name; hashSet.Add(name); } } } AssemblyDefinition assemblyDefinition2 = null; for (int j = 0; j < assemblyFileNames.Length; j++) { if (assemblyFileNames[j] == "UnityEngine.dll") { assemblyDefinition2 = assemblyDefinitions[j]; } } AssemblyDefinition[] array2 = assemblyDefinitions; for (int k = 0; k < array2.Length; k++) { AssemblyDefinition assemblyDefinition3 = array2[k]; if (assemblyDefinition3 != assemblyDefinition2) { foreach (TypeReference current2 in assemblyDefinition3.MainModule.GetTypeReferences()) { if (current2.Namespace.StartsWith("UnityEngine")) { string name2 = current2.Name; hashSet.Add(name2); } } } } return(hashSet); }
public static void GenerateDependencies(string strippedAssemblyDir, string icallsListFile, RuntimeClassRegistry rcr, out HashSet <string> nativeClasses, out HashSet <string> nativeModules, BuildReport buildReport) { StrippingInfo buildReportData = StrippingInfo.GetBuildReportData(buildReport); string[] userAssemblies = CodeStrippingUtils.GetUserAssemblies(strippedAssemblyDir); nativeClasses = ((!PlayerSettings.stripEngineCode) ? null : CodeStrippingUtils.GenerateNativeClassList(rcr, strippedAssemblyDir, userAssemblies, buildReportData)); if (nativeClasses != null) { CodeStrippingUtils.ExcludeModuleManagers(ref nativeClasses); } nativeModules = CodeStrippingUtils.GetNativeModulesToRegister(nativeClasses, buildReportData); if (nativeClasses != null && icallsListFile != null) { HashSet <string> modulesFromICalls = CodeStrippingUtils.GetModulesFromICalls(icallsListFile); foreach (string current in modulesFromICalls) { if (!nativeModules.Contains(current) && buildReportData != null) { buildReportData.RegisterDependency(current, "Required by Scripts"); } int[] moduleClasses = ModuleMetadata.GetModuleClasses(current); int[] array = moduleClasses; for (int i = 0; i < array.Length; i++) { int num = array[i]; if (BaseObjectTools.IsDerivedFromClassID(num, CodeStrippingUtils.gameManagerClassId)) { string text = BaseObjectTools.ClassIDToString(num); nativeClasses.Add(text); if (buildReportData != null) { buildReportData.RegisterDependency(text, "Required by Module"); } } } } nativeModules.UnionWith(modulesFromICalls); } AssemblyReferenceChecker assemblyReferenceChecker = new AssemblyReferenceChecker(); assemblyReferenceChecker.CollectReferencesFromRoots(strippedAssemblyDir, userAssemblies, true, 0f, true); if (buildReportData != null) { foreach (string current2 in nativeModules) { buildReportData.AddModule(current2); } buildReportData.AddModule("Core"); } }
public static void GenerateDependencies(string strippedAssemblyDir, RuntimeClassRegistry rcr, out HashSet <string> nativeClasses, out HashSet <string> nativeModules) { string[] userAssemblies = GetUserAssemblies(strippedAssemblyDir); nativeClasses = !PlayerSettings.stripEngineCode ? null : GenerateNativeClassList(rcr, strippedAssemblyDir, userAssemblies); if (nativeClasses != null) { ExcludeModuleManagers(ref nativeClasses); } nativeModules = GetNativeModulesToRegister(nativeClasses); AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); checker.CollectReferencesFromRoots(strippedAssemblyDir, userAssemblies, true, 0f, true); if (checker.HasDefinedMethod("OnGUI")) { nativeModules.Add("IMGUI"); } }
private static void CreateManifest(string manifestPath, string companyName, string productName, string normalizedProductName, string id, AssemblyReferenceChecker checker) { string validVersionString = GetValidVersionString(); TextWriter writer = new StreamWriter(manifestPath); writer.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>"); writer.WriteLine("<manifest xmlns=\"http://tizen.org/ns/packages\" api-version=\"" + TizenUtilities.StringFromMinOSVersion() + "\" package=\"" + id + "\" version=\"" + validVersionString + "\">"); writer.WriteLine(" <author href=\"" + PlayerSettings.Tizen.productURL + "\">" + companyName + "</author>"); writer.WriteLine(" <profile name=\"mobile\" />"); writer.WriteLine("\t<description>" + SecurityElement.Escape(PlayerSettings.Tizen.productDescription) + "</description>"); writer.WriteLine("\t<ui-application appid=\"" + id + "\" exec=\"" + normalizedProductName + "\" type=\"capp\" multiple=\"false\" taskmanage=\"true\" nodisplay=\"false\">"); writer.WriteLine("\t\t<icon>app_icon.png</icon>"); writer.WriteLine("\t\t<label>" + productName + "</label>"); writer.WriteLine("\t</ui-application>"); writer.WriteLine("\t<feature name=\"http://tizen.org/feature/screen.size.all\">true</feature>"); writer.WriteLine("\t<privileges>"); if (checker.HasReferenceToMethod("UnityEngine.Handheld::Vibrate") || checker.HasReferenceToMethod("UnityEngine.iPhoneUtils::Vibrate")) { writer.WriteLine("\t\t<privilege>http://tizen.org/privilege/haptic</privilege>"); } if (checker.HasReferenceToType("UnityEngine.WebCamTexture")) { writer.WriteLine("\t\t<privilege>http://tizen.org/privilege/camera</privilege>"); } if (checker.HasReferenceToMethod("UnityEngine.Application::OpenURL") || checker.HasReferenceToType("UnityEngine.Purchasing")) { writer.WriteLine("\t\t<privilege>http://tizen.org/privilege/appmanager.launch</privilege>"); } if (checker.HasReferenceToType("UnityEngine.SystemInfo") && (PlayerSettings.Tizen.minOSVersion == TizenOSVersion.Version23)) { writer.WriteLine("\t\t<privilege>http://tizen.org/privilege/systemsettings</privilege>"); } if (checker.HasReferenceToMethod("UnityEngine.Screen::set_sleepTimeout")) { writer.WriteLine("\t\t<privilege>http://tizen.org/privilege/display</privilege>"); } if (((checker.HasReferenceToType("UnityEngine.Networking") || checker.HasReferenceToType("System.Net.Sockets")) || (checker.HasReferenceToType("UnityEngine.Network") || checker.HasReferenceToType("UnityEngine.RPC"))) || (checker.HasReferenceToType("UnityEngine.WWW") || checker.HasReferenceToType(typeof(UnityWebRequest).FullName))) { writer.WriteLine("\t\t<privilege>http://tizen.org/privilege/internet</privilege>"); } TizenUtilities.WriteCapabilitiesToManifest(writer); writer.WriteLine("\t</privileges>"); writer.WriteLine("</manifest>"); writer.Close(); string[] source = File.ReadAllLines(manifestPath); File.WriteAllLines(manifestPath, Enumerable.ToArray<string>(Enumerable.Distinct<string>(source))); }
public string WhoReferencesClass(string klass, bool ignoreSystemDlls) { foreach (AssemblyDefinition current in this.assemblyDefinitions) { if (!ignoreSystemDlls || !AssemblyReferenceChecker.IsIgnoredSystemDll(current.Name.Name)) { AssemblyDefinition[] assemblies = new AssemblyDefinition[] { current }; HashSet <string> source = MonoAOTRegistration.BuildReferencedTypeList(assemblies); if (source.Any((string item) => item.StartsWith(klass))) { return(current.Name.Name); } } } return(null); }
private void CollectReferencesFromRootsRecursive(string dir, IEnumerable <string> roots, bool ignoreSystemDlls) { DefaultAssemblyResolver assemblyResolver = AssemblyReferenceChecker.AssemblyResolverFor(dir); foreach (string current in roots) { string text = Path.Combine(dir, current); if (!this._assemblyFileNames.Contains(current)) { string arg_4D_0 = text; ReaderParameters readerParameters = new ReaderParameters(); readerParameters.set_AssemblyResolver(assemblyResolver); AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(arg_4D_0, readerParameters); if (!ignoreSystemDlls || !AssemblyReferenceChecker.IsIgnoredSystemDll(assemblyDefinition.get_Name().get_Name())) { this._assemblyFileNames.Add(current); this._assemblyDefinitions.Add(assemblyDefinition); using (Collection <AssemblyNameReference> .Enumerator enumerator2 = assemblyDefinition.get_MainModule().get_AssemblyReferences().GetEnumerator()) { while (enumerator2.MoveNext()) { AssemblyNameReference current2 = enumerator2.get_Current(); string text2 = current2.get_Name() + ".dll"; if (!this._assemblyFileNames.Contains(text2)) { this.CollectReferencesFromRootsRecursive(dir, new string[] { text2 }, ignoreSystemDlls); } } } } } } }
public static bool GetScriptsHaveMouseEvents(string path) { AssemblyReferenceChecker assemblyReferenceChecker = new AssemblyReferenceChecker(); assemblyReferenceChecker.CollectReferences(path, true, 0f, true); return assemblyReferenceChecker.HasDefinedMethod("OnMouse"); }
static public void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker, string stagingAreaDataManaged, IIl2CppPlatformProvider platformProvider) { // generate the Interal Call Summary file var icallSummaryPath = Path.Combine(stagingAreaDataManaged, "ICallSummary.txt"); var dlls = Directory.GetFiles(stagingAreaDataManaged, "UnityEngine.*Module.dll").Concat(new[] { Path.Combine(stagingAreaDataManaged, "UnityEngine.dll") }); var exe = Path.Combine(MonoInstallationFinder.GetFrameWorksFolder(), "Tools/InternalCallRegistrationWriter/InternalCallRegistrationWriter.exe"); var args = string.Format("-assembly=\"{0}\" -summary=\"{1}\"", dlls.Aggregate((dllArg, next) => dllArg + ";" + next), icallSummaryPath ); Runner.RunManagedProgram(exe, args); HashSet <UnityType> nativeClasses; HashSet <string> nativeModules; CodeStrippingUtils.GenerateDependencies(Path.GetDirectoryName(stagingAreaDataManaged), icallSummaryPath, usedClassRegistry, stripping, out nativeClasses, out nativeModules, platformProvider); using (TextWriter w = new StreamWriter(file)) { string[] fileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblies = checker.GetAssemblyDefinitions(); bool fastICall = (crossCompileOptions & CrossCompileOptions.FastICall) != 0; ArrayList nativeMethods = BuildNativeMethodList(assemblies); if (buildTarget == BuildTarget.iOS) { w.WriteLine("#include \"RegisterMonoModules.h\""); w.WriteLine("#include <stdio.h>"); } w.WriteLine(""); w.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); w.WriteLine(" #define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); w.WriteLine(" #define REGISTER_USER_FUNC(f)\\"); w.WriteLine(" do {\\"); w.WriteLine(" if(f != NULL)\\"); w.WriteLine(" mono_dl_register_symbol(#f, (void*)f);\\"); w.WriteLine(" else\\"); w.WriteLine(" ::printf_console(\"Symbol \'%s\' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); w.WriteLine(" }while(0)"); w.WriteLine("#else"); w.WriteLine(" #define DECL_USER_FUNC(f) void f() "); w.WriteLine(" #if !defined(__arm64__)"); w.WriteLine(" #define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); w.WriteLine(" #else"); w.WriteLine(" #define REGISTER_USER_FUNC(f)"); w.WriteLine(" #endif"); w.WriteLine("#endif"); w.WriteLine("extern \"C\"\n{"); w.WriteLine(" typedef void* gpointer;"); w.WriteLine(" typedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { w.WriteLine(" const char* UnityIPhoneRuntimeVersion = \"{0}\";", Application.unityVersion); w.WriteLine(" void mono_dl_register_symbol (const char* name, void *addr);"); w.WriteLine("#if !defined(__arm64__)"); w.WriteLine(" extern int mono_ficall_flag;"); w.WriteLine("#endif"); } w.WriteLine(" void mono_aot_register_module(gpointer *aot_info);"); w.WriteLine("#if __ORBIS__ || SN_TARGET_PSP2"); w.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); // ps4 and psp2 need dllexport. w.WriteLine("#else"); w.WriteLine("#define DLL_EXPORT"); w.WriteLine("#endif"); w.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); w.WriteLine(" extern gboolean mono_aot_only;"); for (int q = 0; q < fileNames.Length; ++q) { string fileName = fileNames[q]; string assemblyName = assemblies[q].Name.Name; assemblyName = assemblyName.Replace(".", "_"); assemblyName = assemblyName.Replace("-", "_"); assemblyName = assemblyName.Replace(" ", "_"); w.WriteLine(" extern gpointer* mono_aot_module_{0}_info; // {1}", assemblyName, fileName); } w.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); foreach (string nmethod in nativeMethods) { w.WriteLine(" DECL_USER_FUNC({0});", nmethod); } w.WriteLine("}"); w.WriteLine("DLL_EXPORT void RegisterMonoModules()"); w.WriteLine("{"); w.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); w.WriteLine(" mono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) { w.WriteLine(" mono_ficall_flag = {0};", fastICall ? "true" : "false"); } foreach (AssemblyDefinition definition in assemblies) { string assemblyName = definition.Name.Name; assemblyName = assemblyName.Replace(".", "_"); assemblyName = assemblyName.Replace("-", "_"); assemblyName = assemblyName.Replace(" ", "_"); w.WriteLine(" mono_aot_register_module(mono_aot_module_{0}_info);", assemblyName); } w.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); w.WriteLine(""); if (buildTarget == BuildTarget.iOS) { foreach (string nmethod in nativeMethods) { w.WriteLine(" REGISTER_USER_FUNC({0});", nmethod); } } w.WriteLine("}"); w.WriteLine(""); if (buildTarget == BuildTarget.iOS) { var inputAssemblies = new List <AssemblyDefinition>(); for (int i = 0; i < assemblies.Length; i++) { if (AssemblyHelper.IsUnityEngineModule(assemblies[i])) { inputAssemblies.Add(assemblies[i]); } } GenerateRegisterInternalCalls(inputAssemblies.ToArray(), w); GenerateRegisterModules(nativeClasses, nativeModules, w, stripping); if (stripping && usedClassRegistry != null) { GenerateRegisterClassesForStripping(nativeClasses, w); } else { GenerateRegisterClasses(nativeClasses, w); } } w.Close(); } }
private void SetPermissionAttributes(PostProcessorContext context, AndroidManifest manifestXML, AssemblyReferenceChecker checker) { if ((this._developmentPlayer || PlayerSettings.Android.forceInternetPermission) || this.doesReferenceNetworkClasses(checker)) { manifestXML.AddUsesPermission("android.permission.INTERNET"); } if (checker.HasReferenceToMethod("UnityEngine.Handheld::Vibrate")) { manifestXML.AddUsesPermission("android.permission.VIBRATE"); } if (checker.HasReferenceToMethod("UnityEngine.iPhoneSettings::get_internetReachability") || checker.HasReferenceToMethod("UnityEngine.Application::get_internetReachability")) { manifestXML.AddUsesPermission("android.permission.ACCESS_NETWORK_STATE"); } if (((checker.HasReferenceToMethod("UnityEngine.Input::get_location") || checker.HasReferenceToMethod("UnityEngine.iPhoneInput::get_lastLocation")) || (checker.HasReferenceToMethod("UnityEngine.iPhoneSettings::get_locationServiceStatus") || checker.HasReferenceToMethod("UnityEngine.iPhoneSettings::get_locationServiceEnabledByUser"))) || (checker.HasReferenceToMethod("UnityEngine.iPhoneSettings::StartLocationServiceUpdates") || checker.HasReferenceToMethod("UnityEngine.iPhoneSettings::StopLocationServiceUpdates"))) { manifestXML.AddUsesPermission("android.permission.ACCESS_FINE_LOCATION"); manifestXML.AddUsesFeature("android.hardware.location.gps", false); manifestXML.AddUsesFeature("android.hardware.location", false); } if (checker.HasReferenceToType("UnityEngine.WebCamTexture")) { manifestXML.AddUsesPermission("android.permission.CAMERA"); manifestXML.AddUsesFeature("android.hardware.camera", false); manifestXML.AddUsesFeature("android.hardware.camera.autofocus", false); manifestXML.AddUsesFeature("android.hardware.camera.front", false); } if (checker.HasReferenceToType("UnityEngine.Microphone")) { manifestXML.AddUsesPermission("android.permission.RECORD_AUDIO"); manifestXML.AddUsesFeature("android.hardware.microphone", false); } if (PlayerSettings.Android.forceSDCardPermission) { manifestXML.AddUsesPermission("android.permission.WRITE_EXTERNAL_STORAGE"); } else if (this._developmentPlayer) { manifestXML.AddUsesPermission("android.permission.WRITE_EXTERNAL_STORAGE", 0x12); manifestXML.AddUsesPermission("android.permission.READ_EXTERNAL_STORAGE", 0x12); } if ((checker.HasReferenceToMethod("UnityEngine.Input::get_acceleration") || checker.HasReferenceToMethod("UnityEngine.Input::GetAccelerationEvent")) || (checker.HasReferenceToMethod("UnityEngine.Input::get_accelerationEvents") || checker.HasReferenceToMethod("UnityEngine.Input::get_accelerationEventCount"))) { manifestXML.AddUsesFeature("android.hardware.sensor.accelerometer", false); } manifestXML.AddUsesFeature("android.hardware.touchscreen", false); if (((checker.HasReferenceToMethod("UnityEngine.Input::get_touches") || checker.HasReferenceToMethod("UnityEngine.Input::GetTouch")) || (checker.HasReferenceToMethod("UnityEngine.Input::get_touchCount") || checker.HasReferenceToMethod("UnityEngine.Input::get_multiTouchEnabled"))) || (((checker.HasReferenceToMethod("UnityEngine.Input::set_multiTouchEnabled") || checker.HasReferenceToMethod("UnityEngine.iPhoneInput::get_touches")) || (checker.HasReferenceToMethod("UnityEngine.iPhoneInput::GetTouch") || checker.HasReferenceToMethod("UnityEngine.iPhoneInput::get_touchCount"))) || (checker.HasReferenceToMethod("UnityEngine.iPhoneInput::get_multiTouchEnabled") || checker.HasReferenceToMethod("UnityEngine.iPhoneInput::set_multiTouchEnabled")))) { manifestXML.AddUsesFeature("android.hardware.touchscreen.multitouch", false); manifestXML.AddUsesFeature("android.hardware.touchscreen.multitouch.distinct", false); } if ((checker.HasReferenceToMethod("UnityEngine.iPhoneInput::get_acceleration") || checker.HasReferenceToMethod("UnityEngine.iPhoneInput::GetAccelerationEvent")) || (checker.HasReferenceToMethod("UnityEngine.iPhoneInput::get_accelerationEvents") || checker.HasReferenceToMethod("UnityEngine.iPhoneInput::get_accelerationEventCount"))) { manifestXML.AddUsesFeature("android.hardware.sensor.accelerometer", false); } if (checker.HasReferenceToMethod("UnityEngine.iPhoneUtils::Vibrate")) { manifestXML.AddUsesPermission("android.permission.VIBRATE"); } }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker) { using (TextWriter textWriter = new StreamWriter(file)) { string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic; ArrayList arrayList = MonoAOTRegistration.BuildNativeMethodList(assemblyDefinitions); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine("#include \"RegisterMonoModules.h\""); textWriter.WriteLine("#include <stdio.h>"); } textWriter.WriteLine(string.Empty); textWriter.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); textWriter.WriteLine("\t#define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); textWriter.WriteLine("\t#define REGISTER_USER_FUNC(f)\\"); textWriter.WriteLine("\t\tdo {\\"); textWriter.WriteLine("\t\tif(f != NULL)\\"); textWriter.WriteLine("\t\t\tmono_dl_register_symbol(#f, (void*)f);\\"); textWriter.WriteLine("\t\telse\\"); textWriter.WriteLine("\t\t\t::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); textWriter.WriteLine("\t\t}while(0)"); textWriter.WriteLine("#else"); textWriter.WriteLine("\t#define DECL_USER_FUNC(f) void f() "); textWriter.WriteLine("\t#if !defined(__arm64__)"); textWriter.WriteLine("\t#define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); textWriter.WriteLine("\t#else"); textWriter.WriteLine("\t\t#define REGISTER_USER_FUNC(f)"); textWriter.WriteLine("\t#endif"); textWriter.WriteLine("#endif"); textWriter.WriteLine("extern \"C\"\n{"); textWriter.WriteLine("\ttypedef void* gpointer;"); textWriter.WriteLine("\ttypedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine("\tconst char*\t\t\tUnityIPhoneRuntimeVersion = \"{0}\";", Application.unityVersion); textWriter.WriteLine("\tvoid\t\t\t\tmono_dl_register_symbol (const char* name, void *addr);"); textWriter.WriteLine("#if !defined(__arm64__)"); textWriter.WriteLine("\textern int\t\t\tmono_ficall_flag;"); textWriter.WriteLine("#endif"); } textWriter.WriteLine("\tvoid\t\t\t\tmono_aot_register_module(gpointer *aot_info);"); textWriter.WriteLine("#if !(__ORBIS__)"); textWriter.WriteLine("#define DLL_EXPORT"); textWriter.WriteLine("#else"); textWriter.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); textWriter.WriteLine("#endif"); textWriter.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); textWriter.WriteLine("\textern gboolean\t\tmono_aot_only;"); for (int i = 0; i < assemblyFileNames.Length; i++) { string arg = assemblyFileNames[i]; string text = assemblyDefinitions[i].Name.Name; text = text.Replace(".", "_"); text = text.Replace("-", "_"); text = text.Replace(" ", "_"); textWriter.WriteLine("\textern gpointer*\tmono_aot_module_{0}_info; // {1}", text, arg); } textWriter.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); foreach (string arg2 in arrayList) { textWriter.WriteLine("\tDECL_USER_FUNC({0});", arg2); } textWriter.WriteLine("}"); textWriter.WriteLine("DLL_EXPORT void RegisterMonoModules()"); textWriter.WriteLine("{"); textWriter.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); textWriter.WriteLine("\tmono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine("\tmono_ficall_flag = {0};", (!flag) ? "false" : "true"); } AssemblyDefinition[] array = assemblyDefinitions; for (int j = 0; j < array.Length; j++) { AssemblyDefinition assemblyDefinition = array[j]; string text2 = assemblyDefinition.Name.Name; text2 = text2.Replace(".", "_"); text2 = text2.Replace("-", "_"); text2 = text2.Replace(" ", "_"); textWriter.WriteLine("\tmono_aot_register_module(mono_aot_module_{0}_info);", text2); } textWriter.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); textWriter.WriteLine(string.Empty); if (buildTarget == BuildTarget.iOS) { foreach (string arg3 in arrayList) { textWriter.WriteLine("\tREGISTER_USER_FUNC({0});", arg3); } } textWriter.WriteLine("}"); textWriter.WriteLine(string.Empty); AssemblyDefinition assemblyDefinition2 = null; for (int k = 0; k < assemblyFileNames.Length; k++) { if (assemblyFileNames[k] == "UnityEngine.dll") { assemblyDefinition2 = assemblyDefinitions[k]; } } if (buildTarget == BuildTarget.iOS) { AssemblyDefinition[] assemblies = new AssemblyDefinition[] { assemblyDefinition2 }; MonoAOTRegistration.GenerateRegisterInternalCalls(assemblies, textWriter); MonoAOTRegistration.ResolveDefinedNativeClassesFromMono(assemblies, usedClassRegistry); MonoAOTRegistration.ResolveReferencedUnityEngineClassesFromMono(assemblyDefinitions, assemblyDefinition2, usedClassRegistry); if (stripping && usedClassRegistry != null) { MonoAOTRegistration.GenerateRegisterClassesForStripping(usedClassRegistry, textWriter); } else { MonoAOTRegistration.GenerateRegisterClasses(usedClassRegistry, textWriter); } } textWriter.Close(); } }
private bool doesReferenceNetworkClasses(AssemblyReferenceChecker checker) { return ((((checker.HasReferenceToType("UnityEngine.Networking") || checker.HasReferenceToType("System.Net.Sockets")) || (checker.HasReferenceToType("UnityEngine.Network") || checker.HasReferenceToType("UnityEngine.RPC"))) || (checker.HasReferenceToType("UnityEngine.WWW") || checker.HasReferenceToType(typeof(Ping).FullName))) || checker.HasReferenceToType(typeof(UnityWebRequest).FullName)); }
public static void GenerateDependencies(string strippedAssemblyDir, string icallsListFile, RuntimeClassRegistry rcr, bool doStripping, out HashSet <UnityType> nativeClasses, out HashSet <string> nativeModules, IIl2CppPlatformProvider platformProvider) { if (AssemblyStripper.UseUnityLinkerEngineModuleStripping) { GenerateDependencies2(strippedAssemblyDir, doStripping, out nativeClasses, out nativeModules); return; } var strippingInfo = platformProvider == null ? null : StrippingInfo.GetBuildReportData(platformProvider.buildReport); var userAssemblies = GetUserAssemblies(strippedAssemblyDir); // [1] Extract native classes from scene and scripts nativeClasses = doStripping ? GenerateNativeClassList(rcr, strippedAssemblyDir, userAssemblies, strippingInfo) : null; // Exclude module managers (GlobalGameManager) if no dependent classes are used. if (nativeClasses != null) { ExcludeModuleManagers(ref nativeClasses); } // [2] Prepare a list of modules to register nativeModules = GetNativeModulesToRegister(nativeClasses, strippingInfo); if (nativeClasses != null && icallsListFile != null) { // Get required modules from icall list file var icallModules = GetModulesFromICalls(icallsListFile); // Add GameManager classes for modules foreach (var module in icallModules) { if (!nativeModules.Contains(module)) { if (strippingInfo != null) { strippingInfo.RegisterDependency(StrippingInfo.ModuleName(module), StrippingInfo.RequiredByScripts); } } var moduleClasses = ModuleMetadata.GetModuleTypes(module); foreach (var klass in moduleClasses) { if (klass.IsDerivedFrom(GameManagerTypeInfo)) { nativeClasses.Add(klass); } } } nativeModules.UnionWith(icallModules); } ApplyManualStrippingOverrides(nativeClasses, nativeModules, strippingInfo); bool didAdd = true; if (platformProvider != null) { while (didAdd) { didAdd = false; foreach (var module in nativeModules.ToList()) { var dependecies = ModuleMetadata.GetModuleDependencies(module); foreach (var dependentModule in dependecies) { if (!nativeModules.Contains(dependentModule)) { nativeModules.Add(dependentModule); didAdd = true; } if (strippingInfo != null) { var moduleName = StrippingInfo.ModuleName(module); strippingInfo.RegisterDependency(StrippingInfo.ModuleName(dependentModule), "Required by " + moduleName); strippingInfo.SetIcon("Required by " + moduleName, $"package/com.unity.modules.{module.ToLower()}"); } } } } } if (nativeClasses != null) { RemoveClassesFromRemovedModules(nativeClasses, nativeModules); } AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); checker.CollectReferencesFromRoots(strippedAssemblyDir, userAssemblies, true, 0.0f, true); if (strippingInfo != null) { foreach (var module in nativeModules) { strippingInfo.AddModule(module); } strippingInfo.AddModule("Core"); } if (nativeClasses != null && strippingInfo != null && platformProvider != null) { InjectCustomDependencies(platformProvider.target, strippingInfo, nativeClasses, nativeModules); } }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker) { using (TextWriter writer = new StreamWriter(file)) { string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic; ArrayList list = BuildNativeMethodList(assemblyDefinitions); if (buildTarget == BuildTarget.iOS) { writer.WriteLine("#include \"RegisterMonoModules.h\""); writer.WriteLine("#include <stdio.h>"); } writer.WriteLine(string.Empty); writer.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); writer.WriteLine("\t#define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); writer.WriteLine("\t#define REGISTER_USER_FUNC(f)\\"); writer.WriteLine("\t\tdo {\\"); writer.WriteLine("\t\tif(f != NULL)\\"); writer.WriteLine("\t\t\tmono_dl_register_symbol(#f, (void*)f);\\"); writer.WriteLine("\t\telse\\"); writer.WriteLine("\t\t\t::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); writer.WriteLine("\t\t}while(0)"); writer.WriteLine("#else"); writer.WriteLine("\t#define DECL_USER_FUNC(f) void f() "); writer.WriteLine("\t#if !defined(__arm64__)"); writer.WriteLine("\t#define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); writer.WriteLine("\t#else"); writer.WriteLine("\t\t#define REGISTER_USER_FUNC(f)"); writer.WriteLine("\t#endif"); writer.WriteLine("#endif"); writer.WriteLine("extern \"C\"\n{"); writer.WriteLine("\ttypedef void* gpointer;"); writer.WriteLine("\ttypedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { writer.WriteLine("\tconst char*\t\t\tUnityIPhoneRuntimeVersion = \"{0}\";", Application.unityVersion); writer.WriteLine("\tvoid\t\t\t\tmono_dl_register_symbol (const char* name, void *addr);"); writer.WriteLine("#if !defined(__arm64__)"); writer.WriteLine("\textern int\t\t\tmono_ficall_flag;"); writer.WriteLine("#endif"); } writer.WriteLine("\tvoid\t\t\t\tmono_aot_register_module(gpointer *aot_info);"); writer.WriteLine("#if !(__ORBIS__)"); writer.WriteLine("#define DLL_EXPORT"); writer.WriteLine("#else"); writer.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); writer.WriteLine("#endif"); writer.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); writer.WriteLine("\textern gboolean\t\tmono_aot_only;"); for (int i = 0; i < assemblyFileNames.Length; i++) { string str = assemblyFileNames[i]; string str2 = assemblyDefinitions[i].Name.Name.Replace(".", "_").Replace("-", "_").Replace(" ", "_"); writer.WriteLine("\textern gpointer*\tmono_aot_module_{0}_info; // {1}", str2, str); } writer.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); IEnumerator enumerator = list.GetEnumerator(); try { while (enumerator.MoveNext()) { string current = (string)enumerator.Current; writer.WriteLine("\tDECL_USER_FUNC({0});", current); } } finally { IDisposable disposable = enumerator as IDisposable; if (disposable == null) { } disposable.Dispose(); } writer.WriteLine("}"); writer.WriteLine("DLL_EXPORT void RegisterMonoModules()"); writer.WriteLine("{"); writer.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); writer.WriteLine("\tmono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) { writer.WriteLine("\tmono_ficall_flag = {0};", !flag ? "false" : "true"); } foreach (AssemblyDefinition definition in assemblyDefinitions) { string str4 = definition.Name.Name.Replace(".", "_").Replace("-", "_").Replace(" ", "_"); writer.WriteLine("\tmono_aot_register_module(mono_aot_module_{0}_info);", str4); } writer.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); writer.WriteLine(string.Empty); if (buildTarget == BuildTarget.iOS) { IEnumerator enumerator2 = list.GetEnumerator(); try { while (enumerator2.MoveNext()) { string str5 = (string)enumerator2.Current; writer.WriteLine("\tREGISTER_USER_FUNC({0});", str5); } } finally { IDisposable disposable2 = enumerator2 as IDisposable; if (disposable2 == null) { } disposable2.Dispose(); } } writer.WriteLine("}"); writer.WriteLine(string.Empty); AssemblyDefinition unityEngine = null; for (int j = 0; j < assemblyFileNames.Length; j++) { if (assemblyFileNames[j] == "UnityEngine.dll") { unityEngine = assemblyDefinitions[j]; } } if (buildTarget == BuildTarget.iOS) { AssemblyDefinition[] assemblies = new AssemblyDefinition[] { unityEngine }; GenerateRegisterInternalCalls(assemblies, writer); ResolveDefinedNativeClassesFromMono(assemblies, usedClassRegistry); ResolveReferencedUnityEngineClassesFromMono(assemblyDefinitions, unityEngine, usedClassRegistry); GenerateRegisterModules(usedClassRegistry, writer, stripping); if (stripping && (usedClassRegistry != null)) { GenerateRegisterClassesForStripping(usedClassRegistry, writer); } else { GenerateRegisterClasses(usedClassRegistry, writer); } } writer.Close(); } }
private static HashSet<string> CollectManagedTypeReferencesFromRoots(string directory, string[] rootAssemblies) { HashSet<string> stringSet = new HashSet<string>(); AssemblyReferenceChecker referenceChecker = new AssemblyReferenceChecker(); bool withMethods = false; bool ignoreSystemDlls = false; referenceChecker.CollectReferencesFromRoots(directory, (IEnumerable<string>) rootAssemblies, withMethods, 0.0f, ignoreSystemDlls); string[] assemblyFileNames = referenceChecker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = referenceChecker.GetAssemblyDefinitions(); foreach (AssemblyDefinition assemblyDefinition in assemblyDefinitions) { using (Collection<TypeDefinition>.Enumerator enumerator = assemblyDefinition.get_MainModule().get_Types().GetEnumerator()) { // ISSUE: explicit reference operation while (((Collection<TypeDefinition>.Enumerator) @enumerator).MoveNext()) { // ISSUE: explicit reference operation TypeDefinition current = ((Collection<TypeDefinition>.Enumerator) @enumerator).get_Current(); if (((TypeReference) current).get_Namespace().StartsWith("UnityEngine") && (current.get_Fields().get_Count() > 0 || current.get_Methods().get_Count() > 0 || current.get_Properties().get_Count() > 0)) { string name = ((TypeReference) current).get_Name(); stringSet.Add(name); } } } } AssemblyDefinition assemblyDefinition1 = (AssemblyDefinition) null; for (int index = 0; index < assemblyFileNames.Length; ++index) { if (assemblyFileNames[index] == "UnityEngine.dll") assemblyDefinition1 = assemblyDefinitions[index]; } foreach (AssemblyDefinition assemblyDefinition2 in assemblyDefinitions) { if (assemblyDefinition2 != assemblyDefinition1) { using (IEnumerator<TypeReference> enumerator = assemblyDefinition2.get_MainModule().GetTypeReferences().GetEnumerator()) { while (((IEnumerator) enumerator).MoveNext()) { TypeReference current = enumerator.Current; if (current.get_Namespace().StartsWith("UnityEngine")) { string name = current.get_Name(); stringSet.Add(name); } } } } } return stringSet; }
internal static void PostProcess(BuildTarget target, string stagingAreaDataUpperCase, string stagingArea, string stagingAreaDataManaged, string playerPackage, string installPath, string companyName, string productName, BuildOptions options) { bool flag = (options & BuildOptions.AutoRunPlayer) != BuildOptions.CompressTextures; bool developmentPlayer = (options & BuildOptions.Development) != BuildOptions.CompressTextures; float numSteps = !flag ? ((float) 2) : ((float) 5); progress.Reset(numSteps); if (PlayerSettings.Tizen.deploymentTargetType == 2) { flag = false; } Regex regex = new Regex("[^a-zA-Z_-]"); string normalizedProductName = regex.Replace(productName, "").ToLower(); string str2 = Path.Combine(playerPackage, "assets"); if (!IsValidTizenBundleIdentifier(PlayerSettings.bundleIdentifier)) { string message = "Please set the Bundle Identifier in the Player Settings."; message = (message + " The value must follow the convention 'com.YourCompanyName.YourProductName'") + " and can contain alphanumeric characters and underscore." + "\nEach segment must not start with a numeric character or underscore."; Selection.activeObject = Unsupported.GetSerializedAssetInterfaceSingleton("PlayerSettings"); TizenUtilities.ShowErrDlgAndThrow("Bundle Identifier has not been set up correctly", message); } TizenUtilities.PrepareToolPaths(); TizenUtilities.ValidateSigningProfile(stagingArea); if (flag) { TizenUtilities.AssertAnyDeviceReady(new Command.WaitingForProcessToExit(new Progress("Tizen Device Detection", "Detecting attached devices", progress.Get()).Show)); } Directory.CreateDirectory(Path.Combine(stagingArea, "lib")); Directory.CreateDirectory(Path.Combine(stagingArea, "res")); Directory.CreateDirectory(Path.Combine(stagingArea, "setting")); string path = Path.Combine(stagingArea, "shared"); Directory.CreateDirectory(path); string str8 = Path.Combine(path, "res"); Directory.CreateDirectory(str8); string destDirName = Path.Combine(str8, "data"); string dst = Path.Combine(str8, "app_icon.png"); FileUtil.MoveFileIfExists(Path.Combine(stagingArea, "app_icon.png"), dst); if (!PlayerSettings.SplashScreen.show) { string str11 = Path.Combine(str8, "app_splash.png"); FileUtil.MoveFileIfExists(Path.Combine(stagingArea, "app_splash.png"), str11); if (!File.Exists(str11)) { FileUtil.CopyFileOrDirectory(playerPackage + "/assets/splash.png", str11); } } Directory.CreateDirectory(Path.Combine(path, "trusted")); Directory.Move(stagingAreaDataUpperCase, destDirName + "2"); Directory.Move(destDirName + "2", destDirName); if (!File.Exists(dst)) { FileUtil.CopyFileOrDirectory(str2 + "/icon.png", dst); } Directory.CreateDirectory(Path.Combine(destDirName, "Managed/mono/2.0")); FileUtil.CopyFileOrDirectory(playerPackage + "/Data/Resources/unity default resources", destDirName + "/unity default resources"); Directory.CreateDirectory(Path.Combine(stagingArea, "data")); string str14 = Path.Combine(stagingArea, "lib"); Directory.CreateDirectory(str14); foreach (PluginImporter importer in PluginImporter.GetImporters(target)) { string fileName = Path.GetFileName(importer.assetPath); FileUtil.UnityFileCopy(importer.assetPath, Path.Combine(str14, fileName)); } if (Directory.Exists("Assets/StreamingAssets")) { FileUtil.CopyDirectoryRecursive("Assets/StreamingAssets", Path.Combine(destDirName, "Raw"), true, true); } AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); bool collectMethods = true; bool ignoreSystemDlls = true; string[] components = new string[] { destDirName, "Managed" }; string str16 = Paths.Combine(components); checker.CollectReferences(str16, collectMethods, 0f, ignoreSystemDlls); string bundleIdentifier = PlayerSettings.bundleIdentifier; CreateManifest(Path.Combine(stagingArea, "tizen-manifest.xml"), companyName, productName, normalizedProductName, bundleIdentifier, checker); CreateProject(stagingArea); PackageTargets(PlayerSettings.Tizen.deploymentTargetType, installPath, playerPackage, stagingArea, developmentPlayer, normalizedProductName); if (flag) { progress.Step("Installing", EditorGUIUtility.TextContent("Installing application on device...").text); if (TizenUtilities.InstallTpkPackage(bundleIdentifier + "-" + GetValidVersionString() + "-arm.tpk")) { if (developmentPlayer) { progress.Step("Port Forwarding", EditorGUIUtility.TextContent("Setting up profiler tunnel...").text); TizenUtilities.ForwardPort(ProfilerDriver.directConnectionPort, "55000"); } progress.Step("Launching", EditorGUIUtility.TextContent("Launching application on device...").text); TizenUtilities.LaunchTpkPackage(bundleIdentifier, stagingArea); } } }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker, string stagingAreaDataManaged) { HashSet<UnityType> set; HashSet<string> set2; string str = Path.Combine(stagingAreaDataManaged, "ICallSummary.txt"); string exe = Path.Combine(MonoInstallationFinder.GetFrameWorksFolder(), "Tools/InternalCallRegistrationWriter/InternalCallRegistrationWriter.exe"); string args = string.Format("-assembly=\"{0}\" -summary=\"{1}\"", Path.Combine(stagingAreaDataManaged, "UnityEngine.dll"), str); Runner.RunManagedProgram(exe, args); CodeStrippingUtils.GenerateDependencies(Path.GetDirectoryName(stagingAreaDataManaged), str, usedClassRegistry, stripping, out set, out set2, null); using (TextWriter writer = new StreamWriter(file)) { string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic; ArrayList list = BuildNativeMethodList(assemblyDefinitions); if (buildTarget == BuildTarget.iOS) { writer.WriteLine("#include \"RegisterMonoModules.h\""); writer.WriteLine("#include <stdio.h>"); } writer.WriteLine(""); writer.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); writer.WriteLine(" #define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); writer.WriteLine(@" #define REGISTER_USER_FUNC(f)\"); writer.WriteLine(@" do {\"); writer.WriteLine(@" if(f != NULL)\"); writer.WriteLine(@" mono_dl_register_symbol(#f, (void*)f);\"); writer.WriteLine(@" else\"); writer.WriteLine(" ::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); writer.WriteLine(" }while(0)"); writer.WriteLine("#else"); writer.WriteLine(" #define DECL_USER_FUNC(f) void f() "); writer.WriteLine(" #if !defined(__arm64__)"); writer.WriteLine(" #define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); writer.WriteLine(" #else"); writer.WriteLine(" #define REGISTER_USER_FUNC(f)"); writer.WriteLine(" #endif"); writer.WriteLine("#endif"); writer.WriteLine("extern \"C\"\n{"); writer.WriteLine(" typedef void* gpointer;"); writer.WriteLine(" typedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { writer.WriteLine(" const char* UnityIPhoneRuntimeVersion = \"{0}\";", Application.unityVersion); writer.WriteLine(" void mono_dl_register_symbol (const char* name, void *addr);"); writer.WriteLine("#if !defined(__arm64__)"); writer.WriteLine(" extern int mono_ficall_flag;"); writer.WriteLine("#endif"); } writer.WriteLine(" void mono_aot_register_module(gpointer *aot_info);"); writer.WriteLine("#if __ORBIS__ || SN_TARGET_PSP2"); writer.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); writer.WriteLine("#else"); writer.WriteLine("#define DLL_EXPORT"); writer.WriteLine("#endif"); writer.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); writer.WriteLine(" extern gboolean mono_aot_only;"); for (int i = 0; i < assemblyFileNames.Length; i++) { string str4 = assemblyFileNames[i]; string str5 = assemblyDefinitions[i].Name.Name.Replace(".", "_").Replace("-", "_").Replace(" ", "_"); writer.WriteLine(" extern gpointer* mono_aot_module_{0}_info; // {1}", str5, str4); } writer.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); IEnumerator enumerator = list.GetEnumerator(); try { while (enumerator.MoveNext()) { string current = (string) enumerator.Current; writer.WriteLine(" DECL_USER_FUNC({0});", current); } } finally { IDisposable disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } writer.WriteLine("}"); writer.WriteLine("DLL_EXPORT void RegisterMonoModules()"); writer.WriteLine("{"); writer.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); writer.WriteLine(" mono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) { writer.WriteLine(" mono_ficall_flag = {0};", !flag ? "false" : "true"); } foreach (AssemblyDefinition definition in assemblyDefinitions) { string str7 = definition.Name.Name.Replace(".", "_").Replace("-", "_").Replace(" ", "_"); writer.WriteLine(" mono_aot_register_module(mono_aot_module_{0}_info);", str7); } writer.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); writer.WriteLine(""); if (buildTarget == BuildTarget.iOS) { IEnumerator enumerator2 = list.GetEnumerator(); try { while (enumerator2.MoveNext()) { string str8 = (string) enumerator2.Current; writer.WriteLine(" REGISTER_USER_FUNC({0});", str8); } } finally { IDisposable disposable2 = enumerator2 as IDisposable; if (disposable2 != null) { disposable2.Dispose(); } } } writer.WriteLine("}"); writer.WriteLine(""); AssemblyDefinition unityEngine = null; for (int j = 0; j < assemblyFileNames.Length; j++) { if (assemblyFileNames[j] == "UnityEngine.dll") { unityEngine = assemblyDefinitions[j]; } } if (buildTarget == BuildTarget.iOS) { AssemblyDefinition[] assemblies = new AssemblyDefinition[] { unityEngine }; GenerateRegisterInternalCalls(assemblies, writer); ResolveDefinedNativeClassesFromMono(assemblies, usedClassRegistry); ResolveReferencedUnityEngineClassesFromMono(assemblyDefinitions, unityEngine, usedClassRegistry); GenerateRegisterModules(set, set2, writer, stripping); if (stripping && (usedClassRegistry != null)) { GenerateRegisterClassesForStripping(set, writer); } else { GenerateRegisterClasses(set, writer); } } writer.Close(); } }
private static HashSet <string> CollectManagedTypeReferencesFromRoots(string directory, string[] rootAssemblies, StrippingInfo strippingInfo) { HashSet <string> hashSet = new HashSet <string>(); AssemblyReferenceChecker assemblyReferenceChecker = new AssemblyReferenceChecker(); bool collectMethods = false; bool ignoreSystemDlls = false; assemblyReferenceChecker.CollectReferencesFromRoots(directory, rootAssemblies, collectMethods, 0f, ignoreSystemDlls); string[] assemblyFileNames = assemblyReferenceChecker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = assemblyReferenceChecker.GetAssemblyDefinitions(); AssemblyDefinition[] array = assemblyDefinitions; for (int i = 0; i < array.Length; i++) { AssemblyDefinition assemblyDefinition = array[i]; using (Collection <TypeDefinition> .Enumerator enumerator = assemblyDefinition.get_MainModule().get_Types().GetEnumerator()) { while (enumerator.MoveNext()) { TypeDefinition current = enumerator.get_Current(); if (current.get_Namespace().StartsWith("UnityEngine")) { if (current.get_Fields().get_Count() > 0 || current.get_Methods().get_Count() > 0 || current.get_Properties().get_Count() > 0) { string name = current.get_Name(); hashSet.Add(name); if (strippingInfo != null) { string name2 = assemblyDefinition.get_Name().get_Name(); if (!AssemblyReferenceChecker.IsIgnoredSystemDll(name2)) { strippingInfo.RegisterDependency(name, "Required by Scripts"); } } } } } } } AssemblyDefinition assemblyDefinition2 = null; for (int j = 0; j < assemblyFileNames.Length; j++) { if (assemblyFileNames[j] == "UnityEngine.dll") { assemblyDefinition2 = assemblyDefinitions[j]; } } AssemblyDefinition[] array2 = assemblyDefinitions; for (int k = 0; k < array2.Length; k++) { AssemblyDefinition assemblyDefinition3 = array2[k]; if (assemblyDefinition3 != assemblyDefinition2) { foreach (TypeReference current2 in assemblyDefinition3.get_MainModule().GetTypeReferences()) { if (current2.get_Namespace().StartsWith("UnityEngine")) { string name3 = current2.get_Name(); hashSet.Add(name3); if (strippingInfo != null) { string name4 = assemblyDefinition3.get_Name().get_Name(); if (!AssemblyReferenceChecker.IsIgnoredSystemDll(name4)) { strippingInfo.RegisterDependency(name3, "Required by Scripts"); } } } } } } return(hashSet); }
private string PatchManifest(PostProcessorContext context, string manifest) { BuildTarget platform = context.Get<BuildTarget>("BuildTarget"); string[] components = new string[] { this._stagingArea, "assets", "bin" }; string str = Paths.Combine(components); AndroidManifest manifestXML = new AndroidManifest(manifest); string location = this.PreferredInstallLocationAsString(); manifestXML.SetInstallLocation(location); manifestXML.SetDebuggable(this._developmentPlayer || Unsupported.IsDeveloperBuild()); int minSdkVersion = (int) PlayerSettings.Android.minSdkVersion; string glEsVersion = "0x00020000"; GraphicsDeviceType[] graphicsAPIs = PlayerSettings.GetGraphicsAPIs(platform); if (Enumerable.Contains<GraphicsDeviceType>(graphicsAPIs, GraphicsDeviceType.OpenGLES3) && (minSdkVersion >= 0x12)) { glEsVersion = "0x00030000"; } if (Enumerable.Contains<GraphicsDeviceType>(graphicsAPIs, GraphicsDeviceType.OpenGLES2)) { glEsVersion = "0x00020000"; } if ((glEsVersion == "0x00030000") && (PlayerSettings.openGLRequireES31 || PlayerSettings.openGLRequireES31AEP)) { glEsVersion = "0x00030001"; } manifestXML.AddGLESVersion(glEsVersion); if ((glEsVersion == "0x00030001") && PlayerSettings.openGLRequireES31AEP) { manifestXML.AddUsesFeature("android.hardware.opengles.aep", true); } if (EditorUserBuildSettings.androidBuildSubtarget != MobileTextureSubtarget.Generic) { this.CreateSupportsTextureElem(manifestXML, EditorUserBuildSettings.androidBuildSubtarget); } HashSet<string> set = new HashSet<string>(this.GetActivitiesWithMetadata(manifestXML, "unityplayer.UnityActivity", "true")); string[] other = new string[] { "com.unity3d.player.UnityPlayerNativeActivity", "com.unity3d.player.UnityPlayerActivity", "com.unity3d.player.UnityPlayerProxyActivity" }; set.UnionWith(other); string orientationAttr = this.GetOrientationAttr(); bool flag = false; foreach (string str5 in set) { flag = manifestXML.SetOrientation(str5, orientationAttr) || flag; flag = manifestXML.SetLaunchMode(str5, "singleTask") || flag; flag = manifestXML.SetConfigChanges(str5, AndroidManifest.AndroidConfigChanges) || flag; } if (!flag) { Debug.LogWarning(string.Format("Unable to find unity activity in manifest. You need to make sure orientation attribute is set to {0} manually.", orientationAttr)); } manifestXML.SetApplicationFlag("isGame", PlayerSettings.Android.androidIsGame); if (PlayerSettings.Android.androidBannerEnabled) { manifestXML.SetApplicationBanner("@drawable/app_banner"); } if ((PlayerSettings.Android.androidTVCompatibility && !manifestXML.HasLeanbackLauncherActivity()) && !manifestXML.AddLeanbackLauncherActivity()) { Debug.LogWarning("No activity with LEANBACK_LAUNCHER or LAUNCHER categories found.\nThe build may not be compatible with Android TV. Specify an activity with LEANBACK_LAUNCHER or LAUNCHER category in the manifest, or disable Android TV compatibility in Player Settings."); } switch (PlayerSettings.Android.androidGamepadSupportLevel) { case AndroidGamepadSupportLevel.SupportsGamepad: manifestXML.AddUsesFeature("android.hardware.gamepad", false); break; case AndroidGamepadSupportLevel.RequiresGamepad: manifestXML.AddUsesFeature("android.hardware.gamepad", true); break; } if (PlayerSettings.virtualRealitySupported) { manifestXML.OverrideTheme("@android:style/Theme.Black.NoTitleBar.Fullscreen"); int num2 = context.Get<int>("GearVRMinSdkVersion"); if (PlayerSettings.Android.minSdkVersion < num2) { Debug.LogWarning("GearVR requires Minimum API Level of 19"); } } AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); bool collectMethods = true; bool ignoreSystemDlls = true; string[] textArray3 = new string[] { str, "Data", "Managed" }; string path = Paths.Combine(textArray3); checker.CollectReferences(path, collectMethods, 0f, ignoreSystemDlls); this.SetPermissionAttributes(context, manifestXML, checker); manifestXML.StripUnityLibEntryForNativeActitivy(); manifestXML.SaveAs(manifest); return manifestXML.packageName; }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker) { using (TextWriter output = (TextWriter) new StreamWriter(file)) { string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic; ArrayList arrayList = MonoAOTRegistration.BuildNativeMethodList(assemblyDefinitions); if (buildTarget == BuildTarget.iOS) { output.WriteLine("#include \"RegisterMonoModules.h\""); output.WriteLine("#include <stdio.h>"); } output.WriteLine(string.Empty); output.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); output.WriteLine(" #define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); output.WriteLine(" #define REGISTER_USER_FUNC(f)\\"); output.WriteLine(" do {\\"); output.WriteLine(" if(f != NULL)\\"); output.WriteLine(" mono_dl_register_symbol(#f, (void*)f);\\"); output.WriteLine(" else\\"); output.WriteLine(" ::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); output.WriteLine(" }while(0)"); output.WriteLine("#else"); output.WriteLine(" #define DECL_USER_FUNC(f) void f() "); output.WriteLine(" #if !defined(__arm64__)"); output.WriteLine(" #define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); output.WriteLine(" #else"); output.WriteLine(" #define REGISTER_USER_FUNC(f)"); output.WriteLine(" #endif"); output.WriteLine("#endif"); output.WriteLine("extern \"C\"\n{"); output.WriteLine(" typedef void* gpointer;"); output.WriteLine(" typedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { output.WriteLine(" const char* UnityIPhoneRuntimeVersion = \"{0}\";", (object) Application.unityVersion); output.WriteLine(" void mono_dl_register_symbol (const char* name, void *addr);"); output.WriteLine("#if !defined(__arm64__)"); output.WriteLine(" extern int mono_ficall_flag;"); output.WriteLine("#endif"); } output.WriteLine(" void mono_aot_register_module(gpointer *aot_info);"); output.WriteLine("#if __ORBIS__ || SN_TARGET_PSP2"); output.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); output.WriteLine("#else"); output.WriteLine("#define DLL_EXPORT"); output.WriteLine("#endif"); output.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); output.WriteLine(" extern gboolean mono_aot_only;"); for (int index = 0; index < assemblyFileNames.Length; ++index) { string str1 = assemblyFileNames[index]; string str2 = ((AssemblyNameReference) assemblyDefinitions[index].get_Name()).get_Name().Replace(".", "_").Replace("-", "_").Replace(" ", "_"); output.WriteLine(" extern gpointer* mono_aot_module_{0}_info; // {1}", (object) str2, (object) str1); } output.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); foreach (string str in arrayList) output.WriteLine(" DECL_USER_FUNC({0});", (object) str); output.WriteLine("}"); output.WriteLine("DLL_EXPORT void RegisterMonoModules()"); output.WriteLine("{"); output.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); output.WriteLine(" mono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) output.WriteLine(" mono_ficall_flag = {0};", !flag ? (object) "false" : (object) "true"); foreach (AssemblyDefinition assemblyDefinition in assemblyDefinitions) { string str = ((AssemblyNameReference) assemblyDefinition.get_Name()).get_Name().Replace(".", "_").Replace("-", "_").Replace(" ", "_"); output.WriteLine(" mono_aot_register_module(mono_aot_module_{0}_info);", (object) str); } output.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); output.WriteLine(string.Empty); if (buildTarget == BuildTarget.iOS) { foreach (string str in arrayList) output.WriteLine(" REGISTER_USER_FUNC({0});", (object) str); } output.WriteLine("}"); output.WriteLine(string.Empty); AssemblyDefinition unityEngine = (AssemblyDefinition) null; for (int index = 0; index < assemblyFileNames.Length; ++index) { if (assemblyFileNames[index] == "UnityEngine.dll") unityEngine = assemblyDefinitions[index]; } if (buildTarget == BuildTarget.iOS) { AssemblyDefinition[] assemblies = new AssemblyDefinition[1]{ unityEngine }; MonoAOTRegistration.GenerateRegisterInternalCalls(assemblies, output); MonoAOTRegistration.ResolveDefinedNativeClassesFromMono(assemblies, usedClassRegistry); MonoAOTRegistration.ResolveReferencedUnityEngineClassesFromMono(assemblyDefinitions, unityEngine, usedClassRegistry); MonoAOTRegistration.GenerateRegisterModules(usedClassRegistry, output, stripping); if (stripping && usedClassRegistry != null) MonoAOTRegistration.GenerateRegisterClassesForStripping(usedClassRegistry, output); else MonoAOTRegistration.GenerateRegisterClasses(usedClassRegistry, output); } output.Close(); } }
public static void GenerateDependencies(string strippedAssemblyDir, RuntimeClassRegistry rcr, out HashSet<string> nativeClasses, out HashSet<string> nativeModules) { string[] userAssemblies = GetUserAssemblies(strippedAssemblyDir); nativeClasses = !PlayerSettings.stripEngineCode ? null : GenerateNativeClassList(rcr, strippedAssemblyDir, userAssemblies); if (nativeClasses != null) { ExcludeModuleManagers(ref nativeClasses); } nativeModules = GetNativeModulesToRegister(nativeClasses); AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); checker.CollectReferencesFromRoots(strippedAssemblyDir, userAssemblies, true, 0f, true); if (checker.HasDefinedMethod("OnGUI")) { nativeModules.Add("IMGUI"); } }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker, string stagingAreaDataManaged) { HashSet <UnityType> set; HashSet <string> set2; string str = Path.Combine(stagingAreaDataManaged, "ICallSummary.txt"); string exe = Path.Combine(MonoInstallationFinder.GetFrameWorksFolder(), "Tools/InternalCallRegistrationWriter/InternalCallRegistrationWriter.exe"); string args = $"-assembly=" { Path.Combine(stagingAreaDataManaged, "UnityEngine.dll") } " -summary=" { str } ""; Runner.RunManagedProgram(exe, args); CodeStrippingUtils.GenerateDependencies(Path.GetFullPath(stagingAreaDataManaged), str, usedClassRegistry, stripping, out set, out set2, null); using (TextWriter writer = new StreamWriter(file)) { string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic; ArrayList list = BuildNativeMethodList(assemblyDefinitions); if (buildTarget == BuildTarget.iOS) { writer.WriteLine("#include \"RegisterMonoModules.h\""); writer.WriteLine("#include <stdio.h>"); } writer.WriteLine(""); writer.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); writer.WriteLine(" #define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); writer.WriteLine(@" #define REGISTER_USER_FUNC(f)\"); writer.WriteLine(@" do {\"); writer.WriteLine(@" if(f != NULL)\"); writer.WriteLine(@" mono_dl_register_symbol(#f, (void*)f);\"); writer.WriteLine(@" else\"); writer.WriteLine(" ::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); writer.WriteLine(" }while(0)"); writer.WriteLine("#else"); writer.WriteLine(" #define DECL_USER_FUNC(f) void f() "); writer.WriteLine(" #if !defined(__arm64__)"); writer.WriteLine(" #define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); writer.WriteLine(" #else"); writer.WriteLine(" #define REGISTER_USER_FUNC(f)"); writer.WriteLine(" #endif"); writer.WriteLine("#endif"); writer.WriteLine("extern \"C\"\n{"); writer.WriteLine(" typedef void* gpointer;"); writer.WriteLine(" typedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { writer.WriteLine(" const char* UnityIPhoneRuntimeVersion = \"{0}\";", Application.unityVersion); writer.WriteLine(" void mono_dl_register_symbol (const char* name, void *addr);"); writer.WriteLine("#if !defined(__arm64__)"); writer.WriteLine(" extern int mono_ficall_flag;"); writer.WriteLine("#endif"); } writer.WriteLine(" void mono_aot_register_module(gpointer *aot_info);"); writer.WriteLine("#if __ORBIS__ || SN_TARGET_PSP2"); writer.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); writer.WriteLine("#else"); writer.WriteLine("#define DLL_EXPORT"); writer.WriteLine("#endif"); writer.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); writer.WriteLine(" extern gboolean mono_aot_only;"); for (int i = 0; i < assemblyFileNames.Length; i++) { string str4 = assemblyFileNames[i]; string str5 = assemblyDefinitions[i].Name.Name.Replace(".", "_").Replace("-", "_").Replace(" ", "_"); writer.WriteLine(" extern gpointer* mono_aot_module_{0}_info; // {1}", str5, str4); } writer.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); IEnumerator enumerator = list.GetEnumerator(); try { while (enumerator.MoveNext()) { string current = (string)enumerator.Current; writer.WriteLine(" DECL_USER_FUNC({0});", current); } } finally { IDisposable disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } writer.WriteLine("}"); writer.WriteLine("DLL_EXPORT void RegisterMonoModules()"); writer.WriteLine("{"); writer.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); writer.WriteLine(" mono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) { writer.WriteLine(" mono_ficall_flag = {0};", !flag ? "false" : "true"); } foreach (AssemblyDefinition definition in assemblyDefinitions) { string str7 = definition.Name.Name.Replace(".", "_").Replace("-", "_").Replace(" ", "_"); writer.WriteLine(" mono_aot_register_module(mono_aot_module_{0}_info);", str7); } writer.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); writer.WriteLine(""); if (buildTarget == BuildTarget.iOS) { IEnumerator enumerator2 = list.GetEnumerator(); try { while (enumerator2.MoveNext()) { string str8 = (string)enumerator2.Current; writer.WriteLine(" REGISTER_USER_FUNC({0});", str8); } } finally { IDisposable disposable2 = enumerator2 as IDisposable; if (disposable2 != null) { disposable2.Dispose(); } } } writer.WriteLine("}"); writer.WriteLine(""); AssemblyDefinition unityEngine = null; for (int j = 0; j < assemblyFileNames.Length; j++) { if (assemblyFileNames[j] == "UnityEngine.dll") { unityEngine = assemblyDefinitions[j]; } } if (buildTarget == BuildTarget.iOS) { AssemblyDefinition[] assemblies = new AssemblyDefinition[] { unityEngine }; GenerateRegisterInternalCalls(assemblies, writer); ResolveDefinedNativeClassesFromMono(assemblies, usedClassRegistry); ResolveReferencedUnityEngineClassesFromMono(assemblyDefinitions, unityEngine, usedClassRegistry); GenerateRegisterModules(set, set2, writer, stripping); if (stripping && (usedClassRegistry != null)) { GenerateRegisterClassesForStripping(set, writer); } else { GenerateRegisterClasses(set, writer); } } writer.Close(); } }
public static void GenerateDependencies(string strippedAssemblyDir, string icallsListFile, RuntimeClassRegistry rcr, bool doStripping, out HashSet <UnityType> nativeClasses, out HashSet <string> nativeModules, IIl2CppPlatformProvider platformProvider) { StrippingInfo strippingInfo = (platformProvider != null) ? StrippingInfo.GetBuildReportData(platformProvider.buildReport) : null; string[] userAssemblies = CodeStrippingUtils.GetUserAssemblies(strippedAssemblyDir); nativeClasses = ((!doStripping) ? null : CodeStrippingUtils.GenerateNativeClassList(rcr, strippedAssemblyDir, userAssemblies, strippingInfo)); if (nativeClasses != null) { CodeStrippingUtils.ExcludeModuleManagers(ref nativeClasses); } nativeModules = CodeStrippingUtils.GetNativeModulesToRegister(nativeClasses, strippingInfo); if (nativeClasses != null && icallsListFile != null) { HashSet <string> modulesFromICalls = CodeStrippingUtils.GetModulesFromICalls(icallsListFile); foreach (string current in modulesFromICalls) { if (!nativeModules.Contains(current)) { if (strippingInfo != null) { strippingInfo.RegisterDependency(StrippingInfo.ModuleName(current), "Required by Scripts"); } } UnityType[] moduleTypes = ModuleMetadata.GetModuleTypes(current); UnityType[] array = moduleTypes; for (int i = 0; i < array.Length; i++) { UnityType unityType = array[i]; if (unityType.IsDerivedFrom(CodeStrippingUtils.GameManagerTypeInfo)) { nativeClasses.Add(unityType); } } } nativeModules.UnionWith(modulesFromICalls); } bool flag = true; if (platformProvider != null) { while (flag) { flag = false; foreach (string current2 in nativeModules.ToList <string>()) { string moduleWhitelist = CodeStrippingUtils.GetModuleWhitelist(current2, platformProvider.moduleStrippingInformationFolder); if (File.Exists(moduleWhitelist)) { foreach (string current3 in CodeStrippingUtils.GetDependentModules(moduleWhitelist)) { if (!nativeModules.Contains(current3)) { nativeModules.Add(current3); flag = true; } if (strippingInfo != null) { string text = StrippingInfo.ModuleName(current2); strippingInfo.RegisterDependency(StrippingInfo.ModuleName(current3), "Required by " + text); if (strippingInfo.icons.ContainsKey(text)) { strippingInfo.SetIcon("Required by " + text, strippingInfo.icons[text]); } } } } } } } AssemblyReferenceChecker assemblyReferenceChecker = new AssemblyReferenceChecker(); assemblyReferenceChecker.CollectReferencesFromRoots(strippedAssemblyDir, userAssemblies, true, 0f, true); if (strippingInfo != null) { foreach (string current4 in nativeModules) { strippingInfo.AddModule(StrippingInfo.ModuleName(current4)); } strippingInfo.AddModule(StrippingInfo.ModuleName("Core")); } if (nativeClasses != null && strippingInfo != null) { CodeStrippingUtils.InjectCustomDependencies(platformProvider.target, strippingInfo, nativeClasses, nativeModules); } }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker) { using (TextWriter output = (TextWriter) new StreamWriter(file)) { string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic; ArrayList arrayList = MonoAOTRegistration.BuildNativeMethodList(assemblyDefinitions); if (buildTarget == BuildTarget.iOS) { output.WriteLine("#include \"RegisterMonoModules.h\""); output.WriteLine("#include <stdio.h>"); } output.WriteLine(string.Empty); output.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); output.WriteLine(" #define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); output.WriteLine(" #define REGISTER_USER_FUNC(f)\\"); output.WriteLine(" do {\\"); output.WriteLine(" if(f != NULL)\\"); output.WriteLine(" mono_dl_register_symbol(#f, (void*)f);\\"); output.WriteLine(" else\\"); output.WriteLine(" ::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); output.WriteLine(" }while(0)"); output.WriteLine("#else"); output.WriteLine(" #define DECL_USER_FUNC(f) void f() "); output.WriteLine(" #if !defined(__arm64__)"); output.WriteLine(" #define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); output.WriteLine(" #else"); output.WriteLine(" #define REGISTER_USER_FUNC(f)"); output.WriteLine(" #endif"); output.WriteLine("#endif"); output.WriteLine("extern \"C\"\n{"); output.WriteLine(" typedef void* gpointer;"); output.WriteLine(" typedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { output.WriteLine(" const char* UnityIPhoneRuntimeVersion = \"{0}\";", (object)Application.unityVersion); output.WriteLine(" void mono_dl_register_symbol (const char* name, void *addr);"); output.WriteLine("#if !defined(__arm64__)"); output.WriteLine(" extern int mono_ficall_flag;"); output.WriteLine("#endif"); } output.WriteLine(" void mono_aot_register_module(gpointer *aot_info);"); output.WriteLine("#if __ORBIS__ || SN_TARGET_PSP2"); output.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); output.WriteLine("#else"); output.WriteLine("#define DLL_EXPORT"); output.WriteLine("#endif"); output.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); output.WriteLine(" extern gboolean mono_aot_only;"); for (int index = 0; index < assemblyFileNames.Length; ++index) { string str1 = assemblyFileNames[index]; string str2 = ((AssemblyNameReference)assemblyDefinitions[index].get_Name()).get_Name().Replace(".", "_").Replace("-", "_").Replace(" ", "_"); output.WriteLine(" extern gpointer* mono_aot_module_{0}_info; // {1}", (object)str2, (object)str1); } output.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); foreach (string str in arrayList) { output.WriteLine(" DECL_USER_FUNC({0});", (object)str); } output.WriteLine("}"); output.WriteLine("DLL_EXPORT void RegisterMonoModules()"); output.WriteLine("{"); output.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); output.WriteLine(" mono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) { output.WriteLine(" mono_ficall_flag = {0};", !flag ? (object)"false" : (object)"true"); } foreach (AssemblyDefinition assemblyDefinition in assemblyDefinitions) { string str = ((AssemblyNameReference)assemblyDefinition.get_Name()).get_Name().Replace(".", "_").Replace("-", "_").Replace(" ", "_"); output.WriteLine(" mono_aot_register_module(mono_aot_module_{0}_info);", (object)str); } output.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); output.WriteLine(string.Empty); if (buildTarget == BuildTarget.iOS) { foreach (string str in arrayList) { output.WriteLine(" REGISTER_USER_FUNC({0});", (object)str); } } output.WriteLine("}"); output.WriteLine(string.Empty); AssemblyDefinition unityEngine = (AssemblyDefinition)null; for (int index = 0; index < assemblyFileNames.Length; ++index) { if (assemblyFileNames[index] == "UnityEngine.dll") { unityEngine = assemblyDefinitions[index]; } } if (buildTarget == BuildTarget.iOS) { AssemblyDefinition[] assemblies = new AssemblyDefinition[1] { unityEngine }; MonoAOTRegistration.GenerateRegisterInternalCalls(assemblies, output); MonoAOTRegistration.ResolveDefinedNativeClassesFromMono(assemblies, usedClassRegistry); MonoAOTRegistration.ResolveReferencedUnityEngineClassesFromMono(assemblyDefinitions, unityEngine, usedClassRegistry); MonoAOTRegistration.GenerateRegisterModules(usedClassRegistry, output, stripping); if (stripping && usedClassRegistry != null) { MonoAOTRegistration.GenerateRegisterClassesForStripping(usedClassRegistry, output); } else { MonoAOTRegistration.GenerateRegisterClasses(usedClassRegistry, output); } } output.Close(); } }
private static HashSet <string> CollectManagedTypeReferencesFromRoots(string directory, string[] rootAssemblies, StrippingInfo strippingInfo) { HashSet <string> hashSet = new HashSet <string>(); AssemblyReferenceChecker assemblyReferenceChecker = new AssemblyReferenceChecker(); bool collectMethods = false; bool ignoreSystemDlls = false; assemblyReferenceChecker.CollectReferencesFromRoots(directory, rootAssemblies, collectMethods, 0f, ignoreSystemDlls); string[] assemblyFileNames = assemblyReferenceChecker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = assemblyReferenceChecker.GetAssemblyDefinitions(); AssemblyDefinition[] array = assemblyDefinitions; for (int i = 0; i < array.Length; i++) { AssemblyDefinition assemblyDefinition = array[i]; foreach (TypeDefinition current in assemblyDefinition.MainModule.Types) { if (current.Namespace.StartsWith("UnityEngine")) { if (current.Fields.Count > 0 || current.Methods.Count > 0 || current.Properties.Count > 0) { string name = current.Name; hashSet.Add(name); if (strippingInfo != null) { string name2 = assemblyDefinition.Name.Name; if (!AssemblyReferenceChecker.IsIgnoredSystemDll(name2)) { strippingInfo.RegisterDependency(name, "Required by Scripts"); } } } } } } AssemblyDefinition assemblyDefinition2 = null; AssemblyDefinition assemblyDefinition3 = null; for (int j = 0; j < assemblyFileNames.Length; j++) { if (assemblyFileNames[j] == "UnityEngine.dll") { assemblyDefinition2 = assemblyDefinitions[j]; } if (assemblyFileNames[j] == "UnityEngine.UI.dll") { assemblyDefinition3 = assemblyDefinitions[j]; } } AssemblyDefinition[] array2 = assemblyDefinitions; for (int k = 0; k < array2.Length; k++) { AssemblyDefinition assemblyDefinition4 = array2[k]; if (assemblyDefinition4 != assemblyDefinition2 && assemblyDefinition4 != assemblyDefinition3) { foreach (TypeReference current2 in assemblyDefinition4.MainModule.GetTypeReferences()) { if (current2.Namespace.StartsWith("UnityEngine")) { string name3 = current2.Name; hashSet.Add(name3); if (strippingInfo != null) { string name4 = assemblyDefinition4.Name.Name; if (!AssemblyReferenceChecker.IsIgnoredSystemDll(name4)) { strippingInfo.RegisterDependency(name3, "Required by Scripts"); } } } } } } return(hashSet); }
// Collects all types from managed assemblies. // Follows assembly references from given root assemblies. // Assemblies should be already stripped. private static HashSet <string> CollectManagedTypeReferencesFromRoots(string directory, string[] rootAssemblies, StrippingInfo strippingInfo) { if (AssemblyStripper.UseUnityLinkerEngineModuleStripping) { throw new NotSupportedException("Don't want to rely on this method when UnityLinker EMS is used"); } HashSet <string> foundTypes = new HashSet <string>(); AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); bool collectMethods = false; bool ignoreSystemDlls = false; checker.CollectReferencesFromRoots(directory, rootAssemblies, collectMethods, 0.0f, ignoreSystemDlls); { string[] fileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblies = checker.GetAssemblyDefinitions(); foreach (AssemblyDefinition definition in assemblies) { foreach (TypeDefinition typeDefinition in definition.MainModule.Types) { if (typeDefinition.Namespace.StartsWith("UnityEngine")) { // Skip blank types if (typeDefinition.Fields.Count > 0 || typeDefinition.Methods.Count > 0 || typeDefinition.Properties.Count > 0) { string className = typeDefinition.Name; foundTypes.Add(className); if (strippingInfo != null) { if (!AssemblyReferenceChecker.IsIgnoredSystemDll(definition)) { strippingInfo.RegisterDependency(className, StrippingInfo.RequiredByScripts); } } } } } } AssemblyDefinition unityEngineAssemblyDefinition = null; AssemblyDefinition unityEngineUIAssemblyDefinition = null; for (int i = 0; i < fileNames.Length; i++) { if (fileNames[i] == "UnityEngine.dll") { unityEngineAssemblyDefinition = assemblies[i]; } // UnityEngine.UI references UnityEngine.Collider, which causes the inclusion of Physics and Physics2D modules if // UnityEngine.UI is referenced. UnityEngine.UI code is designed to only actually access Colliders if these modules // are used, so don't include references from UnityEngine.UI here. if (fileNames[i] == "Unity.ugui.dll") { unityEngineUIAssemblyDefinition = assemblies[i]; } } foreach (AssemblyDefinition definition in assemblies) { if (definition != unityEngineAssemblyDefinition && definition != unityEngineUIAssemblyDefinition) { foreach (TypeReference typeReference in definition.MainModule.GetTypeReferences()) { if (typeReference.Namespace.StartsWith("UnityEngine")) { string className = typeReference.Name; foundTypes.Add(className); if (strippingInfo != null) { if (!AssemblyReferenceChecker.IsIgnoredSystemDll(definition)) { strippingInfo.RegisterDependency(className, StrippingInfo.RequiredByScripts); } } } } } } } return(foundTypes); }
private static HashSet<string> CollectManagedTypeReferencesFromRoots(string directory, string[] rootAssemblies) { HashSet<string> hashSet = new HashSet<string>(); AssemblyReferenceChecker assemblyReferenceChecker = new AssemblyReferenceChecker(); bool withMethods = false; bool ignoreSystemDlls = false; assemblyReferenceChecker.CollectReferencesFromRoots(directory, rootAssemblies, withMethods, 0f, ignoreSystemDlls); string[] assemblyFileNames = assemblyReferenceChecker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = assemblyReferenceChecker.GetAssemblyDefinitions(); AssemblyDefinition[] array = assemblyDefinitions; for (int i = 0; i < array.Length; i++) { AssemblyDefinition assemblyDefinition = array[i]; foreach (TypeDefinition current in assemblyDefinition.MainModule.Types) { if (current.Namespace.StartsWith("UnityEngine") && (current.Fields.Count > 0 || current.Methods.Count > 0 || current.Properties.Count > 0)) { string name = current.Name; hashSet.Add(name); } } } AssemblyDefinition assemblyDefinition2 = null; for (int j = 0; j < assemblyFileNames.Length; j++) { if (assemblyFileNames[j] == "UnityEngine.dll") { assemblyDefinition2 = assemblyDefinitions[j]; } } AssemblyDefinition[] array2 = assemblyDefinitions; for (int k = 0; k < array2.Length; k++) { AssemblyDefinition assemblyDefinition3 = array2[k]; if (assemblyDefinition3 != assemblyDefinition2) { foreach (TypeReference current2 in assemblyDefinition3.MainModule.GetTypeReferences()) { if (current2.Namespace.StartsWith("UnityEngine")) { string name2 = current2.Name; hashSet.Add(name2); } } } } return hashSet; }
public void PostProcess(BuildPostProcessArgs args) { base.m_PostProcessArgs = args; AssemblyReferenceChecker checker = new AssemblyReferenceChecker(); checker.CollectReferences(args.stagingAreaDataManaged, false, 0f, true); bool flag = !string.IsNullOrEmpty(checker.WhoReferencesClass("UnityEngine.SocialPlatforms.GameCenter.GameCenterPlatform", true)); this.SaveEditorOnlyPlayerSettingsToPlist(); base.PostProcess(); if (flag) { if (Application.platform != RuntimePlatform.OSXEditor) { UnityEngine.Debug.LogWarning("OS X Standalone players with GameCenter support need to be built on an OS X machine in order to pass Mac App Store validation."); } else { Console.WriteLine("Adding GameKit linkage to OS X binary."); ProcessStartInfo info2 = new ProcessStartInfo { FileName = Path.Combine(BuildPipeline.GetPlaybackEngineDirectory(args.target, args.options), "optool") }; string[] textArray1 = new string[] { "install -c weak -p /System/Library/Frameworks/GameKit.framework/Versions/A/GameKit -t \"", this.m_PostProcessArgs.installPath, "/Contents/MacOS/", this.InstallNameWithoutExtension, "\"" }; info2.Arguments = string.Concat(textArray1); info2.CreateNoWindow = true; ProcessStartInfo si = info2; Program program = new Program(si); program.Start(); while (!program.WaitForExit(100)) { } if (program.ExitCode != 0) { UnityEngine.Debug.LogError("Running optool to link GameKit failed\n" + si.FileName + " " + si.Arguments + "\n" + program.GetAllOutput()); } program.Dispose(); } } }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker, string stagingAreaDataManaged, IIl2CppPlatformProvider platformProvider) { string text = Path.Combine(stagingAreaDataManaged, "ICallSummary.txt"); string exe = Path.Combine(MonoInstallationFinder.GetFrameWorksFolder(), "Tools/InternalCallRegistrationWriter/InternalCallRegistrationWriter.exe"); string args = string.Format("-assembly=\"{0}\" -summary=\"{1}\"", Path.Combine(stagingAreaDataManaged, "UnityEngine.dll"), text); Runner.RunManagedProgram(exe, args); HashSet <UnityType> hashSet; HashSet <string> nativeModules; CodeStrippingUtils.GenerateDependencies(Path.GetDirectoryName(stagingAreaDataManaged), text, usedClassRegistry, stripping, out hashSet, out nativeModules, platformProvider); using (TextWriter textWriter = new StreamWriter(file)) { string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic; ArrayList arrayList = MonoAOTRegistration.BuildNativeMethodList(assemblyDefinitions); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine("#include \"RegisterMonoModules.h\""); textWriter.WriteLine("#include <stdio.h>"); } textWriter.WriteLine(""); textWriter.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); textWriter.WriteLine(" #define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); textWriter.WriteLine(" #define REGISTER_USER_FUNC(f)\\"); textWriter.WriteLine(" do {\\"); textWriter.WriteLine(" if(f != NULL)\\"); textWriter.WriteLine(" mono_dl_register_symbol(#f, (void*)f);\\"); textWriter.WriteLine(" else\\"); textWriter.WriteLine(" ::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); textWriter.WriteLine(" }while(0)"); textWriter.WriteLine("#else"); textWriter.WriteLine(" #define DECL_USER_FUNC(f) void f() "); textWriter.WriteLine(" #if !defined(__arm64__)"); textWriter.WriteLine(" #define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); textWriter.WriteLine(" #else"); textWriter.WriteLine(" #define REGISTER_USER_FUNC(f)"); textWriter.WriteLine(" #endif"); textWriter.WriteLine("#endif"); textWriter.WriteLine("extern \"C\"\n{"); textWriter.WriteLine(" typedef void* gpointer;"); textWriter.WriteLine(" typedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine(" const char* UnityIPhoneRuntimeVersion = \"{0}\";", Application.unityVersion); textWriter.WriteLine(" void mono_dl_register_symbol (const char* name, void *addr);"); textWriter.WriteLine("#if !defined(__arm64__)"); textWriter.WriteLine(" extern int mono_ficall_flag;"); textWriter.WriteLine("#endif"); } textWriter.WriteLine(" void mono_aot_register_module(gpointer *aot_info);"); textWriter.WriteLine("#if __ORBIS__ || SN_TARGET_PSP2"); textWriter.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); textWriter.WriteLine("#else"); textWriter.WriteLine("#define DLL_EXPORT"); textWriter.WriteLine("#endif"); textWriter.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); textWriter.WriteLine(" extern gboolean mono_aot_only;"); for (int i = 0; i < assemblyFileNames.Length; i++) { string arg = assemblyFileNames[i]; string text2 = assemblyDefinitions[i].Name.Name; text2 = text2.Replace(".", "_"); text2 = text2.Replace("-", "_"); text2 = text2.Replace(" ", "_"); textWriter.WriteLine(" extern gpointer* mono_aot_module_{0}_info; // {1}", text2, arg); } textWriter.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); IEnumerator enumerator = arrayList.GetEnumerator(); try { while (enumerator.MoveNext()) { string arg2 = (string)enumerator.Current; textWriter.WriteLine(" DECL_USER_FUNC({0});", arg2); } } finally { IDisposable disposable; if ((disposable = (enumerator as IDisposable)) != null) { disposable.Dispose(); } } textWriter.WriteLine("}"); textWriter.WriteLine("DLL_EXPORT void RegisterMonoModules()"); textWriter.WriteLine("{"); textWriter.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); textWriter.WriteLine(" mono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine(" mono_ficall_flag = {0};", (!flag) ? "false" : "true"); } AssemblyDefinition[] array = assemblyDefinitions; for (int j = 0; j < array.Length; j++) { AssemblyDefinition assemblyDefinition = array[j]; string text3 = assemblyDefinition.Name.Name; text3 = text3.Replace(".", "_"); text3 = text3.Replace("-", "_"); text3 = text3.Replace(" ", "_"); textWriter.WriteLine(" mono_aot_register_module(mono_aot_module_{0}_info);", text3); } textWriter.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); textWriter.WriteLine(""); if (buildTarget == BuildTarget.iOS) { IEnumerator enumerator2 = arrayList.GetEnumerator(); try { while (enumerator2.MoveNext()) { string arg3 = (string)enumerator2.Current; textWriter.WriteLine(" REGISTER_USER_FUNC({0});", arg3); } } finally { IDisposable disposable2; if ((disposable2 = (enumerator2 as IDisposable)) != null) { disposable2.Dispose(); } } } textWriter.WriteLine("}"); textWriter.WriteLine(""); AssemblyDefinition assemblyDefinition2 = null; for (int k = 0; k < assemblyFileNames.Length; k++) { if (assemblyFileNames[k] == "UnityEngine.dll") { assemblyDefinition2 = assemblyDefinitions[k]; } } if (buildTarget == BuildTarget.iOS) { AssemblyDefinition[] assemblies = new AssemblyDefinition[] { assemblyDefinition2 }; MonoAOTRegistration.GenerateRegisterInternalCalls(assemblies, textWriter); MonoAOTRegistration.GenerateRegisterModules(hashSet, nativeModules, textWriter, stripping); if (stripping && usedClassRegistry != null) { MonoAOTRegistration.GenerateRegisterClassesForStripping(hashSet, textWriter); } else { MonoAOTRegistration.GenerateRegisterClasses(hashSet, textWriter); } } textWriter.Close(); } }