[new] 新增GeneratedAOTGenericReferenceExcludeExistsAOTClassAndMethods,计算热更新引用的AOT泛型类型和函数时排除掉AOT中已经存在的泛型和函数,最终生成更精准的补充元数据程序集列表
parent
fc685a99ca
commit
aca7dd0a67
|
@ -17,12 +17,16 @@ namespace HybridCLR.Editor.AOT
|
||||||
public AssemblyReferenceDeepCollector Collector { get; set; }
|
public AssemblyReferenceDeepCollector Collector { get; set; }
|
||||||
|
|
||||||
public int MaxIterationCount { get; set; }
|
public int MaxIterationCount { get; set; }
|
||||||
|
|
||||||
|
public bool ComputeAotAssembly { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly int _maxInterationCount;
|
private readonly int _maxInterationCount;
|
||||||
|
|
||||||
private readonly AssemblyReferenceDeepCollector _assemblyCollector;
|
private readonly AssemblyReferenceDeepCollector _assemblyCollector;
|
||||||
|
|
||||||
|
private readonly bool _computeAotAssembly;
|
||||||
|
|
||||||
private readonly HashSet<GenericClass> _genericTypes = new HashSet<GenericClass>();
|
private readonly HashSet<GenericClass> _genericTypes = new HashSet<GenericClass>();
|
||||||
private readonly HashSet<GenericMethod> _genericMethods = new HashSet<GenericMethod>();
|
private readonly HashSet<GenericMethod> _genericMethods = new HashSet<GenericMethod>();
|
||||||
|
|
||||||
|
@ -47,6 +51,7 @@ namespace HybridCLR.Editor.AOT
|
||||||
{
|
{
|
||||||
_assemblyCollector = options.Collector;
|
_assemblyCollector = options.Collector;
|
||||||
_maxInterationCount = options.MaxIterationCount;
|
_maxInterationCount = options.MaxIterationCount;
|
||||||
|
_computeAotAssembly = options.ComputeAotAssembly;
|
||||||
_methodReferenceAnalyzer = new MethodReferenceAnalyzer(this.OnNewMethod);
|
_methodReferenceAnalyzer = new MethodReferenceAnalyzer(this.OnNewMethod);
|
||||||
_hotUpdateAssemblyFiles = new HashSet<string>(options.Collector.GetRootAssemblyNames().Select(assName => assName + ".dll"));
|
_hotUpdateAssemblyFiles = new HashSet<string>(options.Collector.GetRootAssemblyNames().Select(assName => assName + ".dll"));
|
||||||
}
|
}
|
||||||
|
@ -71,7 +76,7 @@ namespace HybridCLR.Editor.AOT
|
||||||
|
|
||||||
private bool IsAotType(TypeDef type)
|
private bool IsAotType(TypeDef type)
|
||||||
{
|
{
|
||||||
return !_hotUpdateAssemblyFiles.Contains(type.Module.Name);
|
return _computeAotAssembly || !_hotUpdateAssemblyFiles.Contains(type.Module.Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsAotGenericMethod(MethodDef method)
|
private bool IsAotGenericMethod(MethodDef method)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using HybridCLR.Editor.Meta;
|
using HybridCLR.Editor.Meta;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
@ -22,6 +23,10 @@ namespace HybridCLR.Editor.Commands
|
||||||
GenerateAOTGenericReference(target);
|
GenerateAOTGenericReference(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算热更代码中的泛型引用
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="target"></param>
|
||||||
public static void GenerateAOTGenericReference(BuildTarget target)
|
public static void GenerateAOTGenericReference(BuildTarget target)
|
||||||
{
|
{
|
||||||
var gs = SettingsUtil.HybridCLRSettings;
|
var gs = SettingsUtil.HybridCLRSettings;
|
||||||
|
@ -40,5 +45,88 @@ namespace HybridCLR.Editor.Commands
|
||||||
writer.Write(analyzer.AotGenericTypes.ToList(), analyzer.AotGenericMethods.ToList(), $"{Application.dataPath}/{gs.outputAOTGenericReferenceFile}");
|
writer.Write(analyzer.AotGenericTypes.ToList(), analyzer.AotGenericMethods.ToList(), $"{Application.dataPath}/{gs.outputAOTGenericReferenceFile}");
|
||||||
AssetDatabase.Refresh();
|
AssetDatabase.Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//[MenuItem("HybridCLR/Generate/AOTGenericReference2", priority = 103)]
|
||||||
|
//public static void GeneratedAOTGenericReferenceExcludeExists()
|
||||||
|
//{
|
||||||
|
// GeneratedAOTGenericReferenceExcludeExists(EditorUserBuildSettings.activeBuildTarget);
|
||||||
|
//}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算热更新代码中的泛型引用,但排除AOT已经存在的泛型引用
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="target"></param>
|
||||||
|
///
|
||||||
|
public static void GeneratedAOTGenericReferenceExcludeExistsAOTClassAndMethods(BuildTarget target)
|
||||||
|
{
|
||||||
|
|
||||||
|
var gs = SettingsUtil.HybridCLRSettings;
|
||||||
|
List<string> hotUpdateDllNames = SettingsUtil.HotUpdateAssemblyNamesExcludePreserved;
|
||||||
|
|
||||||
|
AssemblyReferenceDeepCollector hotUpdateCollector = new AssemblyReferenceDeepCollector(MetaUtil.CreateHotUpdateAndAOTAssemblyResolver(target, hotUpdateDllNames), hotUpdateDllNames);
|
||||||
|
var hotUpdateAnalyzer = new Analyzer(new Analyzer.Options
|
||||||
|
{
|
||||||
|
MaxIterationCount = Math.Min(10, gs.maxGenericReferenceIteration),
|
||||||
|
Collector = hotUpdateCollector,
|
||||||
|
});
|
||||||
|
|
||||||
|
hotUpdateAnalyzer.Run();
|
||||||
|
|
||||||
|
|
||||||
|
string aotDllDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);
|
||||||
|
List<string> aotAssemblyNames = Directory.Exists(aotDllDir) ?
|
||||||
|
Directory.GetFiles(aotDllDir, "*.dll", SearchOption.TopDirectoryOnly).Select(Path.GetFileNameWithoutExtension).ToList()
|
||||||
|
: new List<string>();
|
||||||
|
if (aotAssemblyNames.Count == 0)
|
||||||
|
{
|
||||||
|
throw new Exception($"no aot assembly found. please run `HybridCLR/Generate/All` or `HybridCLR/Generate/AotDlls` to generate aot dlls before runing `HybridCLR/Generate/AOTGenericReference`");
|
||||||
|
}
|
||||||
|
AssemblyReferenceDeepCollector aotCollector = new AssemblyReferenceDeepCollector(MetaUtil.CreateAOTAssemblyResolver(target), aotAssemblyNames);
|
||||||
|
var aotAnalyzer = new Analyzer(new Analyzer.Options
|
||||||
|
{
|
||||||
|
MaxIterationCount = Math.Min(10, gs.maxGenericReferenceIteration),
|
||||||
|
Collector = aotCollector,
|
||||||
|
ComputeAotAssembly = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
aotAnalyzer.Run();
|
||||||
|
|
||||||
|
var (resultTypes, resultMethods) = ExcludeExistAOTGenericTypeAndMethodss(hotUpdateAnalyzer.AotGenericTypes.ToList(), hotUpdateAnalyzer.AotGenericMethods.ToList(), aotAnalyzer.AotGenericTypes.ToList(), aotAnalyzer.AotGenericMethods.ToList());
|
||||||
|
var writer = new GenericReferenceWriter();
|
||||||
|
writer.Write(resultTypes, resultMethods, $"{Application.dataPath}/{gs.outputAOTGenericReferenceFile}");
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static (List<GenericClass>, List<GenericMethod>) ExcludeExistAOTGenericTypeAndMethodss(List<GenericClass> hotUpdateTypes, List<GenericMethod> hotUpdateMethods, List<GenericClass> aotTypes, List<GenericMethod> aotMethods)
|
||||||
|
{
|
||||||
|
var types = new List<GenericClass>();
|
||||||
|
|
||||||
|
var typeSig2Type = hotUpdateTypes.ToDictionary(t => t.Type.DefinitionAssembly.Name + ":" + t.ToTypeSig(), t => t);
|
||||||
|
foreach (var t in aotTypes)
|
||||||
|
{
|
||||||
|
string key = t.Type.DefinitionAssembly.Name + ":" + t.ToTypeSig();
|
||||||
|
if (typeSig2Type.TryGetValue(key, out var removedType))
|
||||||
|
{
|
||||||
|
typeSig2Type.Remove(key);
|
||||||
|
Debug.Log($"remove AOT type:{removedType.ToTypeSig()} ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var methodSig2Method = hotUpdateMethods.ToDictionary(m => m.Method.DeclaringType.DefinitionAssembly.Name + ":" + m.ToMethodSpec().ToString(), m => m);
|
||||||
|
foreach (var m in aotMethods)
|
||||||
|
{
|
||||||
|
string key = m.Method.DeclaringType.DefinitionAssembly.Name + ":" + m.ToMethodSpec().ToString();
|
||||||
|
if (methodSig2Method.TryGetValue(key, out var removedMethod))
|
||||||
|
{
|
||||||
|
methodSig2Method.Remove(key);
|
||||||
|
Debug.Log($"remove AOT method:{removedMethod.ToMethodSpec()} ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (typeSig2Type.Values.ToList(), methodSig2Method.Values.ToList());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue