From 9bba7fccf85849d8f0146771222ee8062c721506 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Tue, 11 Jul 2023 13:30:01 +0200 Subject: [PATCH 1/6] Attribute gets added properly... ...but for now no idea how to get the RID --- .../AddRidMetadataAttributeStep.cs | 86 +++++++++++++++++++ .../Microsoft.Android.Sdk.ILLink.targets | 5 ++ 2 files changed, 91 insertions(+) create mode 100644 src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AddRidMetadataAttributeStep.cs diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AddRidMetadataAttributeStep.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AddRidMetadataAttributeStep.cs new file mode 100644 index 00000000000..fd8aedeed99 --- /dev/null +++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AddRidMetadataAttributeStep.cs @@ -0,0 +1,86 @@ +using System; + +using Mono.Cecil; +using Mono.Linker; +using Mono.Linker.Steps; + +namespace MonoDroid.Tuner; + +public class AddRidMetadataAttributeStep : BaseStep +{ + protected override void ProcessAssembly (AssemblyDefinition assembly) + { + if (!Annotations.HasAction (assembly)) { + return; + } + + var action = Annotations.GetAction (assembly); + if (action == AssemblyAction.Skip || action == AssemblyAction.Delete) { + return; + } + + AssemblyDefinition corlib = GetCorlib (); + MethodDefinition assemblyMetadataAttributeCtor = FindAssemblyMetadataAttributeCtor (corlib); + TypeDefinition systemString = GetSystemString (corlib); + + var attr = new CustomAttribute (assembly.MainModule.ImportReference (assemblyMetadataAttributeCtor)); + attr.ConstructorArguments.Add (new CustomAttributeArgument (systemString, "XamarinAndroidAbi")); // key + + // TODO: figure out how to get the RID... + attr.ConstructorArguments.Add (new CustomAttributeArgument (systemString, assembly.MainModule.FileName)); // value + + assembly.CustomAttributes.Add (attr); + + if (action == AssemblyAction.Copy) { + Annotations.SetAction (assembly, AssemblyAction.Save); + } + } + + TypeDefinition GetSystemString (AssemblyDefinition asm) => FindType (asm, "System.String", required: true); + + AssemblyDefinition GetCorlib () + { + const string ImportAssembly = "System.Private.CoreLib"; + AssemblyDefinition? asm = Context.Resolve (AssemblyNameReference.Parse (ImportAssembly)); + if (asm == null) { + throw new InvalidOperationException ($"Unable to import assembly '{ImportAssembly}'"); + } + + return asm; + } + + MethodDefinition FindAssemblyMetadataAttributeCtor (AssemblyDefinition asm) + { + const string AttributeType = "System.Reflection.AssemblyMetadataAttribute"; + + TypeDefinition assemblyMetadataAttribute = FindType (asm, AttributeType, required: true); + foreach (MethodDefinition md in assemblyMetadataAttribute!.Methods) { + if (!md.IsConstructor) { + continue; + } + + return md; + } + + throw new InvalidOperationException ($"Unable to find the {AttributeType} type constructor"); + } + + TypeDefinition? FindType (AssemblyDefinition asm, string typeName, bool required) + { + foreach (ModuleDefinition md in asm.Modules) { + foreach (TypeDefinition et in md.Types) { + if (String.Compare (typeName, et.FullName, StringComparison.Ordinal) != 0) { + continue; + } + + return et; + } + } + + if (required) { + throw new InvalidOperationException ($"Internal error: required type '{typeName}' in assembly {asm} not found"); + } + + return null; + } +} diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets index 7400de192ff..781845f0b9c 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets @@ -94,6 +94,11 @@ This file contains the .NET 5-specific targets to customize ILLink BeforeStep="MarkStep" Type="MonoDroid.Tuner.FixLegacyResourceDesignerStep" /> + <_TrimmerCustomSteps + Include="$(_AndroidLinkerCustomStepAssembly)" + AfterStep="CleanStep" + Type="MonoDroid.Tuner.AddRidMetadataAttributeStep" + /> <_PreserveLists Include="$(MSBuildThisFileDirectory)..\PreserveLists\*.xml" /> Date: Tue, 11 Jul 2023 22:36:40 +0200 Subject: [PATCH 2/6] Metadata set to the appropriate RID --- .../AddRidMetadataAttributeStep.cs | 16 +++++++++++++++- .../targets/Microsoft.Android.Sdk.ILLink.targets | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AddRidMetadataAttributeStep.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AddRidMetadataAttributeStep.cs index fd8aedeed99..6ee4fe3d2e7 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AddRidMetadataAttributeStep.cs +++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AddRidMetadataAttributeStep.cs @@ -4,6 +4,10 @@ using Mono.Linker; using Mono.Linker.Steps; +#if ILLINK +using Microsoft.Android.Sdk.ILLink; +#endif + namespace MonoDroid.Tuner; public class AddRidMetadataAttributeStep : BaseStep @@ -19,6 +23,16 @@ protected override void ProcessAssembly (AssemblyDefinition assembly) return; } + string? rid = null; +#if ILLINK + if (!Context.TryGetCustomData ("XARuntimeIdentifier", out rid)) { + throw new InvalidOperationException ("Missing XARuntimeIdentifier custom data"); + } +#endif + if (String.IsNullOrEmpty (rid)) { + throw new InvalidOperationException ("RID must have a non-empty value"); + } + AssemblyDefinition corlib = GetCorlib (); MethodDefinition assemblyMetadataAttributeCtor = FindAssemblyMetadataAttributeCtor (corlib); TypeDefinition systemString = GetSystemString (corlib); @@ -27,7 +41,7 @@ protected override void ProcessAssembly (AssemblyDefinition assembly) attr.ConstructorArguments.Add (new CustomAttributeArgument (systemString, "XamarinAndroidAbi")); // key // TODO: figure out how to get the RID... - attr.ConstructorArguments.Add (new CustomAttributeArgument (systemString, assembly.MainModule.FileName)); // value + attr.ConstructorArguments.Add (new CustomAttributeArgument (systemString, rid)); // value assembly.CustomAttributes.Add (attr); diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets index 781845f0b9c..e63cad77f37 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets @@ -40,6 +40,7 @@ This file contains the .NET 5-specific targets to customize ILLink https://github.com/dotnet/sdk/blob/a5393731b5b7b225692fff121f747fbbc9e8b140/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.ILLink.targets#L147 --> <_TrimmerCustomData Include="XATargetFrameworkDirectories" Value="$(_XATargetFrameworkDirectories)" /> + <_TrimmerCustomData Include="XARuntimeIdentifier" Value="$(RuntimeIdentifier)" /> <_TrimmerCustomData Condition=" '$(_ProguardProjectConfiguration)' != '' " Include="ProguardConfiguration" From d5ca586b7e630505c07fcc83f7bf819b637d2497 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 12 Jul 2023 11:17:59 +0200 Subject: [PATCH 3/6] Try to fix link failures --- .../PreserveLists/System.Private.CoreLib.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/Microsoft.Android.Sdk.ILLink/PreserveLists/System.Private.CoreLib.xml diff --git a/src/Microsoft.Android.Sdk.ILLink/PreserveLists/System.Private.CoreLib.xml b/src/Microsoft.Android.Sdk.ILLink/PreserveLists/System.Private.CoreLib.xml new file mode 100644 index 00000000000..c5aea679db6 --- /dev/null +++ b/src/Microsoft.Android.Sdk.ILLink/PreserveLists/System.Private.CoreLib.xml @@ -0,0 +1,6 @@ + + + + + + From a90047a7f09e6c58c267dab1ced3cecfaad57681 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 12 Jul 2023 14:13:05 +0000 Subject: [PATCH 4/6] Update src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets Co-authored-by: Jonathan Peppers --- .../targets/Microsoft.Android.Sdk.ILLink.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets index e63cad77f37..25018bc0b40 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets @@ -40,7 +40,7 @@ This file contains the .NET 5-specific targets to customize ILLink https://github.com/dotnet/sdk/blob/a5393731b5b7b225692fff121f747fbbc9e8b140/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.ILLink.targets#L147 --> <_TrimmerCustomData Include="XATargetFrameworkDirectories" Value="$(_XATargetFrameworkDirectories)" /> - <_TrimmerCustomData Include="XARuntimeIdentifier" Value="$(RuntimeIdentifier)" /> + <_TrimmerCustomData Include="XARuntimeIdentifier" Value="$(RuntimeIdentifier)" Condition=" '$(_AndroidAddRuntimeIdentifierToAssemblies)' == 'true' " /> <_TrimmerCustomData Condition=" '$(_ProguardProjectConfiguration)' != '' " Include="ProguardConfiguration" From bbcf701436608b9e5e9ef017c108d0e7617e8917 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 12 Jul 2023 16:37:36 +0200 Subject: [PATCH 5/6] Make the step itself conditional, too --- .../targets/Microsoft.Android.Sdk.ILLink.targets | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets index 25018bc0b40..0461633d57b 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets @@ -96,6 +96,7 @@ This file contains the .NET 5-specific targets to customize ILLink Type="MonoDroid.Tuner.FixLegacyResourceDesignerStep" /> <_TrimmerCustomSteps + Condition=" '$(_AndroidAddRuntimeIdentifierToAssemblies)' == 'true' " Include="$(_AndroidLinkerCustomStepAssembly)" AfterStep="CleanStep" Type="MonoDroid.Tuner.AddRidMetadataAttributeStep" From 043a70a9073133477e53e1fb1ac97a264a40f1d4 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 12 Jul 2023 18:57:14 +0200 Subject: [PATCH 6/6] Update apkdesc --- .../BuildReleaseArm64XFormsDotNet.apkdesc | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc index 426961a5f03..4e72e828028 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc @@ -2,139 +2,139 @@ "Comment": null, "Entries": { "AndroidManifest.xml": { - "Size": 3568 + "Size": 3572 }, "assemblies/_Microsoft.Android.Resource.Designer.dll": { - "Size": 2102 + "Size": 2101 }, "assemblies/FormsViewGroup.dll": { "Size": 7313 }, "assemblies/Java.Interop.dll": { - "Size": 66911 + "Size": 66935 }, "assemblies/Mono.Android.dll": { - "Size": 469830 + "Size": 469920 }, "assemblies/Mono.Android.Runtime.dll": { - "Size": 5818 + "Size": 5819 }, "assemblies/mscorlib.dll": { - "Size": 3866 + "Size": 4004 }, "assemblies/netstandard.dll": { - "Size": 5578 + "Size": 5729 }, "assemblies/rc.bin": { "Size": 1235 }, "assemblies/System.Collections.Concurrent.dll": { - "Size": 11561 + "Size": 11708 }, "assemblies/System.Collections.dll": { - "Size": 15445 + "Size": 15598 }, "assemblies/System.Collections.NonGeneric.dll": { - "Size": 7501 + "Size": 7651 }, "assemblies/System.ComponentModel.dll": { - "Size": 1974 + "Size": 2139 }, "assemblies/System.ComponentModel.Primitives.dll": { - "Size": 2596 + "Size": 2741 }, "assemblies/System.ComponentModel.TypeConverter.dll": { - "Size": 6083 + "Size": 6228 }, "assemblies/System.Console.dll": { - "Size": 6612 + "Size": 6770 }, "assemblies/System.Core.dll": { - "Size": 1992 + "Size": 2147 }, "assemblies/System.Diagnostics.TraceSource.dll": { - "Size": 6589 + "Size": 6740 }, "assemblies/System.dll": { - "Size": 2347 + "Size": 2521 }, "assemblies/System.Drawing.dll": { - "Size": 1938 + "Size": 2097 }, "assemblies/System.Drawing.Primitives.dll": { - "Size": 12004 + "Size": 12166 }, "assemblies/System.IO.Compression.Brotli.dll": { - "Size": 11221 + "Size": 11369 }, "assemblies/System.IO.Compression.dll": { - "Size": 15897 + "Size": 16048 }, "assemblies/System.IO.IsolatedStorage.dll": { - "Size": 9913 + "Size": 10057 }, "assemblies/System.Linq.dll": { - "Size": 19490 + "Size": 19648 }, "assemblies/System.Linq.Expressions.dll": { - "Size": 164335 + "Size": 164484 }, "assemblies/System.Net.Http.dll": { - "Size": 65557 + "Size": 65825 }, "assemblies/System.Net.Primitives.dll": { - "Size": 22482 + "Size": 22630 }, "assemblies/System.Net.Requests.dll": { - "Size": 3632 + "Size": 3787 }, "assemblies/System.ObjectModel.dll": { - "Size": 8159 + "Size": 8299 }, "assemblies/System.Private.CoreLib.dll": { - "Size": 834340 + "Size": 834361 }, "assemblies/System.Private.DataContractSerialization.dll": { - "Size": 192404 + "Size": 193079 }, "assemblies/System.Private.Uri.dll": { - "Size": 42947 + "Size": 43627 }, "assemblies/System.Private.Xml.dll": { - "Size": 215908 + "Size": 215978 }, "assemblies/System.Private.Xml.Linq.dll": { - "Size": 16681 + "Size": 16837 }, "assemblies/System.Runtime.dll": { - "Size": 2775 + "Size": 2932 }, "assemblies/System.Runtime.InteropServices.dll": { - "Size": 3768 + "Size": 3923 }, "assemblies/System.Runtime.Serialization.dll": { - "Size": 1867 + "Size": 2026 }, "assemblies/System.Runtime.Serialization.Formatters.dll": { - "Size": 2518 + "Size": 2674 }, "assemblies/System.Runtime.Serialization.Primitives.dll": { - "Size": 3802 + "Size": 3961 }, "assemblies/System.Security.Cryptography.dll": { - "Size": 8065 + "Size": 8300 }, "assemblies/System.Text.RegularExpressions.dll": { - "Size": 158997 + "Size": 159072 }, "assemblies/System.Xml.dll": { - "Size": 1760 + "Size": 1912 }, "assemblies/System.Xml.Linq.dll": { - "Size": 1778 + "Size": 1930 }, "assemblies/UnnamedProject.dll": { - "Size": 5290 + "Size": 5300 }, "assemblies/Xamarin.AndroidX.Activity.dll": { "Size": 5942 @@ -206,19 +206,19 @@ "Size": 3117140 }, "lib/arm64-v8a/libmono-component-marshal-ilgen.so": { - "Size": 93552 + "Size": 97392 }, "lib/arm64-v8a/libmonodroid.so": { "Size": 380704 }, "lib/arm64-v8a/libmonosgen-2.0.so": { - "Size": 3169800 + "Size": 3177936 }, "lib/arm64-v8a/libSystem.IO.Compression.Native.so": { "Size": 723560 }, "lib/arm64-v8a/libSystem.Native.so": { - "Size": 94392 + "Size": 94000 }, "lib/arm64-v8a/libSystem.Security.Cryptography.Native.Android.so": { "Size": 154904 @@ -1913,5 +1913,5 @@ "Size": 325240 } }, - "PackageSize": 7900078 + "PackageSize": 7916462 } \ No newline at end of file