Skip to content

Commit 6d524ba

Browse files
authored
Move compression code from BuildApk to utility class (#9383)
Context: #9382 To further simplify `BuildApk`, move assembly compression code to a separate utility class. This also lets us compress assemblies from tasks other than `BuildApk`.
1 parent 7bc14b9 commit 6d524ba

File tree

2 files changed

+60
-44
lines changed

2 files changed

+60
-44
lines changed

src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -515,49 +515,7 @@ string CompressAssembly (ITaskItem assembly)
515515
return assembly.ItemSpec;
516516
}
517517

518-
if (bool.TryParse (assembly.GetMetadata ("AndroidSkipCompression"), out bool value) && value) {
519-
Log.LogDebugMessage ($"Skipping compression of {assembly.ItemSpec} due to 'AndroidSkipCompression' == 'true' ");
520-
return assembly.ItemSpec;
521-
}
522-
523-
string key = CompressedAssemblyInfo.GetDictionaryKey (assembly);
524-
AndroidTargetArch arch = MonoAndroidHelper.GetTargetArch (assembly);
525-
if (!compressedAssembliesInfo.TryGetValue (arch, out Dictionary<string, CompressedAssemblyInfo> assembliesInfo)) {
526-
throw new InvalidOperationException ($"Internal error: compression assembly info for architecture {arch} not available");
527-
}
528-
529-
if (!assembliesInfo.TryGetValue (key, out CompressedAssemblyInfo info) || info == null) {
530-
Log.LogDebugMessage ($"Assembly missing from {nameof (CompressedAssemblyInfo)}: {key}");
531-
return assembly.ItemSpec;
532-
}
533-
534-
EnsureCompressedAssemblyData (assembly.ItemSpec, info.DescriptorIndex);
535-
string assemblyOutputDir;
536-
string subDirectory = assembly.GetMetadata ("DestinationSubDirectory");
537-
string abi = MonoAndroidHelper.GetAssemblyAbi (assembly);
538-
if (!String.IsNullOrEmpty (subDirectory)) {
539-
assemblyOutputDir = Path.Combine (compressedOutputDir, abi, subDirectory);
540-
} else {
541-
assemblyOutputDir = Path.Combine (compressedOutputDir, abi);
542-
}
543-
AssemblyCompression.CompressionResult result = AssemblyCompression.Compress (compressedAssembly, assemblyOutputDir);
544-
if (result != AssemblyCompression.CompressionResult.Success) {
545-
switch (result) {
546-
case AssemblyCompression.CompressionResult.EncodingFailed:
547-
Log.LogMessage ($"Failed to compress {assembly.ItemSpec}");
548-
break;
549-
550-
case AssemblyCompression.CompressionResult.InputTooBig:
551-
Log.LogMessage ($"Input assembly {assembly.ItemSpec} exceeds maximum input size");
552-
break;
553-
554-
default:
555-
Log.LogMessage ($"Unknown error compressing {assembly.ItemSpec}");
556-
break;
557-
}
558-
return assembly.ItemSpec;
559-
}
560-
return compressedAssembly.DestinationPath;
518+
return AssemblyCompression.Compress (Log, assembly, compressedAssembliesInfo, compressedOutputDir);
561519
}
562520
}
563521

src/Xamarin.Android.Build.Tasks/Utilities/AssemblyCompression.cs

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Buffers;
34
using System.IO;
45

56
using K4os.Compression.LZ4;
7+
using Microsoft.Android.Build.Tasks;
8+
using Microsoft.Build.Framework;
9+
using Microsoft.Build.Utilities;
10+
using Xamarin.Android.Tasks;
11+
using Xamarin.Android.Tools;
612

713
namespace Xamarin.Android.Tasks
814
{
@@ -49,7 +55,7 @@ public void SetData (string sourcePath, uint descriptorIndex)
4955

5056
static readonly ArrayPool<byte> bytePool = ArrayPool<byte>.Shared;
5157

52-
public static CompressionResult Compress (AssemblyData data, string outputDirectory)
58+
static CompressionResult Compress (AssemblyData data, string outputDirectory)
5359
{
5460
if (data == null)
5561
throw new ArgumentNullException (nameof (data));
@@ -104,5 +110,57 @@ public static CompressionResult Compress (AssemblyData data, string outputDirect
104110

105111
return CompressionResult.Success;
106112
}
113+
114+
public static string Compress (
115+
TaskLoggingHelper log,
116+
ITaskItem assembly,
117+
IDictionary<AndroidTargetArch, Dictionary<string, CompressedAssemblyInfo>> compressedAssembliesInfo,
118+
string compressedOutputDir)
119+
{
120+
if (bool.TryParse (assembly.GetMetadata ("AndroidSkipCompression"), out bool value) && value) {
121+
log.LogDebugMessage ($"Skipping compression of {assembly.ItemSpec} due to 'AndroidSkipCompression' == 'true' ");
122+
return assembly.ItemSpec;
123+
}
124+
125+
string key = CompressedAssemblyInfo.GetDictionaryKey (assembly);
126+
AndroidTargetArch arch = MonoAndroidHelper.GetTargetArch (assembly);
127+
if (!compressedAssembliesInfo.TryGetValue (arch, out Dictionary<string, CompressedAssemblyInfo> assembliesInfo)) {
128+
throw new InvalidOperationException ($"Internal error: compression assembly info for architecture {arch} not available");
129+
}
130+
131+
if (!assembliesInfo.TryGetValue (key, out CompressedAssemblyInfo info) || info == null) {
132+
log.LogDebugMessage ($"Assembly missing from {nameof (CompressedAssemblyInfo)}: {key}");
133+
return assembly.ItemSpec;
134+
}
135+
136+
AssemblyData compressedAssembly = new AssemblyData (assembly.ItemSpec, info.DescriptorIndex);
137+
string assemblyOutputDir;
138+
string subDirectory = assembly.GetMetadata ("DestinationSubDirectory");
139+
string abi = MonoAndroidHelper.GetAssemblyAbi (assembly);
140+
if (!String.IsNullOrEmpty (subDirectory) && !(subDirectory.EndsWith ($"{abi}/", StringComparison.Ordinal) || subDirectory.EndsWith ($"{abi}\\", StringComparison.Ordinal))) {
141+
assemblyOutputDir = Path.Combine (compressedOutputDir, abi, subDirectory);
142+
} else {
143+
assemblyOutputDir = Path.Combine (compressedOutputDir, abi);
144+
}
145+
146+
CompressionResult result = AssemblyCompression.Compress (compressedAssembly, assemblyOutputDir);
147+
if (result != CompressionResult.Success) {
148+
switch (result) {
149+
case AssemblyCompression.CompressionResult.EncodingFailed:
150+
log.LogMessage ($"Failed to compress {assembly.ItemSpec}");
151+
break;
152+
153+
case AssemblyCompression.CompressionResult.InputTooBig:
154+
log.LogMessage ($"Input assembly {assembly.ItemSpec} exceeds maximum input size");
155+
break;
156+
157+
default:
158+
log.LogMessage ($"Unknown error compressing {assembly.ItemSpec}");
159+
break;
160+
}
161+
return assembly.ItemSpec;
162+
}
163+
return compressedAssembly.DestinationPath;
164+
}
107165
}
108166
}

0 commit comments

Comments
 (0)