TaskCreateReport.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using UnityEditor;
  6. namespace YooAsset.Editor
  7. {
  8. public class TaskCreateReport
  9. {
  10. protected void CreateReportFile(BuildParametersContext buildParametersContext, BuildMapContext buildMapContext, ManifestContext manifestContext)
  11. {
  12. var buildParameters = buildParametersContext.Parameters;
  13. string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
  14. PackageManifest manifest = manifestContext.Manifest;
  15. BuildReport buildReport = new BuildReport();
  16. // 概述信息
  17. {
  18. buildReport.Summary.YooVersion = EditorTools.GetPackageManagerYooVersion();
  19. buildReport.Summary.UnityVersion = UnityEngine.Application.unityVersion;
  20. buildReport.Summary.BuildDate = DateTime.Now.ToString();
  21. buildReport.Summary.BuildSeconds = BuildRunner.TotalSeconds;
  22. buildReport.Summary.BuildTarget = buildParameters.BuildTarget;
  23. buildReport.Summary.BuildPipeline = buildParameters.BuildPipeline;
  24. buildReport.Summary.BuildBundleType = buildParameters.BuildBundleType;
  25. buildReport.Summary.BuildPackageName = buildParameters.PackageName;
  26. buildReport.Summary.BuildPackageVersion = buildParameters.PackageVersion;
  27. buildReport.Summary.BuildPackageNote = buildParameters.PackageNote;
  28. // 收集器配置
  29. buildReport.Summary.UniqueBundleName = buildMapContext.Command.UniqueBundleName;
  30. buildReport.Summary.EnableAddressable = buildMapContext.Command.EnableAddressable;
  31. buildReport.Summary.SupportExtensionless = buildMapContext.Command.SupportExtensionless;
  32. buildReport.Summary.LocationToLower = buildMapContext.Command.LocationToLower;
  33. buildReport.Summary.IncludeAssetGUID = buildMapContext.Command.IncludeAssetGUID;
  34. buildReport.Summary.AutoCollectShaders = buildMapContext.Command.AutoCollectShaders;
  35. buildReport.Summary.IgnoreRuleName = buildMapContext.Command.IgnoreRule.GetType().FullName;
  36. // 构建参数
  37. buildReport.Summary.ClearBuildCacheFiles = buildParameters.ClearBuildCacheFiles;
  38. buildReport.Summary.UseAssetDependencyDB = buildParameters.UseAssetDependencyDB;
  39. buildReport.Summary.EnableSharePackRule = buildParameters.EnableSharePackRule;
  40. buildReport.Summary.SingleReferencedPackAlone = buildParameters.SingleReferencedPackAlone;
  41. buildReport.Summary.FileNameStyle = buildParameters.FileNameStyle;
  42. buildReport.Summary.EncryptionServicesClassName = buildParameters.EncryptionServices == null ? "null" : buildParameters.EncryptionServices.GetType().FullName;
  43. buildReport.Summary.ManifestProcessServicesClassName = buildParameters.ManifestProcessServices == null ? "null" : buildParameters.ManifestProcessServices.GetType().FullName;
  44. buildReport.Summary.ManifestRestoreServicesClassName = buildParameters.ManifestRestoreServices == null ? "null" : buildParameters.ManifestRestoreServices.GetType().FullName;
  45. if (buildParameters is BuiltinBuildParameters)
  46. {
  47. var builtinBuildParameters = buildParameters as BuiltinBuildParameters;
  48. buildReport.Summary.CompressOption = builtinBuildParameters.CompressOption;
  49. buildReport.Summary.DisableWriteTypeTree = builtinBuildParameters.DisableWriteTypeTree;
  50. buildReport.Summary.IgnoreTypeTreeChanges = builtinBuildParameters.IgnoreTypeTreeChanges;
  51. buildReport.Summary.ReplaceAssetPathWithAddress = builtinBuildParameters.ReplaceAssetPathWithAddress;
  52. }
  53. else if (buildParameters is ScriptableBuildParameters)
  54. {
  55. var scriptableBuildParameters = buildParameters as ScriptableBuildParameters;
  56. buildReport.Summary.CompressOption = scriptableBuildParameters.CompressOption;
  57. buildReport.Summary.DisableWriteTypeTree = scriptableBuildParameters.DisableWriteTypeTree;
  58. buildReport.Summary.IgnoreTypeTreeChanges = scriptableBuildParameters.IgnoreTypeTreeChanges;
  59. buildReport.Summary.ReplaceAssetPathWithAddress = scriptableBuildParameters.ReplaceAssetPathWithAddress;
  60. buildReport.Summary.WriteLinkXML = scriptableBuildParameters.WriteLinkXML;
  61. buildReport.Summary.CacheServerHost = scriptableBuildParameters.CacheServerHost;
  62. buildReport.Summary.CacheServerPort = scriptableBuildParameters.CacheServerPort;
  63. buildReport.Summary.BuiltinShadersBundleName = scriptableBuildParameters.BuiltinShadersBundleName;
  64. buildReport.Summary.MonoScriptsBundleName = scriptableBuildParameters.MonoScriptsBundleName;
  65. }
  66. // 构建结果
  67. buildReport.Summary.AssetFileTotalCount = buildMapContext.AssetFileCount;
  68. buildReport.Summary.MainAssetTotalCount = GetMainAssetCount(manifest);
  69. buildReport.Summary.AllBundleTotalCount = GetAllBundleCount(manifest);
  70. buildReport.Summary.AllBundleTotalSize = GetAllBundleSize(manifest);
  71. buildReport.Summary.EncryptedBundleTotalCount = GetEncryptedBundleCount(manifest);
  72. buildReport.Summary.EncryptedBundleTotalSize = GetEncryptedBundleSize(manifest);
  73. }
  74. // 资源对象列表
  75. buildReport.AssetInfos = new List<ReportAssetInfo>(manifest.AssetList.Count);
  76. foreach (var packageAsset in manifest.AssetList)
  77. {
  78. var mainBundle = manifest.BundleList[packageAsset.BundleID];
  79. ReportAssetInfo reportAssetInfo = new ReportAssetInfo();
  80. reportAssetInfo.Address = packageAsset.Address;
  81. reportAssetInfo.AssetPath = packageAsset.AssetPath;
  82. reportAssetInfo.AssetTags = packageAsset.AssetTags;
  83. reportAssetInfo.AssetGUID = AssetDatabase.AssetPathToGUID(packageAsset.AssetPath);
  84. reportAssetInfo.MainBundleName = mainBundle.BundleName;
  85. reportAssetInfo.MainBundleSize = mainBundle.FileSize;
  86. reportAssetInfo.DependAssets = GetAssetDependAssets(buildMapContext, mainBundle.BundleName, packageAsset.AssetPath);
  87. reportAssetInfo.DependBundles = GetAssetDependBundles(manifest, packageAsset);
  88. buildReport.AssetInfos.Add(reportAssetInfo);
  89. }
  90. // 资源包列表
  91. buildReport.BundleInfos = new List<ReportBundleInfo>(manifest.BundleList.Count);
  92. foreach (var packageBundle in manifest.BundleList)
  93. {
  94. ReportBundleInfo reportBundleInfo = new ReportBundleInfo();
  95. reportBundleInfo.BundleName = packageBundle.BundleName;
  96. reportBundleInfo.FileName = packageBundle.FileName;
  97. reportBundleInfo.FileHash = packageBundle.FileHash;
  98. reportBundleInfo.FileCRC = packageBundle.FileCRC;
  99. reportBundleInfo.FileSize = packageBundle.FileSize;
  100. reportBundleInfo.Encrypted = packageBundle.Encrypted;
  101. reportBundleInfo.Tags = packageBundle.Tags;
  102. reportBundleInfo.DependBundles = GetBundleDependBundles(manifest, packageBundle);
  103. reportBundleInfo.ReferenceBundles = GetBundleReferenceBundles(manifest, packageBundle);
  104. reportBundleInfo.BundleContents = GetBundleContents(buildMapContext, packageBundle.BundleName);
  105. buildReport.BundleInfos.Add(reportBundleInfo);
  106. }
  107. // 其它资源列表
  108. buildReport.IndependAssets = new List<ReportIndependAsset>(buildMapContext.IndependAssets);
  109. // 序列化文件
  110. string fileName = YooAssetSettingsData.GetBuildReportFileName(buildParameters.PackageName, buildParameters.PackageVersion);
  111. string filePath = $"{packageOutputDirectory}/{fileName}";
  112. BuildReport.Serialize(filePath, buildReport);
  113. BuildLogger.Log($"Create build report file: {filePath}");
  114. }
  115. /// <summary>
  116. /// 获取资源对象依赖的其它所有资源
  117. /// </summary>
  118. private List<AssetInfo> GetAssetDependAssets(BuildMapContext buildMapContext, string bundleName, string assetPath)
  119. {
  120. List<AssetInfo> result = new List<AssetInfo>();
  121. var bundleInfo = buildMapContext.GetBundleInfo(bundleName);
  122. var assetInfo = bundleInfo.GetPackAssetInfo(assetPath);
  123. foreach (var dependAssetInfo in assetInfo.AllDependAssetInfos)
  124. {
  125. result.Add(dependAssetInfo.AssetInfo);
  126. }
  127. result.Sort();
  128. return result;
  129. }
  130. /// <summary>
  131. /// 获取资源对象依赖的资源包集合
  132. /// </summary>
  133. private List<string> GetAssetDependBundles(PackageManifest manifest, PackageAsset packageAsset)
  134. {
  135. List<string> dependBundles = new List<string>(packageAsset.DependBundleIDs.Length);
  136. foreach (int index in packageAsset.DependBundleIDs)
  137. {
  138. string dependBundleName = manifest.BundleList[index].BundleName;
  139. dependBundles.Add(dependBundleName);
  140. }
  141. dependBundles.Sort();
  142. return dependBundles;
  143. }
  144. /// <summary>
  145. /// 获取资源包依赖的资源包集合
  146. /// </summary>
  147. private List<string> GetBundleDependBundles(PackageManifest manifest, PackageBundle packageBundle)
  148. {
  149. List<string> dependBundles = new List<string>(packageBundle.DependBundleIDs.Length);
  150. foreach (int index in packageBundle.DependBundleIDs)
  151. {
  152. string dependBundleName = manifest.BundleList[index].BundleName;
  153. dependBundles.Add(dependBundleName);
  154. }
  155. dependBundles.Sort();
  156. return dependBundles;
  157. }
  158. /// <summary>
  159. /// 获取引用该资源包的资源包集合
  160. /// </summary>
  161. private List<string> GetBundleReferenceBundles(PackageManifest manifest, PackageBundle packageBundle)
  162. {
  163. List<string> referenceBundles = new List<string>(packageBundle.ReferenceBundleIDs.Count);
  164. foreach (int index in packageBundle.ReferenceBundleIDs)
  165. {
  166. string dependBundleName = manifest.BundleList[index].BundleName;
  167. referenceBundles.Add(dependBundleName);
  168. }
  169. referenceBundles.Sort();
  170. return referenceBundles;
  171. }
  172. /// <summary>
  173. /// 获取资源包内部所有资产
  174. /// </summary>
  175. private List<AssetInfo> GetBundleContents(BuildMapContext buildMapContext, string bundleName)
  176. {
  177. var bundleInfo = buildMapContext.GetBundleInfo(bundleName);
  178. List<AssetInfo> result = bundleInfo.GetBundleContents();
  179. result.Sort();
  180. return result;
  181. }
  182. private int GetMainAssetCount(PackageManifest manifest)
  183. {
  184. return manifest.AssetList.Count;
  185. }
  186. private int GetAllBundleCount(PackageManifest manifest)
  187. {
  188. return manifest.BundleList.Count;
  189. }
  190. private long GetAllBundleSize(PackageManifest manifest)
  191. {
  192. long fileBytes = 0;
  193. foreach (var packageBundle in manifest.BundleList)
  194. {
  195. fileBytes += packageBundle.FileSize;
  196. }
  197. return fileBytes;
  198. }
  199. private int GetEncryptedBundleCount(PackageManifest manifest)
  200. {
  201. int fileCount = 0;
  202. foreach (var packageBundle in manifest.BundleList)
  203. {
  204. if (packageBundle.Encrypted)
  205. fileCount++;
  206. }
  207. return fileCount;
  208. }
  209. private long GetEncryptedBundleSize(PackageManifest manifest)
  210. {
  211. long fileBytes = 0;
  212. foreach (var packageBundle in manifest.BundleList)
  213. {
  214. if (packageBundle.Encrypted)
  215. fileBytes += packageBundle.FileSize;
  216. }
  217. return fileBytes;
  218. }
  219. }
  220. }