Skip to content

Commit db53272

Browse files
committed
A handful of NRT fixes + reuse shared code
1 parent a1665db commit db53272

File tree

4 files changed

+64
-98
lines changed

4 files changed

+64
-98
lines changed

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

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -36,49 +36,16 @@ public class CreateAssemblyStore : AndroidTask
3636
public override bool RunTask ()
3737
{
3838
// Get all the user and framework assemblies we may need to package
39-
var assemblies = ResolvedFrameworkAssemblies.Concat (ResolvedUserAssemblies).Where (asm => !(ShouldSkipAssembly (asm))).ToArray ();
39+
var assemblies = ResolvedFrameworkAssemblies.Concat (ResolvedUserAssemblies).Where (asm => !(AssemblyPackagingHelper.ShouldSkipAssembly (Log, asm)));
4040

4141
if (!UseAssemblyStore) {
42-
AssembliesToAddToArchive = assemblies;
42+
AssembliesToAddToArchive = assemblies.ToArray ();
4343
return !Log.HasLoggedErrors;
4444
}
4545

46-
var store_builder = new AssemblyStoreBuilder (Log);
47-
var per_arch_assemblies = MonoAndroidHelper.GetPerArchAssemblies (assemblies, SupportedAbis, true);
48-
49-
foreach (var kvp in per_arch_assemblies) {
50-
Log.LogDebugMessage ($"Adding assemblies for architecture '{kvp.Key}'");
51-
52-
foreach (var assembly in kvp.Value.Values) {
53-
var sourcePath = assembly.GetMetadataOrDefault ("CompressedAssembly", assembly.ItemSpec);
54-
store_builder.AddAssembly (sourcePath, assembly, includeDebugSymbols: IncludeDebugSymbols);
55-
56-
Log.LogDebugMessage ($"Added '{sourcePath}' to assembly store.");
57-
}
58-
}
59-
60-
var assembly_store_paths = store_builder.Generate (AppSharedLibrariesDir);
61-
62-
if (assembly_store_paths.Count == 0) {
63-
throw new InvalidOperationException ("Assembly store generator did not generate any stores");
64-
}
65-
66-
if (assembly_store_paths.Count != SupportedAbis.Length) {
67-
throw new InvalidOperationException ("Internal error: assembly store did not generate store for each supported ABI");
68-
}
69-
46+
var assembly_store_paths = AssemblyPackagingHelper.CreateAssemblyStore (Log, assemblies, AppSharedLibrariesDir, SupportedAbis, IncludeDebugSymbols);
7047
AssembliesToAddToArchive = assembly_store_paths.Select (kvp => new TaskItem (kvp.Value, new Dictionary<string, string> { { "Abi", MonoAndroidHelper.ArchToAbi (kvp.Key) } })).ToArray ();
7148

7249
return !Log.HasLoggedErrors;
7350
}
74-
75-
bool ShouldSkipAssembly (ITaskItem asm)
76-
{
77-
var should_skip = asm.GetMetadataOrDefault ("AndroidSkipAddToPackage", false);
78-
79-
if (should_skip)
80-
Log.LogDebugMessage ($"Skipping {asm.ItemSpec} due to 'AndroidSkipAddToPackage' == 'true' ");
81-
82-
return should_skip;
83-
}
8451
}
Lines changed: 15 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.IO;
4+
using System.Linq;
45

56
using Microsoft.Android.Build.Tasks;
67
using Microsoft.Build.Framework;
@@ -14,37 +15,28 @@ public class CreateEmbeddedAssemblyStore : AndroidTask
1415
public override string TaskPrefix => "CEAS";
1516

1617
[Required]
17-
public string AndroidBinUtilsDirectory { get; set; }
18+
public string AndroidBinUtilsDirectory { get; set; } = "";
1819

1920
[Required]
20-
public string AppSharedLibrariesDir { get; set; }
21+
public string AppSharedLibrariesDir { get; set; } = "";
2122

2223
[Required]
23-
public string AssemblySourcesDir { get; set; }
24-
25-
[Required]
26-
public string CompressedAssembliesDir { get; set; }
24+
public string AssemblySourcesDir { get; set; } = "";
2725

2826
[Required]
2927
public bool AssemblyStoreEmbeddedInRuntime { get; set; }
3028

3129
[Required]
32-
public bool Debug { get; set; }
33-
34-
[Required]
35-
public bool EnableCompression { get; set; }
30+
public bool IncludeDebugSymbols { get; set; }
3631

3732
[Required]
38-
public string ProjectFullPath { get; set; }
33+
public ITaskItem[] ResolvedUserAssemblies { get; set; } = [];
3934

4035
[Required]
41-
public ITaskItem[] ResolvedUserAssemblies { get; set; }
36+
public ITaskItem[] ResolvedFrameworkAssemblies { get; set; } = [];
4237

4338
[Required]
44-
public ITaskItem[] ResolvedFrameworkAssemblies { get; set; }
45-
46-
[Required]
47-
public string [] SupportedAbis { get; set; }
39+
public string [] SupportedAbis { get; set; } = [];
4840

4941
public override bool RunTask ()
5042
{
@@ -70,27 +62,14 @@ public override bool RunTask ()
7062

7163
bool EmbedAssemblyStore ()
7264
{
73-
bool compress = !Debug && EnableCompression;
74-
IDictionary<AndroidTargetArch, Dictionary<string, CompressedAssemblyInfo>>? compressedAssembliesInfo = null;
75-
76-
if (compress) {
77-
string key = CompressedAssemblyInfo.GetKey (ProjectFullPath);
78-
Log.LogDebugMessage ($"[{TaskPrefix}] Retrieving assembly compression info with key '{key}'");
79-
compressedAssembliesInfo = BuildEngine4.GetRegisteredTaskObjectAssemblyLocal<IDictionary<AndroidTargetArch, Dictionary<string, CompressedAssemblyInfo>>> (key, RegisteredTaskObjectLifetime.Build);
80-
if (compressedAssembliesInfo == null) {
81-
throw new InvalidOperationException ($"Assembly compression info not found for key '{key}'. Compression will not be performed.");
82-
}
83-
}
84-
85-
var storeBuilder = new AssemblyStoreBuilder (Log);
65+
var assemblies = ResolvedFrameworkAssemblies.Concat (ResolvedUserAssemblies).Where (asm => !(AssemblyPackagingHelper.ShouldSkipAssembly (Log, asm)));
66+
var assemblyStorePaths = AssemblyPackagingHelper.CreateAssemblyStore (
67+
Log, assemblies,
68+
Path.Combine (AppSharedLibrariesDir, "embedded"),
69+
SupportedAbis,
70+
IncludeDebugSymbols
71+
);
8672

87-
// Add user assemblies
88-
AssemblyPackagingHelper.AddAssembliesFromCollection (Log, SupportedAbis, ResolvedUserAssemblies, DoAddAssembliesFromArchCollection);
89-
90-
// Add framework assemblies
91-
AssemblyPackagingHelper.AddAssembliesFromCollection (Log, SupportedAbis, ResolvedFrameworkAssemblies, DoAddAssembliesFromArchCollection);
92-
93-
Dictionary<AndroidTargetArch, string> assemblyStorePaths = storeBuilder.Generate (Path.Combine (AppSharedLibrariesDir, "embedded"));
9473
foreach (var kvp in assemblyStorePaths) {
9574
string abi = MonoAndroidHelper.ArchToAbi (kvp.Key);
9675
string inputFile = kvp.Value;
@@ -107,21 +86,5 @@ bool EmbedAssemblyStore ()
10786
}
10887

10988
return !Log.HasLoggedErrors;
110-
111-
void DoAddAssembliesFromArchCollection (TaskLoggingHelper log, AndroidTargetArch arch, ITaskItem assembly)
112-
{
113-
string sourcePath = CompressAssembly (assembly);
114-
storeBuilder.AddAssembly (sourcePath, assembly, includeDebugSymbols: Debug);
115-
return;
116-
}
117-
118-
string CompressAssembly (ITaskItem assembly)
119-
{
120-
if (!compress) {
121-
return assembly.ItemSpec;
122-
}
123-
124-
return AssemblyCompression.Compress (Log, assembly, compressedAssembliesInfo, CompressedAssembliesDir);
125-
}
12689
}
12790
}

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

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,52 @@ namespace Xamarin.Android.Tasks;
1010

1111
static class AssemblyPackagingHelper
1212
{
13+
public static bool ShouldSkipAssembly (TaskLoggingHelper log, ITaskItem asm)
14+
{
15+
var should_skip = asm.GetMetadataOrDefault ("AndroidSkipAddToPackage", false);
16+
17+
if (should_skip) {
18+
log.LogDebugMessage ($"Skipping {asm.ItemSpec} due to 'AndroidSkipAddToPackage' == 'true' ");
19+
}
20+
21+
return should_skip;
22+
}
23+
24+
public static Dictionary<AndroidTargetArch, string> CreateAssemblyStore (TaskLoggingHelper log, IEnumerable<ITaskItem> assemblies, string outputDir, string[] supportedAbis, bool includeDebugSymbols)
25+
{
26+
var storeBuilder = new AssemblyStoreBuilder (log);
27+
var per_arch_assemblies = MonoAndroidHelper.GetPerArchAssemblies (assemblies, supportedAbis, true);
28+
29+
foreach (var kvp in per_arch_assemblies) {
30+
log.LogDebugMessage ($"Adding assemblies for architecture '{kvp.Key}'");
31+
32+
foreach (var assembly in kvp.Value.Values) {
33+
var sourcePath = assembly.GetMetadataOrDefault ("CompressedAssembly", assembly.ItemSpec);
34+
storeBuilder.AddAssembly (sourcePath, assembly, includeDebugSymbols: includeDebugSymbols);
35+
36+
log.LogDebugMessage ($"Added '{sourcePath}' to assembly store.");
37+
}
38+
}
39+
40+
Dictionary<AndroidTargetArch, string> assemblyStorePaths = storeBuilder.Generate (outputDir);
41+
if (assemblyStorePaths.Count == 0) {
42+
throw new InvalidOperationException ("Assembly store generator did not generate any stores");
43+
}
44+
45+
if (assemblyStorePaths.Count != supportedAbis.Length) {
46+
throw new InvalidOperationException ("Internal error: assembly store did not generate store for each supported ABI");
47+
}
48+
49+
return assemblyStorePaths;
50+
}
51+
1352
public static void AddAssembliesFromCollection (TaskLoggingHelper Log, ICollection<string> SupportedAbis, ICollection<ITaskItem> assemblies, Action<TaskLoggingHelper, AndroidTargetArch, ITaskItem> doAddAssembly)
1453
{
1554
Dictionary<AndroidTargetArch, Dictionary<string, ITaskItem>> perArchAssemblies = MonoAndroidHelper.GetPerArchAssemblies (
1655
assemblies,
1756
SupportedAbis,
1857
validate: true,
19-
shouldSkip: (ITaskItem asm) => {
20-
if (bool.TryParse (asm.GetMetadata ("AndroidSkipAddToPackage"), out bool value) && value) {
21-
Log.LogDebugMessage ($"Skipping {asm.ItemSpec} due to 'AndroidSkipAddToPackage' == 'true' ");
22-
return true;
23-
}
24-
25-
return false;
26-
}
58+
shouldSkip: (ITaskItem asm) => ShouldSkipAssembly (Log, asm)
2759
);
2860

2961
foreach (var kvp in perArchAssemblies) {

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,17 @@ static void DoEmbed (
108108
var fi = new FileInfo (inputFile);
109109
if (fi.Exists) {
110110
inputFileSize = fi.Length;
111-
sanitizedInputFilePath = inputFile.Replace ("\\", "\\\\");
111+
sanitizedInputFilePath = inputFile!.Replace ("\\", "\\\\");
112112
} else if (!missingContentOK) {
113113
throw new InvalidOperationException ($"Internal error: input file '{inputFile}' does not exist");
114114
}
115115
}
116116

117-
string asmSourceFile = NativeAssemblerItemsHelper.GetSourcePath (log, item.NativeAssemblerMode, outputDirectory, arch);
117+
string? asmSourceFile = NativeAssemblerItemsHelper.GetSourcePath (log, item.NativeAssemblerMode, outputDirectory, arch);
118+
if (String.IsNullOrEmpty (asmSourceFile)) {
119+
log.LogError ("Unable to embed a binary file in native assembly, no assembly source path given.");
120+
return;
121+
}
118122

119123
Directory.CreateDirectory (Path.GetDirectoryName (asmSourceFile));
120124
using var fs = File.Open (asmSourceFile, FileMode.Create, FileAccess.Write, FileShare.Read);

0 commit comments

Comments
 (0)