diff --git a/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj b/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj
index b0fc296935d..6c4368fd7d2 100644
--- a/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj
+++ b/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj
@@ -16,8 +16,6 @@
-
-
diff --git a/src/Xamarin.Android.Build.Tasks/Linker/External/Linker.Steps/BaseStep.cs b/src/Xamarin.Android.Build.Tasks/Linker/External/Linker.Steps/BaseStep.cs
index c1aa1ded94a..a3a5bb11066 100644
--- a/src/Xamarin.Android.Build.Tasks/Linker/External/Linker.Steps/BaseStep.cs
+++ b/src/Xamarin.Android.Build.Tasks/Linker/External/Linker.Steps/BaseStep.cs
@@ -89,11 +89,7 @@ public virtual void LogMessage (string message)
public virtual void LogError (int code, string message)
{
-#if ILLINK
- Context.LogMessage (MessageContainer.CreateCustomErrorMessage (message, code, origin: new MessageOrigin ()));
-#else // !ILLINK
Context.LogError ($"XA{code}", message);
-#endif // !ILLINK
}
}
}
diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixLegacyResourceDesignerStep.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixLegacyResourceDesignerStep.cs
index 7606f022e7a..7028aea33e0 100644
--- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixLegacyResourceDesignerStep.cs
+++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixLegacyResourceDesignerStep.cs
@@ -14,18 +14,11 @@
using Mono.Linker.Steps;
using Mono.Tuner;
-#if ILLINK
-using Resources = Microsoft.Android.Sdk.ILLink.Properties.Resources;
-#else // !ILLINK
using Resources = Xamarin.Android.Tasks.Properties.Resources;
-#endif // ILLINK
namespace MonoDroid.Tuner
{
- public class FixLegacyResourceDesignerStep : LinkDesignerBase
-#if !ILLINK
- , Xamarin.Android.Tasks.IAssemblyModifierPipelineStep
-#endif // !ILLINK
+ public class FixLegacyResourceDesignerStep : LinkDesignerBase, Xamarin.Android.Tasks.IAssemblyModifierPipelineStep
{
internal const string DesignerAssemblyName = "_Microsoft.Android.Resource.Designer";
internal const string DesignerAssemblyNamespace = "_Microsoft.Android.Resource.Designer";
@@ -36,14 +29,6 @@ public class FixLegacyResourceDesignerStep : LinkDesignerBase
Dictionary lookup;
Dictionary lookupCaseInsensitive;
- protected override void EndProcess ()
- {
- if (designerAssembly != null) {
- LogMessage ($" Setting Action on {designerAssembly.Name} to Link.");
- Annotations.SetAction (designerAssembly, AssemblyAction.Link);
- }
- }
-
protected override void LoadDesigner ()
{
if (designerLoaded)
@@ -72,7 +57,6 @@ protected override void LoadDesigner ()
}
}
-#if !ILLINK
public void ProcessAssembly (AssemblyDefinition assembly, Xamarin.Android.Tasks.StepContext context)
{
// Only run this step on non-main user Android assemblies
@@ -81,7 +65,6 @@ public void ProcessAssembly (AssemblyDefinition assembly, Xamarin.Android.Tasks.
context.IsAssemblyModified |= ProcessAssemblyDesigner (assembly);
}
-#endif // !ILLINK
internal override bool ProcessAssemblyDesigner (AssemblyDefinition assembly)
{
diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkDesignerBase.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkDesignerBase.cs
index 5f7f7fc1f74..6e50b10d7d7 100644
--- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkDesignerBase.cs
+++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkDesignerBase.cs
@@ -4,16 +4,12 @@
using Mono.Linker;
using Mono.Linker.Steps;
using System;
-using System.Linq;
using Xamarin.Android.Tasks;
using System.Collections.Generic;
using System.Globalization;
using Mono.Cecil.Cil;
using System.Text.RegularExpressions;
using Mono.Collections.Generic;
-#if ILLINK
-using Microsoft.Android.Sdk.ILLink;
-#endif
namespace MonoDroid.Tuner {
@@ -21,26 +17,14 @@ public abstract class LinkDesignerBase : BaseStep
{
protected IMetadataResolver Cache => Context;
- public
-#if !ILLINK
- override
-#endif
- void LogMessage (string message)
+ public override void LogMessage (string message)
{
Context.LogMessage (message);
}
- public
-#if !ILLINK
- override
-#endif
- void LogError (int code, string error)
+ public override void LogError (int code, string error)
{
-#if ILLINK
- Context.LogMessage (MessageContainer.CreateCustomErrorMessage (error, code, origin: new MessageOrigin ()));
-#else // !ILLINK
Context.LogError ($"XA{code}", error);
-#endif // !ILLINK
}
public virtual AssemblyDefinition Resolve (AssemblyNameReference name)
diff --git a/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Resource.Designer.targets b/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Resource.Designer.targets
index 5c154d9e05c..a8a666ab598 100644
--- a/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Resource.Designer.targets
+++ b/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Resource.Designer.targets
@@ -226,6 +226,10 @@ Copyright (C) 2016 Xamarin. All rights reserved.
In additon we MUST set the `PostprocessAssembly` metadata to `true` so that the file
is processed by the ILLink step. If we do not do this then the reference to
`netstandard.dll` is not replaced with `System.Private.CoreLib` and the app crashes.
+
+ We also add a TrimmerRootAssembly entry to prevent ILLink from trimming the designer's
+ resource properties. FixLegacyResourceDesignerStep now runs after ILLink and needs
+ all properties to be present when rewriting library assemblies.
-->
true
true
+
+
diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.LlvmIr.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.LlvmIr.targets
index aa145ccb839..0c2a2b21f28 100644
--- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.LlvmIr.targets
+++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.LlvmIr.targets
@@ -160,7 +160,7 @@
+ DependsOnTargets="GetReferenceAssemblyPaths;_CreatePropertiesCache;_AddResourceDesignerToPublishFiles">
true
<_ExtraTrimmerArgs Condition=" '$(_EnableSerializationDiscovery)' != 'false' ">--enable-serialization-discovery $(_ExtraTrimmerArgs)
@@ -197,12 +197,6 @@
<_TrimmerCustomSteps Include="$(_AndroidLinkerCustomStepAssembly)" Type="Microsoft.Android.Sdk.ILLink.PreserveJavaInterfaces" />
- <_TrimmerCustomSteps
- Condition=" '$(AndroidUseDesignerAssembly)' == 'true' "
- Include="$(_AndroidLinkerCustomStepAssembly)"
- BeforeStep="MarkStep"
- Type="MonoDroid.Tuner.FixLegacyResourceDesignerStep"
- />
<_TrimmerCustomSteps
Condition=" '$(_AndroidTypeMapImplementation)' == 'managed' "
Include="$(_AndroidLinkerCustomStepAssembly)"
@@ -247,7 +241,8 @@
Assemblies="@(_PostTrimmingAssembly)"
AddKeepAlives="$(AndroidAddKeepAlives)"
AndroidLinkResources="$(AndroidLinkResources)"
- Deterministic="$(Deterministic)" />
+ Deterministic="$(Deterministic)"
+ UseDesignerAssembly="$(AndroidUseDesignerAssembly)" />
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/PostTrimmingPipeline.cs b/src/Xamarin.Android.Build.Tasks/Tasks/PostTrimmingPipeline.cs
index 820a050a47b..4f5c0be9129 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/PostTrimmingPipeline.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/PostTrimmingPipeline.cs
@@ -6,6 +6,7 @@
using Microsoft.Android.Build.Tasks;
using Microsoft.Build.Framework;
using Mono.Cecil;
+using Mono.Linker;
using MonoDroid.Tuner;
namespace Xamarin.Android.Tasks;
@@ -34,6 +35,8 @@ public class PostTrimmingPipeline : AndroidTask
public bool Deterministic { get; set; }
+ public bool UseDesignerAssembly { get; set; }
+
public override bool RunTask ()
{
using var resolver = new DirectoryAssemblyResolver (
@@ -86,6 +89,15 @@ public override bool RunTask ()
},
(msg) => Log.LogDebugMessage (msg)));
}
+ if (UseDesignerAssembly) {
+ // Create an MSBuildLinkContext so FixLegacyResourceDesignerStep can resolve assemblies
+ // and log messages. The resolver is owned by the outer 'using' block, so we intentionally
+ // do not dispose this context (LinkContext.Dispose would double-dispose the resolver).
+ var linkContext = new MSBuildLinkContext (resolver, Log);
+ var fixLegacyStep = new FixLegacyResourceDesignerStep ();
+ fixLegacyStep.Initialize (linkContext);
+ steps.Add (new PostTrimmingFixLegacyResourceDesignerStep (fixLegacyStep));
+ }
if (AndroidLinkResources) {
var allAssemblies = new List (Assemblies.Length);
foreach (var item in Assemblies) {
@@ -112,3 +124,24 @@ public override bool RunTask ()
return !Log.HasLoggedErrors;
}
}
+
+///
+/// Thin wrapper around for the post-trimming pipeline.
+/// Calls directly, matching the
+/// behavior of the former ILLink path which processed all assemblies without StepContext flag filtering.
+/// Assemblies without a resource designer are skipped internally by ProcessAssemblyDesigner.
+///
+class PostTrimmingFixLegacyResourceDesignerStep : IAssemblyModifierPipelineStep
+{
+ readonly FixLegacyResourceDesignerStep _inner;
+
+ public PostTrimmingFixLegacyResourceDesignerStep (FixLegacyResourceDesignerStep inner)
+ {
+ _inner = inner;
+ }
+
+ public void ProcessAssembly (AssemblyDefinition assembly, StepContext context)
+ {
+ context.IsAssemblyModified |= _inner.ProcessAssemblyDesigner (assembly);
+ }
+}
diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj
index c58aa29aa6e..4070a690f88 100644
--- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj
+++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj
@@ -45,7 +45,7 @@
-
+