[Xamarin.Android.Build.Tasks] Make all assemblies RID-specific (#8478) · dotnet/android@86260ed (original) (raw)
`@@ -4,6 +4,8 @@
`
4
4
`using Microsoft.Build.Framework;
`
5
5
`using Microsoft.Android.Build.Tasks;
`
6
6
``
``
7
`+
using Xamarin.Android.Tools;
`
``
8
+
7
9
`namespace Xamarin.Android.Tasks
`
8
10
`{
`
9
11
`public class GenerateCompressedAssembliesNativeSourceFiles : AndroidTask
`
`@@ -41,38 +43,54 @@ void GenerateCompressedAssemblySources ()
`
41
43
`return;
`
42
44
`}
`
43
45
``
44
``
`-
var assemblies = new SortedDictionary<string, CompressedAssemblyInfo> (StringComparer.Ordinal);
`
45
``
`-
foreach (ITaskItem assembly in ResolvedAssemblies) {
`
46
``
`-
if (bool.TryParse (assembly.GetMetadata ("AndroidSkipAddToPackage"), out bool value) && value) {
`
47
``
`-
continue;
`
48
``
`-
}
`
``
46
`+
Dictionary<AndroidTargetArch, Dictionary<string, ITaskItem>> perArchAssemblies = MonoAndroidHelper.GetPerArchAssemblies (
`
``
47
`+
ResolvedAssemblies,
`
``
48
`+
SupportedAbis,
`
``
49
`+
validate: true,
`
``
50
`+
shouldSkip: (ITaskItem asm) => bool.TryParse (asm.GetMetadata ("AndroidSkipAddToPackage"), out bool value) && value
`
``
51
`+
);
`
``
52
`+
var archAssemblies = new Dictionary<AndroidTargetArch, Dictionary<string, CompressedAssemblyInfo>> ();
`
``
53
`+
var counters = new Dictionary<AndroidTargetArch, uint> ();
`
``
54
+
``
55
`+
foreach (var kvpPerArch in perArchAssemblies) {
`
``
56
`+
AndroidTargetArch arch = kvpPerArch.Key;
`
``
57
`+
Dictionary<string, ITaskItem> resolvedArchAssemblies = kvpPerArch.Value;
`
``
58
+
``
59
`+
foreach (var kvp in resolvedArchAssemblies) {
`
``
60
`+
ITaskItem assembly = kvp.Value;
`
``
61
+
``
62
`+
if (!archAssemblies.TryGetValue (arch, out Dictionary<string, CompressedAssemblyInfo> assemblies)) {
`
``
63
`+
assemblies = new Dictionary<string, CompressedAssemblyInfo> (StringComparer.OrdinalIgnoreCase);
`
``
64
`+
archAssemblies.Add (arch, assemblies);
`
``
65
`+
}
`
49
66
``
50
``
`-
var assemblyKey = CompressedAssemblyInfo.GetDictionaryKey (assembly);
`
51
``
`-
if (assemblies.ContainsKey (assemblyKey)) {
`
52
``
`-
Log.LogDebugMessage ($"Skipping duplicate assembly: {assembly.ItemSpec}");
`
53
``
`-
continue;
`
54
``
`-
}
`
``
67
`+
var assemblyKey = CompressedAssemblyInfo.GetDictionaryKey (assembly);
`
``
68
`+
if (assemblies.ContainsKey (assemblyKey)) {
`
``
69
`+
Log.LogDebugMessage ($"Skipping duplicate assembly: {assembly.ItemSpec} (arch {MonoAndroidHelper.GetAssemblyAbi(assembly)})");
`
``
70
`+
continue;
`
``
71
`+
}
`
55
72
``
56
``
`-
var fi = new FileInfo (assembly.ItemSpec);
`
57
``
`-
if (!fi.Exists) {
`
58
``
`-
Log.LogError ($"Assembly {assembly.ItemSpec} does not exist");
`
59
``
`-
continue;
`
60
``
`-
}
`
``
73
`+
var fi = new FileInfo (assembly.ItemSpec);
`
``
74
`+
if (!fi.Exists) {
`
``
75
`+
Log.LogError ($"Assembly {assembly.ItemSpec} does not exist");
`
``
76
`+
continue;
`
``
77
`+
}
`
61
78
``
62
``
`-
assemblies.Add (assemblyKey, new CompressedAssemblyInfo (checked((uint)fi.Length)));
`
63
``
`-
}
`
64
79
``
65
``
`-
uint index = 0;
`
66
``
`-
foreach (var kvp in assemblies) {
`
67
``
`-
kvp.Value.DescriptorIndex = index++;
`
``
80
`+
if (!counters.TryGetValue (arch, out uint counter)) {
`
``
81
`+
counter = 0;
`
``
82
`+
}
`
``
83
`+
assemblies.Add (assemblyKey, new CompressedAssemblyInfo (checked((uint)fi.Length), counter++, arch, Path.GetFileNameWithoutExtension (assembly.ItemSpec)));
`
``
84
`+
counters[arch] = counter;
`
``
85
`+
}
`
68
86
`}
`
69
87
``
70
88
`string key = CompressedAssemblyInfo.GetKey (ProjectFullPath);
`
71
89
`Log.LogDebugMessage ($"Storing compression assemblies info with key '{key}'");
`
72
``
`-
BuildEngine4.RegisterTaskObjectAssemblyLocal (key, assemblies, RegisteredTaskObjectLifetime.Build);
`
73
``
`-
Generate (assemblies);
`
``
90
`+
BuildEngine4.RegisterTaskObjectAssemblyLocal (key, archAssemblies, RegisteredTaskObjectLifetime.Build);
`
``
91
`+
Generate (archAssemblies);
`
74
92
``
75
``
`-
void Generate (IDictionary<string, CompressedAssemblyInfo> dict)
`
``
93
`+
void Generate (Dictionary<AndroidTargetArch, Dictionary<string, CompressedAssemblyInfo>> dict)
`
76
94
`{
`
77
95
`var composer = new CompressedAssembliesNativeAssemblyGenerator (Log, dict);
`
78
96
`LLVMIR.LlvmIrModule compressedAssemblies = composer.Construct ();
`