From 0e04a66c91b760ac664e82fe4c35ec03a9d9eba6 Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 16 Dec 2022 11:03:03 +0800 Subject: [PATCH] =?UTF-8?q?[new]=20=E6=96=B0=E5=A2=9E=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=20`HybridCLR/Generate/AOTDlls`=20=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E7=94=9F=E6=88=90=E8=A3=81=E5=89=AA=E5=90=8E=E7=9A=84?= =?UTF-8?q?AOT=20dlls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Commands/PrebuildCommand.cs | 8 +- Editor/Commands/StripAOTDllCommand.cs | 97 ++++++++++++++++++++++ Editor/Commands/StripAOTDllCommand.cs.meta | 11 +++ package.json | 2 +- 4 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 Editor/Commands/StripAOTDllCommand.cs create mode 100644 Editor/Commands/StripAOTDllCommand.cs.meta diff --git a/Editor/Commands/PrebuildCommand.cs b/Editor/Commands/PrebuildCommand.cs index 30bf910..89196c4 100644 --- a/Editor/Commands/PrebuildCommand.cs +++ b/Editor/Commands/PrebuildCommand.cs @@ -17,16 +17,18 @@ namespace HybridCLR.Editor.Commands { BuildTarget target = EditorUserBuildSettings.activeBuildTarget; CompileDllCommand.CompileDll(target); - Il2CppDefGeneratorCommand.GenerateIl2CppDef(); // 这几个生成依赖HotUpdateDlls LinkGeneratorCommand.GenerateLinkXml(target); - ReversePInvokeWrapperGeneratorCommand.GenerateReversePInvokeWrapper(target); - AOTReferenceGeneratorCommand.GenerateAOTGenericReference(target); + + // 生成裁剪后的aot dll + StripAOTDllCommand.GenerateStripedAOTDlls(target, EditorUserBuildSettings.selectedBuildTargetGroup); // 桥接函数生成依赖于AOT dll,必须保证已经build过,生成AOT dll MethodBridgeGeneratorCommand.GenerateMethodBridge(target); + ReversePInvokeWrapperGeneratorCommand.GenerateReversePInvokeWrapper(target); + AOTReferenceGeneratorCommand.GenerateAOTGenericReference(target); } } } diff --git a/Editor/Commands/StripAOTDllCommand.cs b/Editor/Commands/StripAOTDllCommand.cs new file mode 100644 index 0000000..da64394 --- /dev/null +++ b/Editor/Commands/StripAOTDllCommand.cs @@ -0,0 +1,97 @@ +using HybridCLR.Editor.Installer; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace HybridCLR.Editor.Commands +{ + public static class StripAOTDllCommand + { + [MenuItem("HybridCLR/Generate/AOTDlls", priority = 105)] + public static void GenerateStripedAOTDlls() + { + GenerateStripedAOTDlls(EditorUserBuildSettings.activeBuildTarget, EditorUserBuildSettings.selectedBuildTargetGroup); + } + + private static string GetLocationPathName(string buildDir, BuildTarget target) + { + switch(target) + { + case BuildTarget.StandaloneWindows: + case BuildTarget.StandaloneWindows64: return $"{buildDir}/{target}"; + case BuildTarget.StandaloneOSX: return buildDir; + case BuildTarget.iOS: return buildDir; + case BuildTarget.Android: return buildDir; + case BuildTarget.StandaloneLinux64: return buildDir; + default: return buildDir; + } + } + + public static void GenerateStripedAOTDlls(BuildTarget target, BuildTargetGroup group) + { + string outputPath = $"{SettingsUtil.HybridCLRDataDir}/StrippedAOTDllsTempProj/{target}"; + BashUtil.RemoveDir(outputPath); + + var buildOptions = BuildOptions.BuildScriptsOnly; + + bool oldExportAndroidProj = EditorUserBuildSettings.exportAsGoogleAndroidProject; + bool oldCreateSolutionWin = UnityEditor.WindowsStandalone.UserBuildSettings.createSolution; + bool oldBuildScriptsOnly = EditorUserBuildSettings.buildScriptsOnly; + EditorUserBuildSettings.buildScriptsOnly = true; + + switch (target) + { + case BuildTarget.StandaloneWindows: + case BuildTarget.StandaloneWindows64: + { + UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = true; + break; + } + case BuildTarget.Android: + { + EditorUserBuildSettings.exportAsGoogleAndroidProject = true; + break; + } + } + + BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions() + { + scenes = EditorBuildSettings.scenes.Where(s => s.enabled).Select(s => s.path).ToArray(), + locationPathName = GetLocationPathName(outputPath, target), + options = buildOptions, + target = target, + targetGroup = group, + }; + + var report = BuildPipeline.BuildPlayer(buildPlayerOptions); + + EditorUserBuildSettings.buildScriptsOnly = oldBuildScriptsOnly; + switch (target) + { + case BuildTarget.StandaloneWindows: + case BuildTarget.StandaloneWindows64: + { + UnityEditor.WindowsStandalone.UserBuildSettings.createSolution = oldCreateSolutionWin; + break; + } + case BuildTarget.Android: + { + EditorUserBuildSettings.exportAsGoogleAndroidProject = oldExportAndroidProj; + break; + } + } + + if (report.summary.result != UnityEditor.Build.Reporting.BuildResult.Succeeded) + { + Debug.LogError("GenerateStripedAOTDlls 失败"); + return; + } + Debug.Log($"GenerateStripedAOTDlls target:{target} group:{group} path:{outputPath}"); + } + } +} diff --git a/Editor/Commands/StripAOTDllCommand.cs.meta b/Editor/Commands/StripAOTDllCommand.cs.meta new file mode 100644 index 0000000..3979b80 --- /dev/null +++ b/Editor/Commands/StripAOTDllCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 21fb0a02f23185141a4a3df67fe61789 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json index 448191d..990caff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "1.1.14", + "version": "1.1.15", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime",