From 4c71d74b77c9eb62a0323698c9a0db3b641a917e Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 11 四月 2024 17:21:45 +0800
Subject: [PATCH] 0312 加密处理

---
 Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs |  320 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 298 insertions(+), 22 deletions(-)

diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
index 7ab6ca2..3c8416f 100644
--- a/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
@@ -6,7 +6,16 @@
 
 using UnityEngine.AssetBundles.AssetBundleDataSource;
 using Assets.Editor.Tool;
-
+using HybridCLR.Editor.Commands;
+using HybridCLR.Editor.Settings;
+//using Mono.Cecil;
+using DG.Tweening.Plugins.Core.PathCore;
+using System;
+using Path = System.IO.Path;
+using HybridCLR.Editor.HotUpdate;
+using HybridCLR.Editor;
+using System.Text;
+
 namespace UnityEngine.AssetBundles
 {
     [System.Serializable]
@@ -321,7 +330,10 @@
                     EditorGUI.indentLevel = indent;
                 }
             }
-
+            if (GUILayout.Button("HybridclrBuild(涓嶈兘鐑洿)"))
+            {
+                EditorApplication.delayCall += ExcuteBuildHybridclrBuild;
+            }
             // build.
             EditorGUILayout.Space();
             if (GUILayout.Button("Build All Assets"))
@@ -334,11 +346,6 @@
             if (GUILayout.Button("Config"))
             {
                 EditorApplication.delayCall += ExcuteBuildConfig;
-            }
-
-            if (GUILayout.Button("Lua"))
-            {
-                EditorApplication.delayCall += ExcuteBuildLua;
             }
 
             if (GUILayout.Button("UI"))
@@ -356,6 +363,11 @@
                 EditorApplication.delayCall += ExcuteBuildAudio;
             }
 
+            if (GUILayout.Button("Video"))
+            {
+                EditorApplication.delayCall += ExcuteBuildVideo;
+            }
+
             if (GUILayout.Button("Levels"))
             {
                 EditorApplication.delayCall += ExcuteBuildLevels;
@@ -364,8 +376,12 @@
             if (GUILayout.Button("MobEffectShader"))
             {
                 EditorApplication.delayCall += ExcuteBuildMobEffectShader;
+            }
+
+            if (GUILayout.Button("HybridclrUpdate"))
+            {
+                EditorApplication.delayCall += ExcuteBuildHybridclrUpdate;
             }
-
             EditorGUILayout.EndHorizontal();
 
             EditorGUILayout.Space();
@@ -378,6 +394,11 @@
             if (GUILayout.Button("Make VersionFile"))
             {
                 EditorApplication.delayCall += MakeAssetsVersionFile;
+            }
+
+            if (GUILayout.Button("Copy to StreamingAssets"))
+            {
+                EditorApplication.delayCall += CopyToStreamingAssets;
             }
 
             EditorGUILayout.EndHorizontal();
@@ -429,6 +450,13 @@
             publishers = EditorGUILayout.TextField("Publishers", publishers, GUILayout.Height(50));
             GUILayout.EndHorizontal();
 
+            EditorGUILayout.Space();
+            GUILayout.BeginHorizontal();
+
+            ClientPackage.includeConfig = EditorGUILayout.Toggle("Include Config ", ClientPackage.includeConfig, GUILayout.Width(250));
+            ClientPackage.includeUI = EditorGUILayout.Toggle("Include UI ", ClientPackage.includeUI, GUILayout.Width(250));
+
+            GUILayout.EndHorizontal();
             EditorGUILayout.Space();
             GUILayout.BeginHorizontal();
 
@@ -498,6 +526,13 @@
             EditorGUILayout.EndScrollView();
         }
 
+        private void CopyToStreamingAssets()
+        {
+            if (Directory.Exists(m_streamingPath))
+                Directory.Delete(m_streamingPath, true);
+            DirectoryCopy(m_UserData.m_OutputPath, m_streamingPath);
+        }
+
         private void ExecuteBuildAll()
         {
 
@@ -544,12 +579,13 @@
             }
 
             ExcuteBuildAudio();
+            ExcuteBuildVideo();
             ExcuteBuildMobEffectShader();
             ExcuteBuildConfig();
             ExcuteBuildLevels();
             ExcuteBuildUI();
             ExcuteBuildBuiltIn();
-            ExcuteBuildLua();
+            ExcuteBuildHybridclrUpdate();
 
             AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
 
@@ -563,12 +599,12 @@
             }
         }
 
-        private void ExcuteBuildAsset(string _category)
+        private void ExcuteBuildAsset(string _category, bool uncompressed = false)
         {
             BuildAssetBundleOptions opt = BuildAssetBundleOptions.None;
             if (AssetBundleModel.Model.DataSource.CanSpecifyBuildOptions)
             {
-                if (m_UserData.m_Compression == CompressOptions.Uncompressed)
+                if (m_UserData.m_Compression == CompressOptions.Uncompressed || uncompressed)
                 {
                     opt |= BuildAssetBundleOptions.UncompressedAssetBundle;
                 }
@@ -605,9 +641,12 @@
         {
             UpdateAudioSetting.SetAllAudioAssetBundleName();
             ExcuteBuildAsset("audio");
+        }
 
-            //   UpdateVideoSetting.SetAllVideoAssetBundleName();
-            //   ExcuteBuildAsset("video");
+        private void ExcuteBuildVideo()
+        {
+            UpdateVideoSetting.SetAllVideoAssetBundleName();
+            ExcuteBuildAsset("video");
         }
 
         private void ExcuteBuildMobEffectShader()
@@ -624,13 +663,198 @@
             ExcuteBuildAsset("config");
             TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(m_UserData.m_OutputPath, "/config"));
         }
-
-        private void ExcuteBuildLua()
+        //鍙戝寘鏃惰幏鍙栫儹鏇磀ll鍜岃鍓狝OT
+        private void ExcuteBuildHybridclrBuild()
         {
-            LuaBuildHelper.OnPreBuild();
-            UpdateLuaSetting.SetAllLuaAssetBundleName();
-            ExcuteBuildAsset("lua");
-            LuaBuildHelper.OnPostBuild();
+            //閲嶆柊鐢熸垚鐑洿dll鍜岃鍓狝OT
+            PrebuildCommand.GenerateAll();
+            // 杈撳嚭鍒癆ssetBundles鐩綍
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            outputPath = StringUtility.Contact(outputPath, "/logicbytes");
+            if (Directory.Exists(outputPath))
+                Directory.Delete(outputPath, true);
+            //澶嶅埗鏂扮敓鎴愮殑AOT dll鍒版寚瀹氳矾寰�
+            CopyAOTDataDll(outputPath);
+            //澶嶅埗鐑洿dll鍒版寚瀹氳矾寰�
+            CopyHotUpdateDll(outputPath);
+            AssetDatabase.Refresh();
+        }
+        //鐑洿鏂版椂鑾峰彇鐑洿dll
+        private void ExcuteBuildHybridclrUpdate()
+        {
+            //鐢熸垚鐑洿dll
+            CompileDllCommand.CompileDll(EditorUserBuildSettings.activeBuildTarget);
+            //鍒ゆ柇褰撳墠鐨刣ll鏈夋病鏈変娇鐢ㄤ簡琚鍓殑aot dll
+            if (IsAccessMissingMetadata())
+            {
+                DebugEx.LogError("褰撳墠鐑洿浠g爜浣跨敤浜嗚瑁佸壀鐨刟ot dll,璇蜂娇鐢℉ybridclrBuild閲嶆柊鐢熸垚,閲嶆柊鍑哄寘");
+                return;
+            }
+            // 杈撳嚭鍒癆ssetBundles鐩綍
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            outputPath = StringUtility.Contact(outputPath, "/logicbytes");
+            CopyHotUpdateDll(outputPath);
+            MakeBytesVersionFile();
+            AssetDatabase.Refresh();
+        }
+
+        private void MakeBytesVersionFile()
+        {
+            ChangeBytes();
+            var fileInfos = new List<FileInfo>();
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(m_UserData.m_OutputPath, "/logicbytes"), fileInfos);
+            BytesVersionMaker.WriteAssetsVersionFile(Path.Combine(Directory.GetParent(Application.dataPath).FullName, m_UserData.m_OutputPath), fileInfos);
+            Debug.Log("鐑洿鏂颁唬鐮佹洿鏂板畬姣曪紝鐢熸垚md5鏂囦欢");
+        }
+
+        //澶嶅埗瑁佸壀AOT鍒版寚瀹氱洰褰�
+        void CopyAOTDataDll(string outputPath)
+        {
+            //椤圭洰鏍圭洰褰�
+            string rootDir = Directory.GetParent(Application.dataPath).FullName.Replace(@"\", @"/");
+            //褰撳墠鏋勫缓鐨勫钩鍙板悕绉�
+            string platformName = "/" + EditorUserBuildSettings.activeBuildTarget + "/";
+            //涓婃鍑哄寘鏃朵娇鐢ㄧ殑AOT鎵�鍦ㄨ矾寰�
+            string checkAotDir = rootDir + "/HybridCLRData/CheckAssembliesPostIl2CppStrip" + platformName;
+            //HybridCLR Settings闈㈡澘涓婅缃殑瑁佸噺鍚嶢OT dll杈撳嚭鏍圭洰褰�
+            string strippedAOTDllOutputRootDir = "/" + HybridCLRSettings.Instance.strippedAOTDllOutputRootDir;
+            //閲嶆柊鐢熸垚鐨凙OT鎵�鍦ㄨ矾寰�
+            string aotDir = StringUtility.Contact(rootDir, strippedAOTDllOutputRootDir, platformName);
+
+            if (Directory.Exists(checkAotDir))
+            {
+                Directory.Delete(checkAotDir, true);
+                Directory.CreateDirectory(checkAotDir);
+            }
+            //澶嶅埗涓�浠藉嚭鍖呮椂浣跨敤鐨凙OT
+            CopyDirectoryToPath(aotDir, checkAotDir);
+
+            for (int i = 0; i < AOTGenericReferences.PatchedAOTAssemblyList.Count; i++)
+            {
+                string dllFile = StringUtility.Contact(aotDir, AOTGenericReferences.PatchedAOTAssemblyList[i]);
+                var outDllFile = outputPath + "/" + AOTGenericReferences.PatchedAOTAssemblyList[i] + ".bytes";
+                if (!File.Exists(dllFile))
+                {
+                    DebugEx.LogErrorFormat("閿欒锛歿0} 涓嶅瓨鍦�", dllFile);
+                    return;
+                }
+
+                FileExtersion.MakeSureDirectory(outDllFile);
+                File.Copy(dllFile, outDllFile, true);
+            }
+        }
+
+        //澶嶅埗鐑洿dll鍒版寚瀹氱洰褰�
+        void CopyHotUpdateDll(string outputPath)
+        {
+            //椤圭洰鏍圭洰褰�
+            string rootDir = Directory.GetParent(Application.dataPath).FullName.Replace(@"\", @"/");
+            //褰撳墠鏋勫缓鐨勫钩鍙板悕绉�
+            string platformName = "/" + EditorUserBuildSettings.activeBuildTarget + "/";
+            //HybridCLR Settings闈㈡澘涓婅缃殑鐑洿鏂癲ll缂栬瘧杈撳嚭鏍圭洰褰�
+            string hotUpdateDllCompileOutputRootDir = "/" + HybridCLRSettings.Instance.hotUpdateDllCompileOutputRootDir;
+            //鐑洿DLL鐢熸垚鐩綍
+            string hotDllDir = StringUtility.Contact(rootDir, hotUpdateDllCompileOutputRootDir, platformName);
+            //HybridCLR鐨凷ettings闈㈡澘涓婅缃殑鐑洿鏂癆ssembly Definitions 璧勬簮
+            var assemblyDefinitionAsset = HybridCLRSettings.Instance.hotUpdateAssemblyDefinitions;
+            for (int i = 0; i < assemblyDefinitionAsset.Length; i++)
+            {
+                string assemblyPath = AssetDatabase.GetAssetPath(assemblyDefinitionAsset[i]);
+                string assemblyName = Path.GetFileNameWithoutExtension(assemblyPath);
+
+                string dllFile = StringUtility.Contact(hotDllDir, assemblyName, ".dll");
+                var outDllFile = outputPath + "/" + assemblyName + ".dll.bytes";
+                if (!File.Exists(dllFile))
+                {
+                    DebugEx.LogErrorFormat("閿欒锛歿0} 涓嶅瓨鍦�", dllFile);
+                    return;
+                }
+                FileExtersion.MakeSureDirectory(outDllFile);
+                File.Copy(dllFile, outDllFile, true);
+            }
+
+            //HybridCLR鐨凷ettings闈㈡澘涓婅缃殑瑕佺儹鏇寸殑DLL璧勬簮
+            string[] hotUpdateAssemblies = HybridCLRSettings.Instance.hotUpdateAssemblies;
+            for (int i = 0; i < hotUpdateAssemblies.Length; i++)
+            {
+                string dllFile = StringUtility.Contact(hotDllDir, hotUpdateAssemblies[i], ".dll");
+                var outDllFile = outputPath + "/" + hotUpdateAssemblies[i] + ".dll.bytes";
+                if (!File.Exists(dllFile))
+                {
+                    DebugEx.LogErrorFormat("閿欒锛歿0} 涓嶅瓨鍦�", dllFile);
+                    return;
+                }
+                FileExtersion.MakeSureDirectory(outDllFile);
+                File.Copy(dllFile, outDllFile, true);
+            }
+
+            //HybridCLR鐨凷ettings闈㈡澘涓婅缃殑棰勭暀鐨勭儹鏇存柊dlls
+            string[] preserveHotUpdateAssemblies = HybridCLRSettings.Instance.preserveHotUpdateAssemblies;
+            for (int i = 0; i < preserveHotUpdateAssemblies.Length; i++)
+            {
+                string dllFile = StringUtility.Contact(hotDllDir, preserveHotUpdateAssemblies[i], ".dll");
+                var outDllFile = outputPath + "/" + preserveHotUpdateAssemblies[i] + ".dll.bytes";
+                if (!File.Exists(dllFile))
+                {
+                    DebugEx.LogWarningFormat("璀﹀憡锛氶鐣欑殑鐑洿鏂癲ll: {0} 涓嶅瓨鍦�", dllFile);
+                    continue;
+                }
+                FileExtersion.MakeSureDirectory(outDllFile);
+                File.Copy(dllFile, outDllFile, true);
+            }
+        }
+
+        //妫�鏌ョ洰鏍囨枃浠跺す涓嬫槸鍚︽湁鏂囦欢
+        bool IsFolderNotEmpty(string dir)
+        {
+            if (Directory.Exists(dir))
+            {
+                string[] files = Directory.GetFiles(dir);
+                if (files.Length > 0)
+                    return true;
+            }
+            return false;
+        }
+
+        //妫�鏌ョ儹鏇存柊浠g爜涓槸鍚﹀紩鐢ㄤ簡琚鍓殑绫诲瀷鎴栧嚱鏁�
+        bool IsAccessMissingMetadata()
+        {
+            //椤圭洰鏍圭洰褰�
+            string rootDir = Directory.GetParent(Application.dataPath).FullName.Replace(@"\", @"/");
+            //褰撳墠鏋勫缓鐨勫钩鍙板悕绉�
+            BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
+            string platformName = "/" + target + "/";
+            //涓婃鍑哄寘鏃朵娇鐢ㄧ殑AOT鎵�鍦ㄨ矾寰�
+            string checkAotDir = rootDir + "/HybridCLRData/CheckAssembliesPostIl2CppStrip" + platformName;
+
+            //涓婃鎵撳寘鏃朵繚瀛樼殑AOT鎵�鍦ㄦ枃浠跺す涓嶅瓨鍦ㄦ垨娌℃湁dll鏂囦欢
+            if (!IsFolderNotEmpty(checkAotDir))
+                return true;
+            var checker = new MissingMetadataChecker(checkAotDir, new List<string>());
+            string hotUpdateDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);
+            for (int i = 0; i < SettingsUtil.HotUpdateAssemblyFilesExcludePreserved.Count; i++)
+            {
+                string dllPath = hotUpdateDir + "/" + SettingsUtil.HotUpdateAssemblyFilesExcludePreserved[i];
+                bool notAnyMissing = checker.Check(dllPath);
+                if (!notAnyMissing)
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+        private void CopyDirectoryToPath(string sourceDir, string destinationDir)
+        {
+            // 濡傛灉鐩爣璺緞涓嶅瓨鍦紝鍒欏垱寤哄畠
+            if (!Directory.Exists(destinationDir))
+                Directory.CreateDirectory(destinationDir);
+            // 鑾峰彇鎵�鏈夋枃浠跺苟澶嶅埗
+            string[] files = Directory.GetFiles(sourceDir);
+            for (int i = 0; i < files.Length; i++)
+            {
+                string dest = Path.Combine(destinationDir, Path.GetFileName(files[i]));
+                File.Copy(files[i], dest, true); // true琛ㄧず濡傛灉鐩爣瀛樺湪锛屽垯瑕嗙洊
+            }
         }
 
         private void ExcuteBuildLevels()
@@ -686,8 +910,59 @@
         {
             var fileInfos = new List<FileInfo>();
             FileExtersion.GetAllDirectoryFileInfos(m_UserData.m_OutputPath, fileInfos);
-            AssetsVersionMaker.WriteAssetsVersionFile(Path.Combine(Directory.GetParent(Application.dataPath).FullName, m_UserData.m_OutputPath), fileInfos);
+            AssetsVersionMaker.WriteAssetsVersionFile(Path.Combine(Directory.GetParent(Application.dataPath).FullName, m_UserData.m_OutputPath), fileInfos);
+
+            Debug.Log("鐢熸垚AssetsVersion.txt鏂囦欢瀹屾瘯");
         }
+
+        void ChangeBytes()
+        {
+            string path = StringUtility.Contact(m_UserData.m_OutputPath, "/logicbytes/");
+            // 鍘熷DLL瀛楄妭鍐呭鏂囦欢鐨勮矾寰�  
+            string originalDllBytesFilePath = path + "Assembly-CSharp.dll.bytes";
+
+            // 涓存椂鏂囦欢鐨勮矾寰勶紝鐢ㄤ簬鍐欏叆"abc"鍚庡啀杩藉姞鍘熷DLL瀛楄妭鍐呭  
+            string tempFilePath = path + "temp_Assembly-CSharp.dll.bytes";
+
+            // 瑕佸啓鍏ョ殑瀛楃涓�"abc"  
+            string contentToWrite = "abc";
+
+            // 灏�"abc"杞崲涓哄瓧鑺傛暟缁�  
+            byte[] abcBytes = Encoding.ASCII.GetBytes(contentToWrite);
+
+            // 璇诲彇鍘熷DLL瀛楄妭鍐呭鍒板瓧鑺傛暟缁�  
+            byte[] originalDllBytes = File.ReadAllBytes(originalDllBytesFilePath);
+
+            // 灏�"abc"鍐欏叆涓存椂鏂囦欢  
+            using (FileStream fs = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write))
+            {
+                fs.Write(abcBytes, 0, abcBytes.Length);
+
+                // 杩藉姞鍘熷DLL瀛楄妭鍐呭鍒颁复鏃舵枃浠�  
+                fs.Write(originalDllBytes, 0, originalDllBytes.Length);
+            }
+
+            ReplaceFile(tempFilePath, originalDllBytesFilePath);
+        }
+
+        public void ReplaceFile(string sourceFile, string targetFile)
+        {
+            // 纭繚婧愭枃浠跺瓨鍦�  
+            if (!File.Exists(sourceFile))
+            {
+                throw new FileNotFoundException("婧愭枃浠舵湭鎵惧埌锛�" + sourceFile);
+            }
+
+            // 濡傛灉鐩爣鏂囦欢瀛樺湪锛屽垯鍒犻櫎瀹�  
+            if (File.Exists(targetFile))
+            {
+                File.Delete(targetFile);
+            }
+
+            // 灏嗘簮鏂囦欢閲嶅懡鍚嶄负鐩爣鏂囦欢  
+            File.Move(sourceFile, targetFile);
+        }
+
 
         static int packageIndex
         {
@@ -769,7 +1044,7 @@
             }
         }
 
-        private static void DirectoryCopy(string sourceDirName, string destDirName)
+        private static void DirectoryCopy(string sourceDirName, string destDirName, string excludeEx = null)
         {
             // Get the subdirectories for the specified directory.
             DirectoryInfo dir = new DirectoryInfo(sourceDirName);
@@ -785,7 +1060,8 @@
             foreach (FileInfo file in files)
             {
                 string temppath = Path.Combine(destDirName, file.Name);
-                file.CopyTo(temppath, false);
+                if (excludeEx == null || file.Extension != excludeEx)
+                    file.CopyTo(temppath, false);
             }
 
             DirectoryInfo[] dirs = dir.GetDirectories();

--
Gitblit v1.8.0