obfuz/Samples/WorkWithHybridCLR/Assets/Editor/BuildTool.cs

92 lines
3.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using HybridCLR.Editor.Commands;
using HybridCLR.Editor;
using Obfuz.Settings;
using Obfuz;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.Reflection;
using System;
using System.IO;
using HybridCLR.Editor.Link;
using HybridCLR.Editor.Meta;
public class BuildTool : MonoBehaviour
{
[MenuItem("Obfuz/GenerateLinkXmlForHybridCLR")]
public static void GenerateLinkXml()
{
CompileDllCommand.CompileDllActiveBuildTarget();
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
var obfuzSettings = ObfuzSettings.Instance;
var assemblySearchDirs = new List<string>
{
SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target),
};
ObfuscatorBuilder builder = ObfuscatorBuilder.FromObfuzSettings(obfuzSettings, target, true);
builder.InsertTopPriorityAssemblySearchPaths(assemblySearchDirs);
Obfuscator obfuz = builder.Build();
obfuz.Run();
List<string> hotfixAssemblies = SettingsUtil.HotUpdateAssemblyNamesExcludePreserved;
var analyzer = new Analyzer(new PathAssemblyResolver(builder.ObfuscatedAssemblyOutputPath));
var refTypes = analyzer.CollectRefs(hotfixAssemblies);
// HyridCLR中 LinkXmlWritter不是public的在其他程序集无法访问只能通过反射操作
var linkXmlWriter = typeof(SettingsUtil).Assembly.GetType("HybridCLR.Editor.Link.LinkXmlWriter");
var writeMethod = linkXmlWriter.GetMethod("Write", BindingFlags.Public | BindingFlags.Instance);
var instance = Activator.CreateInstance(linkXmlWriter);
string linkXmlOutputPath = $"{Application.dataPath}/Obfuz/link.xml";
writeMethod.Invoke(instance, new object[] { linkXmlOutputPath, refTypes });
Debug.Log($"[GenerateLinkXmlForObfuscatedAssembly] output:{linkXmlOutputPath}");
AssetDatabase.Refresh();
}
[MenuItem("Obfuz/CompileAndObfuscateAndCopyToStreamingAssets")]
public static void CompileAndObfuscateAndCopyToStreamingAssets()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
string outputPath = ObfuzSettings.Instance.GetObfuscatedAssemblyOutputPath(target);
CompileAndObfuscate(target, outputPath);
Directory.CreateDirectory(Application.streamingAssetsPath);
foreach (string assName in SettingsUtil.HotUpdateAssemblyNamesIncludePreserved)
{
string srcFile = $"{outputPath}/{assName}.dll";
string dstFile = $"{Application.streamingAssetsPath}/{assName}.dll.bytes";
File.Copy(srcFile, dstFile, true);
Debug.Log($"[CompileAndObfuscate] Copy {srcFile} to {dstFile}");
}
}
public static void CompileAndObfuscate(BuildTarget target, string outputPath)
{
CompileDllCommand.CompileDll(EditorUserBuildSettings.activeBuildTarget, EditorUserBuildSettings.development);
var assemblySearchPaths = new List<string>
{
SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target),
};
CustomObfuscate(target, assemblySearchPaths, outputPath);
}
public static void CustomObfuscate(BuildTarget target, List<string> assemblySearchPaths, string outputPath)
{
var obfuzSettings = ObfuzSettings.Instance;
var assemblySearchDirs = assemblySearchPaths;
ObfuscatorBuilder builder = ObfuscatorBuilder.FromObfuzSettings(obfuzSettings, target, true);
builder.InsertTopPriorityAssemblySearchPaths(assemblySearchDirs);
builder.ObfuscatedAssemblyOutputPath = outputPath;
Obfuscator obfuz = builder.Build();
obfuz.Run();
}
}