From 0e2f5e77cc71f79d1276df3a5f47e83888aa2915 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 9 Oct 2024 17:23:53 +0200 Subject: [PATCH] Move compression code from BuildApk to utility class --- .../Tasks/BuildApk.cs | 44 +------------- .../Utilities/AssemblyCompression.cs | 60 ++++++++++++++++++- 2 files changed, 60 insertions(+), 44 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs b/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs index 46c60436728..38a8f9d357a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs @@ -563,49 +563,7 @@ string CompressAssembly (ITaskItem assembly) return assembly.ItemSpec; } - if (bool.TryParse (assembly.GetMetadata ("AndroidSkipCompression"), out bool value) && value) { - Log.LogDebugMessage ($"Skipping compression of {assembly.ItemSpec} due to 'AndroidSkipCompression' == 'true' "); - return assembly.ItemSpec; - } - - string key = CompressedAssemblyInfo.GetDictionaryKey (assembly); - AndroidTargetArch arch = MonoAndroidHelper.GetTargetArch (assembly); - if (!compressedAssembliesInfo.TryGetValue (arch, out Dictionary assembliesInfo)) { - throw new InvalidOperationException ($"Internal error: compression assembly info for architecture {arch} not available"); - } - - if (!assembliesInfo.TryGetValue (key, out CompressedAssemblyInfo info) || info == null) { - Log.LogDebugMessage ($"Assembly missing from {nameof (CompressedAssemblyInfo)}: {key}"); - return assembly.ItemSpec; - } - - EnsureCompressedAssemblyData (assembly.ItemSpec, info.DescriptorIndex); - string assemblyOutputDir; - string subDirectory = assembly.GetMetadata ("DestinationSubDirectory"); - string abi = MonoAndroidHelper.GetAssemblyAbi (assembly); - if (!String.IsNullOrEmpty (subDirectory)) { - assemblyOutputDir = Path.Combine (compressedOutputDir, abi, subDirectory); - } else { - assemblyOutputDir = Path.Combine (compressedOutputDir, abi); - } - AssemblyCompression.CompressionResult result = AssemblyCompression.Compress (compressedAssembly, assemblyOutputDir); - if (result != AssemblyCompression.CompressionResult.Success) { - switch (result) { - case AssemblyCompression.CompressionResult.EncodingFailed: - Log.LogMessage ($"Failed to compress {assembly.ItemSpec}"); - break; - - case AssemblyCompression.CompressionResult.InputTooBig: - Log.LogMessage ($"Input assembly {assembly.ItemSpec} exceeds maximum input size"); - break; - - default: - Log.LogMessage ($"Unknown error compressing {assembly.ItemSpec}"); - break; - } - return assembly.ItemSpec; - } - return compressedAssembly.DestinationPath; + return AssemblyCompression.Compress (Log, assembly, compressedAssembliesInfo, compressedOutputDir); } } diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/AssemblyCompression.cs b/src/Xamarin.Android.Build.Tasks/Utilities/AssemblyCompression.cs index afc59881fed..cf9a865b9c4 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/AssemblyCompression.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/AssemblyCompression.cs @@ -1,8 +1,14 @@ using System; +using System.Collections.Generic; using System.Buffers; using System.IO; using K4os.Compression.LZ4; +using Microsoft.Android.Build.Tasks; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Xamarin.Android.Tasks; +using Xamarin.Android.Tools; namespace Xamarin.Android.Tasks { @@ -49,7 +55,7 @@ public void SetData (string sourcePath, uint descriptorIndex) static readonly ArrayPool bytePool = ArrayPool.Shared; - public static CompressionResult Compress (AssemblyData data, string outputDirectory) + static CompressionResult Compress (AssemblyData data, string outputDirectory) { if (data == null) throw new ArgumentNullException (nameof (data)); @@ -104,5 +110,57 @@ public static CompressionResult Compress (AssemblyData data, string outputDirect return CompressionResult.Success; } + + public static string Compress ( + TaskLoggingHelper log, + ITaskItem assembly, + IDictionary> compressedAssembliesInfo, + string compressedOutputDir) + { + if (bool.TryParse (assembly.GetMetadata ("AndroidSkipCompression"), out bool value) && value) { + log.LogDebugMessage ($"Skipping compression of {assembly.ItemSpec} due to 'AndroidSkipCompression' == 'true' "); + return assembly.ItemSpec; + } + + string key = CompressedAssemblyInfo.GetDictionaryKey (assembly); + AndroidTargetArch arch = MonoAndroidHelper.GetTargetArch (assembly); + if (!compressedAssembliesInfo.TryGetValue (arch, out Dictionary assembliesInfo)) { + throw new InvalidOperationException ($"Internal error: compression assembly info for architecture {arch} not available"); + } + + if (!assembliesInfo.TryGetValue (key, out CompressedAssemblyInfo info) || info == null) { + log.LogDebugMessage ($"Assembly missing from {nameof (CompressedAssemblyInfo)}: {key}"); + return assembly.ItemSpec; + } + + AssemblyData compressedAssembly = new AssemblyData (assembly.ItemSpec, info.DescriptorIndex); + string assemblyOutputDir; + string subDirectory = assembly.GetMetadata ("DestinationSubDirectory"); + string abi = MonoAndroidHelper.GetAssemblyAbi (assembly); + if (!String.IsNullOrEmpty (subDirectory) && !(subDirectory.EndsWith ($"{abi}/", StringComparison.Ordinal) || subDirectory.EndsWith ($"{abi}\\", StringComparison.Ordinal))) { + assemblyOutputDir = Path.Combine (compressedOutputDir, abi, subDirectory); + } else { + assemblyOutputDir = Path.Combine (compressedOutputDir, abi); + } + + CompressionResult result = AssemblyCompression.Compress (compressedAssembly, assemblyOutputDir); + if (result != CompressionResult.Success) { + switch (result) { + case AssemblyCompression.CompressionResult.EncodingFailed: + log.LogMessage ($"Failed to compress {assembly.ItemSpec}"); + break; + + case AssemblyCompression.CompressionResult.InputTooBig: + log.LogMessage ($"Input assembly {assembly.ItemSpec} exceeds maximum input size"); + break; + + default: + log.LogMessage ($"Unknown error compressing {assembly.ItemSpec}"); + break; + } + return assembly.ItemSpec; + } + return compressedAssembly.DestinationPath; + } } }