From 1ab6540e034d3d094dccfc18af1c52bf558a8c56 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 12:24:04 +0000 Subject: [PATCH 1/2] Initial plan From 252aa8856f7cfbc5cba95aaa8c3ea656496a8fda Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 13:07:50 +0000 Subject: [PATCH 2/2] Skip FixAbstractMethods on ReadyToRun assemblies and re-enable regression test Agent-Logs-Url: https://github.com/dotnet/android/sessions/86d7cd7c-6cdd-4bf1-80cb-c3f4af737ce1 Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com> --- .../MonoDroid.Tuner/FixAbstractMethodsStep.cs | 38 +++++++++++++++++++ .../Xamarin.Android.Build.Tests/BuildTest.cs | 15 -------- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixAbstractMethodsStep.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixAbstractMethodsStep.cs index c1ced554bb1..4b63979e76c 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixAbstractMethodsStep.cs +++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixAbstractMethodsStep.cs @@ -3,12 +3,15 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; +using System.Reflection.PortableExecutable; using Java.Interop.Tools.Cecil; using Mono.Cecil; using Mono.Linker; using Mono.Linker.Steps; using Mono.Tuner; +using Xamarin.Android.Tools; using Xamarin.Android.Tasks; using Resources = Xamarin.Android.Tasks.Properties.Resources; @@ -46,6 +49,9 @@ public void ProcessAssembly (AssemblyDefinition assembly, StepContext context) if (context.IsMainAssembly || !context.IsAndroidUserAssembly) return; + if (IsReadyToRunAssembly (assembly)) + return; + context.IsAssemblyModified |= FixAbstractMethods (assembly); } @@ -60,6 +66,7 @@ internal bool FixAbstractMethods (AssemblyDefinition assembly) } readonly HashSet warnedAssemblies = new (StringComparer.Ordinal); + readonly HashSet warnedReadyToRunAssemblies = new (StringComparer.Ordinal); internal void CheckAppDomainUsage (AssemblyDefinition assembly, Action warn) { @@ -76,6 +83,37 @@ internal void CheckAppDomainUsage (AssemblyDefinition assembly, Action w } } + bool IsReadyToRunAssembly (AssemblyDefinition assembly) + { + if (assembly?.MainModule == null) + return false; + + string fileName = assembly.MainModule.FileName; + if (fileName.IsNullOrEmpty () || !File.Exists (fileName)) + return false; + + try { + using (var stream = File.OpenRead (fileName)) + using (var pe = new PEReader (stream)) { + bool isReadyToRun = pe.PEHeaders.CorHeader?.ManagedNativeHeaderDirectory.Size > 0; + if (!isReadyToRun) + return false; + + if (warnedReadyToRunAssemblies.Add (assembly.Name.Name)) { + LogMessage ($"Skipping FixAbstractMethodsStep for ReadyToRun assembly '{assembly.Name.Name}'."); + } + + return true; + } + } catch (IOException) { + return false; + } catch (UnauthorizedAccessException) { + return false; + } catch (BadImageFormatException) { + return false; + } + } + bool MightNeedFix (TypeDefinition type) { return !type.IsAbstract && type.IsSubclassOf ("Java.Lang.Object", TypeCache); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs index a8a90ae9ff3..3e8c108104e 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs @@ -2178,21 +2178,6 @@ public void CheckLintResourceFileReferencesAreFixed ([Values] AndroidRuntime run // TODO: [TestCase (false, AndroidRuntime.NativeAOT)] public void SimilarAndroidXAssemblyNames (bool publishTrimmed, AndroidRuntime runtime) { - if (!publishTrimmed && runtime == AndroidRuntime.CoreCLR) { - // This currently fails with the following exception: - // - // error XALNS7015: System.NotSupportedException: Writing mixed-mode assemblies is not supported - // at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters) - // at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters) - // at Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters) - // at Mono.Cecil.AssemblyDefinition.Write(String fileName, WriterParameters parameters) - // at Xamarin.Android.Tasks.SaveChangedAssemblyStep.ProcessAssembly(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 197 - // at Xamarin.Android.Tasks.AssemblyPipeline.Run(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Utilities/AssemblyPipeline.cs:line 26 - // at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunPipeline(AssemblyPipeline pipeline, ITaskItem source, ITaskItem destination) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 175 - Assert.Ignore ("CoreCLR: fails because of a Mono.Cecil lack of support"); - return; - } - bool aotAssemblies = runtime == AndroidRuntime.MonoVM && publishTrimmed; var proj = new XamarinAndroidApplicationProject { IsRelease = true,