[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 ();

`