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