| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 | using System.Collections.Generic;using System.IO;using Fort23.Core;using Fort23.Editor;using Fort23.GameData;using Fort23.Mono;using Fort23.UTool;using hirdParty.DownloadSystem;using HybridCLR.Editor.Commands;using UnityEditor;using UnityEngine;namespace HybridCLR.Editor{    public static class BuildAssetsCommand    {        [MenuItem("HybridCLR/打包dll到StreamingAssets")]        public static void BuildAndCopyAOTHotUpdateDllsToStreamingAssets()        {            // var gameRuntimeConfig = Resources.Load<GameRuntimeConfig>("GameRuntimeConfig");            var build = Application.streamingAssetsPath + "/Dll/";            if (Directory.Exists(build))            {                Directory.Delete(build,true);            }            Directory.CreateDirectory(build);            BuildAndCopyAOTHotUpdateDlls(build);            var assetMd5Info = new AssetMD5Info(new List<MD5FileInfo>());            var allBundles = Directory.GetFiles(build);            foreach (var bundle in allBundles)            {                if (bundle.Contains(".dll.bytes"))                {                    MD5FileInfo md5Info = new MD5FileInfo();                    md5Info.md5 = MD5Helper.FileMD5(bundle);                    FileInfo fileInfo = new FileInfo(bundle);                    md5Info.size = fileInfo.Length;                    md5Info.fileName = Path.GetFileName(bundle);                    assetMd5Info.fileInfo.Add(md5Info);                }            }            var md5Json = JsonHelper.ToJson(assetMd5Info);            File.WriteAllText(build + "DllMD5.txt", md5Json);            LogTool.Log("MD5文件生成完成");            PlatformType platformType;#if UNITY_ANDROID            platformType = PlatformType.Android;#elif UNITY_IOS			platformType = PlatformType.IOS;#elif UNITY_STANDALONE_WIN            platformType = PlatformType.PC;#elif UNITY_STANDALONE_OSX			platformType = PlatformType.MacOS;#else			platformType = PlatformType.None;#endif           // var build = Application.streamingAssetsPath;            BuildAndCopyAOTHotUpdateDlls(build);            AssetDatabase.SaveAssets();            AssetDatabase.Refresh();        }        [MenuItem("HybridCLR/打包dll到专门文件夹")]        public static void BuildAndCopyAOTHotUpdateDllsToSpecialFolder()        {            var gameRuntimeConfig = Resources.Load<GameRuntimeConfig>("GameRuntimeConfig");            PlatformType platformType;#if UNITY_ANDROID            platformType = PlatformType.Android;#elif UNITY_IOS			platformType = PlatformType.IOS;#elif UNITY_STANDALONE_WIN            platformType = PlatformType.PC;#elif UNITY_STANDALONE_OSX			platformType = PlatformType.MacOS;#else			platformType = PlatformType.None;#endif            var build = string.Format(BuildEditor.buildDllFolder, platformType,                $"{1}.{1}.{1}");            BuildAndCopyAOTHotUpdateDlls(build);            var assetMd5Info = new AssetMD5Info(new List<MD5FileInfo>());            var allBundles = Directory.GetFiles(build);            foreach (var bundle in allBundles)            {                if (bundle.Contains(".dll.bytes"))                {                    MD5FileInfo md5Info = new MD5FileInfo();                    md5Info.md5 = MD5Helper.FileMD5(bundle);                    FileInfo fileInfo = new FileInfo(bundle);                    md5Info.size = fileInfo.Length;                    md5Info.fileName = Path.GetFileName(bundle);                    assetMd5Info.fileInfo.Add(md5Info);                }            }            var md5Json = JsonHelper.ToJson(assetMd5Info);            File.WriteAllText(build + "/DllMD5.txt", md5Json);            LogTool.Log("MD5文件生成完成");        }        public static void BuildAndCopyAOTHotUpdateDlls(string buildDstDir)        {            if (!Directory.Exists(buildDstDir))            {                Directory.CreateDirectory(buildDstDir);            }            CompileDllCommand.CompileDllActiveBuildTarget();            CopyAOTAssembliesToStreamingAssets(buildDstDir);            CopyHotUpdateAssembliesToStreamingAssets(buildDstDir);        }        /// <summary>        /// 复制AOT的Assembly补充元数据到StreamingAssets(在LoadDll.AOTMetaAssemblyNames中设置的)        /// </summary>        private static void CopyAOTAssembliesToStreamingAssets(string aotAssembliesDstDir)        {            var target = EditorUserBuildSettings.activeBuildTarget;            string aotAssembliesSrcDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);            foreach (var dll in SettingsUtil.HybridCLRSettings.patchAOTAssemblies)            {                string srcDllPath = $"{aotAssembliesSrcDir}/{dll}";                if (!File.Exists(srcDllPath))                {                    Debug.LogError($"ab中添加AOT补充元数据dll:{srcDllPath} 时发生错误,文件不存在。" +                                   "裁剪后的AOT dll在BuildPlayer时才能生成,因此需要你先构建一次游戏App后再打包。");                    continue;                }                string dllBytesPath = $"{aotAssembliesDstDir}/{dll}.bytes";                byte[] data = File.ReadAllBytes(srcDllPath);                data = DllTool.KeyEncryption(data);                File.WriteAllBytes(dllBytesPath, data);                Debug.Log($"[CopyAOTAssembliesToStreamingAssets] copy AOT dll {srcDllPath} -> {dllBytesPath}");            }        }        /// <summary>        /// 复制热更的Dll到StreamingAssets, 在HybridCLR Setting中设置的。        /// </summary>        private static void CopyHotUpdateAssembliesToStreamingAssets(string hotfixAssembliesDstDir)        {            var target = EditorUserBuildSettings.activeBuildTarget;            string hotfixDllSrcDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);            foreach (var dll in SettingsUtil.HotUpdateAssemblyFilesExcludePreserved)            {                string dllPath = $"{hotfixDllSrcDir}/{dll}";                string dllBytesPath = $"{hotfixAssembliesDstDir}/{dll}.bytes";                byte[] data = File.ReadAllBytes(dllPath);                data = DllTool.KeyEncryption(data);                File.WriteAllBytes(dllBytesPath, data);                Debug.Log($"[CopyHotUpdateAssembliesToStreamingAssets] copy hotfix dll {dllPath} -> {dllBytesPath}");            }        }    }}
 |