private static BuildArtifactsInfo CreateForStandaloneWin(string buildPath, string dataDirectoryOverride) { var dataDirectory = DropExtension(buildPath) + "_Data"; if (!string.IsNullOrEmpty(dataDirectoryOverride)) { dataDirectory = dataDirectoryOverride; } var result = CreateFromFileSystem(dataDirectory, dataDirectory, "StreamingAssets"); result.runtimeSize = result.runtimeSize.uncompressed + GetDirectorySizeNoThrow(ReliablePath.Combine(dataDirectory, "Mono")); // get the exe var additionalRuntimeSize = GetFileSizeNoThrow(buildPath); if (UnityVersionAgnostic.HasStuffInRootForStandaloneBuild) { var directory = ReliablePath.GetDirectoryName(buildPath); additionalRuntimeSize += GetFileSizeNoThrow(ReliablePath.Combine(directory, "UnityPlayer.dll"), logError: false); additionalRuntimeSize += GetFileSizeNoThrow(ReliablePath.Combine(directory, "UnityCrashHandler64.exe"), logError: false); additionalRuntimeSize += GetDirectorySizeNoThrow(ReliablePath.Combine(directory, "Mono")); } result.totalSize.uncompressed += additionalRuntimeSize; result.runtimeSize.uncompressed += additionalRuntimeSize; return(result); }
private static BuildArtifactsInfo CreateFromFileSystem(string totalSizeDir, string dataDirectory, string streamingAssetsName) { var modulesDirectory = ReliablePath.Combine(dataDirectory, "Managed"); var streamingAssetsDirectory = ReliablePath.Combine(dataDirectory, streamingAssetsName); Dictionary <string, SizePair> modules = new Dictionary <string, SizePair>(); long runtimeSize = 0; if (Directory.Exists(modulesDirectory)) { // dlls are included as assets, so don't count them as runtime size modules = Directory.GetFiles(modulesDirectory, "*.dll", SearchOption.TopDirectoryOnly) .ToDictionary(x => ReliablePath.GetFileName(x), x => (SizePair)GetFileSizeNoThrow(x)); runtimeSize = GetDirectorySizeNoThrow(modulesDirectory) - Enumerable.Sum(modules, x => x.Value.uncompressed); } var unityResources = s_unityResourcesNames .Select(x => new { Relative = x, Actual = ReliablePath.Combine(dataDirectory, x) }) .Where(x => !Directory.Exists(x.Actual)) .Select(x => new { x.Relative, File = new FileInfo(x.Actual) }) .Where(x => x.File.Exists) .ToDictionary(x => x.Relative, x => (SizePair)x.File.Length); return(new BuildArtifactsInfo() { totalSize = GetDirectorySizeNoThrow(totalSizeDir), streamingAssetsSize = GetDirectorySizeNoThrow(streamingAssetsDirectory), runtimeSize = runtimeSize, managedModules = modules, unityResources = unityResources, sceneSizes = CalculateScenesSizes(x => { var fileInfo = new FileInfo(ReliablePath.Combine(dataDirectory, x)); if (!fileInfo.Exists) { return null; } return fileInfo.Length; }) }); }
private static BuildArtifactsInfo CreateForWebGL(string buildPath) { var compressedSize = GetDirectorySizeNoThrow(buildPath); var totalSize = compressedSize; var streamingAssetsSize = GetDirectorySizeNoThrow(ReliablePath.Combine(buildPath, "StreamingAssets")); var latestReport = UnityVersionAgnostic.GetLatestBuildReport(); if (latestReport == null) { throw new System.InvalidOperationException("Unable to retreive native Unity report"); } var prop = new SerializedObject(latestReport).FindPropertyOrThrow("m_Files"); var scenes = new List <SizePair>(); var modules = new Dictionary <string, SizePair>(); for (int propIdx = 0; propIdx < prop.arraySize; ++propIdx) { var elem = prop.GetArrayElementAtIndex(propIdx); var role = elem.FindPropertyRelativeOrThrow("role").stringValue; if (role == "Scene") { var path = elem.FindPropertyRelativeOrThrow("path").stringValue; var prefix = "level"; var lastIndex = path.LastIndexOf(prefix); if (lastIndex < 0) { Log.Warning("Unexpected level path: " + path); continue; } var levelNumberStr = path.Substring(lastIndex + prefix.Length); var levelNumber = int.Parse(levelNumberStr); // pad with zeros for (int i = scenes.Count; i <= levelNumber; ++i) { scenes.Add(0); } var s = elem.FindPropertyRelative("totalSize").longValue; scenes[levelNumber] = new SizePair(s, s); } else if (role == "DependentManagedLibrary" || role == "ManagedLibrary") { var path = elem.FindPropertyRelativeOrThrow("path").stringValue; var prefix = "/Managed/"; var lastIndex = path.LastIndexOf(prefix); if (lastIndex < 0) { Log.Warning("Unexpected module path: " + path); continue; } var moduleName = path.Substring(lastIndex + prefix.Length); var s = elem.FindPropertyRelative("totalSize").longValue; modules.Add(moduleName, new SizePair(0, s)); } } // try to run 7z to get actual data size var releaseDir = ReliablePath.Combine(buildPath, "Release"); if (Directory.Exists(releaseDir)) { var buildName = buildPath.Split(new[] { "/", "\\" }, StringSplitOptions.RemoveEmptyEntries).Last(); var zipPath = ReliablePath.Combine(releaseDir, buildName + ".datagz"); var uncompressedSize = Get7ZipArchiveUncompressedSize(zipPath); if (uncompressedSize >= 0) { totalSize += uncompressedSize; totalSize -= GetFileSizeNoThrow(zipPath); } } else { var buildDir = ReliablePath.Combine(buildPath, "Build"); if (Directory.Exists(buildDir)) { foreach (var compressedFile in Directory.GetFiles(buildDir, "*.unityweb")) { var uncompressedSize = Get7ZipArchiveUncompressedSize(compressedFile); if (uncompressedSize >= 0) { totalSize += uncompressedSize; totalSize -= GetFileSizeNoThrow(compressedFile); } } } } return(new BuildArtifactsInfo() { totalSize = new SizePair(compressedSize, totalSize), streamingAssetsSize = streamingAssetsSize, sceneSizes = scenes, managedModules = modules, }); }
private static string DropExtension(string path) { return(ReliablePath.Combine(ReliablePath.GetDirectoryName(path), ReliablePath.GetFileNameWithoutExtension(path))); }
private static BuildArtifactsInfo CreateForIOS(string buildPath) { var dataDirectory = ReliablePath.Combine(buildPath, "Data"); return(CreateFromFileSystem(dataDirectory, dataDirectory, "Raw")); }