From eb1bc9b9840e51254155ab13584f066502e75c55 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 3 Dec 2025 11:56:57 +0100 Subject: [PATCH 01/15] AndroidResourceTests.AdaptiveIcon works --- .../Tasks/AndroidResourceTests.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/AndroidResourceTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/AndroidResourceTests.cs index 2610dd3c65d..57e3e7dabc6 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/AndroidResourceTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/AndroidResourceTests.cs @@ -154,11 +154,17 @@ public void UserLayout () Assert.True (mainText.Contains ("FixedWidth"), "'FixedWidth' was converted to 'fixedwidth'"); Directory.Delete (path, recursive: true); } - + [Test] - public void AdaptiveIcon () + public void AdaptiveIcon ([Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + var proj = new XamarinAndroidApplicationProject { + IsRelease = isRelease, SupportedOSPlatformVersion = "26", AndroidResources = { new AndroidItem.AndroidResource ("Resources\\values\\colors.xml") { @@ -193,6 +199,7 @@ public void AdaptiveIcon () }, } }; + proj.SetRuntime (runtime); using var b = CreateApkBuilder (); Assert.IsTrue (b.Build (proj), "Build should have succeeded."); From 0227516178f0ef2b09bdf277d68b6d7f4087dab1 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 3 Dec 2025 12:05:00 +0100 Subject: [PATCH 02/15] CheckClientHandlerTypeTests.ErrorIsNotRaised works --- .../Tasks/CheckClientHandlerTypeTests.cs | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs index 6a1ca1d2280..b400bf748b0 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs @@ -14,19 +14,44 @@ namespace Xamarin.Android.Build.Tests { public class CheckClientHandlerTypeTests : BaseTest { + static IEnumerable Get_ErrorIsNotRaised_Data () + { + var ret = new List (); + + foreach (AndroidRuntime runtime in Enum.GetValues (typeof (AndroidRuntime))) { + AddTestData ("Xamarin.Android.Net.AndroidMessageHandler", runtime); + AddTestData ("System.Net.Http.SocketsHttpHandler, System.Net.Http", runtime); + } + + return ret; + + void AddTestData (string handler, AndroidRuntime runtime) + { + ret.Add (new object[] { + handler, + runtime, + }); + } + } + [Test] - [TestCase ("Xamarin.Android.Net.AndroidMessageHandler")] - [TestCase ("System.Net.Http.SocketsHttpHandler, System.Net.Http")] - public void ErrorIsNotRaised (string handler) + [TestCaseSource (nameof (Get_ErrorIsNotRaised_Data))] + public void ErrorIsNotRaised (string handler, AndroidRuntime runtime) { + const bool isRelease = false; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + string path = Path.Combine (Root, "temp", TestName); Directory.CreateDirectory (path); string intermediatePath; bool shouldSkip = handler.Contains ("Xamarin.Android.Net.AndroidMessageHandler"); bool targetSkipped; var proj = new XamarinAndroidApplicationProject () { - IsRelease = false, + IsRelease = isRelease, }; + proj.SetRuntime (runtime); proj.SetProperty ("AndroidHttpClientHandlerType", handler); using (var b = CreateApkBuilder (path)) { b.Verbosity = LoggerVerbosity.Detailed; From 37de2187c7fc66a2cbe6be6233629e63171d9c73 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 3 Dec 2025 12:10:14 +0100 Subject: [PATCH 03/15] CheckClientHandlerTypeTests.ErrorIsRaised works --- .../Tasks/CheckClientHandlerTypeTests.cs | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs index b400bf748b0..87616d10078 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs @@ -81,16 +81,41 @@ public void ErrorIsNotRaised (string handler, AndroidRuntime runtime) Assert.True (task.Execute (), $"task should have succeeded. {string.Join (";", errors.Select (x => x.Message))}"); } + static IEnumerable Get_ErrorIsRaised_Data () + { + var ret = new List (); + + foreach (AndroidRuntime runtime in Enum.GetValues (typeof (AndroidRuntime))) { + AddTestData ("Xamarin.Android.Net.AndroidClientHandler", runtime); + } + + return ret; + + void AddTestData (string handler, AndroidRuntime runtime) + { + ret.Add (new object[] { + handler, + runtime, + }); + } + } + [Test] - [TestCase ("Xamarin.Android.Net.AndroidClientHandler")] - public void ErrorIsRaised (string handler) + [TestCaseSource (nameof (Get_ErrorIsRaised_Data))] + public void ErrorIsRaised (string handler, AndroidRuntime runtime) { + const bool isRelease = false; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + var path = Path.Combine (Root, "temp", TestName); Directory.CreateDirectory (path); string intermediatePath; var proj = new XamarinAndroidApplicationProject () { - IsRelease = false, + IsRelease = isRelease, }; + proj.SetRuntime (runtime); proj.PackageReferences.Add (new Package() { Id = "System.Net.Http", Version = "*" }); using (var b = CreateApkBuilder ()) { b.ThrowOnBuildFailure = false; From 27cc5d3ad34ffab89d8c1078c83eb6e6da64a7f4 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 3 Dec 2025 12:18:42 +0100 Subject: [PATCH 04/15] ManagedResourceParserTests.GenerateDesignerFileFromRtxt broken on NAOT, works otherwise --- .../Tasks/ManagedResourceParserTests.cs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ManagedResourceParserTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ManagedResourceParserTests.cs index 35aca6ca637..bb58e38a23f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ManagedResourceParserTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ManagedResourceParserTests.cs @@ -299,11 +299,18 @@ public void CreateResourceDirectory (string path) File.WriteAllText (Path.Combine (Root, path, "lp", "__res_name_case_map.txt"), "menu/Options.xml;menu/options.xml"); } - void BuildLibraryWithResources (string path) + void BuildLibraryWithResources (string path, AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + var library = new XamarinAndroidLibraryProject () { + IsRelease = isRelease, ProjectName = "Library", }; + library.SetRuntime (runtime); var libraryStrings = library.AndroidResources.FirstOrDefault (r => r.Include () == @"Resources\values\Strings.xml"); @@ -425,8 +432,15 @@ public void GenerateDesignerFileWithÜmläüts () } [Test] - public void GenerateDesignerFileFromRtxt ([Values (false, true)] bool withLibraryReference) + public void GenerateDesignerFileFromRtxt ([Values] bool withLibraryReference, [Values] AndroidRuntime runtime) { + // TODO: fix NativeAOT, it currently fails with: + // + // bin/TestDebug/temp/GenerateDesignerFileFromRtxtTrueNativeAOT Some Space/Resource.designer.cs and bin/TestDebug/Expected/GenerateDesignerFileWithLibraryReferenceExpected.cs do not match. + if (runtime == AndroidRuntime.NativeAOT) { + Assert.Ignore ("NativeAOT currently doesn't work with this test."); + } + var path = Path.Combine ("temp", TestName + " Some Space"); CreateResourceDirectory (path); var mapTask = CreateCaseMapTask (path); @@ -436,7 +450,7 @@ public void GenerateDesignerFileFromRtxt ([Values (false, true)] bool withLibrar File.WriteAllText (task.RTxtFile, Rtxt); if (withLibraryReference) { var libraryPath = Path.Combine (path, "Library"); - BuildLibraryWithResources (libraryPath); + BuildLibraryWithResources (libraryPath, runtime); task.References = new TaskItem [] { new TaskItem (Path.Combine (Root, libraryPath, "bin", "Debug", "Library.dll")) }; From cfa36d0407462da3bf8d4c6f5cfe29dd8e1c346b Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 3 Dec 2025 12:34:30 +0100 Subject: [PATCH 05/15] LinkerTests.PreserveCustomHttpClientHandlers works --- .../Tasks/LinkerTests.cs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs index 56eab82079f..ef4995d36af 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs @@ -167,12 +167,17 @@ private void PreserveCustomHttpClientHandler ( string handlerAssembly, string testProjectName, string assemblyPath, - TrimMode trimMode) + TrimMode trimMode, + AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } testProjectName += trimMode.ToString (); var class_library = new XamarinAndroidLibraryProject { - IsRelease = true, + IsRelease = isRelease, ProjectName = "MyClassLibrary", Sources = { new BuildItem.Source ("MyCustomHandler.cs") { @@ -189,13 +194,14 @@ class MyCustomHandler : System.Net.Http.HttpMessageHandler } } }; + class_library.SetRuntime (runtime); using (var libBuilder = CreateDllBuilder ($"{testProjectName}/{class_library.ProjectName}")) { Assert.IsTrue (libBuilder.Build (class_library), $"Build for {class_library.ProjectName} should have succeeded."); } var proj = new XamarinAndroidApplicationProject { ProjectName = "MyApp", - IsRelease = true, + IsRelease = isRelease, TrimModeRelease = trimMode, Sources = { new BuildItem.Source ("Foo.cs") { @@ -203,6 +209,7 @@ class MyCustomHandler : System.Net.Http.HttpMessageHandler } } }; + proj.SetRuntime (runtime); proj.AddReference (class_library); proj.AddReferences ("System.Net.Http"); string handlerTypeFullName = string.IsNullOrEmpty(handlerAssembly) ? handlerType : handlerType + ", " + handlerAssembly; @@ -218,14 +225,14 @@ class MyCustomHandler : System.Net.Http.HttpMessageHandler } [Test] - public void PreserveCustomHttpClientHandlers ([Values (TrimMode.Partial, TrimMode.Full)] TrimMode trimMode) + public void PreserveCustomHttpClientHandlers ([Values (TrimMode.Partial, TrimMode.Full)] TrimMode trimMode, [Values] AndroidRuntime runtime) { PreserveCustomHttpClientHandler ("Xamarin.Android.Net.AndroidMessageHandler", "", - "temp/PreserveAndroidMessageHandler", "android-arm64/linked/Mono.Android.dll", trimMode); + $"temp/PreserveAndroidMessageHandler{trimMode}{runtime}", "android-arm64/linked/Mono.Android.dll", trimMode, runtime); PreserveCustomHttpClientHandler ("System.Net.Http.SocketsHttpHandler", "System.Net.Http", - "temp/PreserveSocketsHttpHandler", "android-arm64/linked/System.Net.Http.dll", trimMode); + $"temp/PreserveSocketsHttpHandler{trimMode}{runtime}", "android-arm64/linked/System.Net.Http.dll", trimMode, runtime); PreserveCustomHttpClientHandler ("MyCustomHandler", "MyClassLibrary", - "temp/MyCustomHandler", "android-arm64/linked/MyClassLibrary.dll", trimMode); + $"temp/MyCustomHandler{trimMode}{runtime}", "android-arm64/linked/MyClassLibrary.dll", trimMode, runtime); } [Test] From 1d0c8e30304527ded61ca5f1af8e7e7d6314e4eb Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 3 Dec 2025 12:38:50 +0100 Subject: [PATCH 06/15] LinkerTests.WarnAboutAppDomains works --- .../Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs index ef4995d36af..e25a7b55f10 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs @@ -236,8 +236,11 @@ public void PreserveCustomHttpClientHandlers ([Values (TrimMode.Partial, TrimMod } [Test] - public void WarnAboutAppDomains ([Values (true, false)] bool isRelease) + public void WarnAboutAppDomains ([Values] bool isRelease, [Values] AndroidRuntime runtime) { + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } if (isRelease) { // NOTE: trimmer warnings are hidden by default in .NET 7 rc1 Assert.Ignore("https://github.com/dotnet/linker/issues/2982"); @@ -253,8 +256,10 @@ public void WarnAboutAppDomains ([Values (true, false)] bool isRelease) } } }; + lib.SetRuntime (runtime); var app = new XamarinAndroidApplicationProject { IsRelease = isRelease }; + app.SetRuntime (runtime); app.SetAndroidSupportedAbis ("arm64-v8a"); app.AddReference (lib); using var libBuilder = CreateDllBuilder (Path.Combine (path, lib.ProjectName)); From 0333a5431a700f19891211d60f78cbf1a6cdc856 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Wed, 3 Dec 2025 12:45:32 +0100 Subject: [PATCH 07/15] LinkerTests.LinkWithNullAttribute works --- .../Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs index e25a7b55f10..3cf3b6a331b 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs @@ -378,10 +378,14 @@ public void LinkDescription ([Values (true, false)] bool useAssemblyStore, [Valu } [Test] - public void LinkWithNullAttribute () + public void LinkWithNullAttribute ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidApplicationProject { - IsRelease = true, + IsRelease = isRelease, OtherBuildItems = { new BuildItem ("Compile", "NullAttribute.cs") { TextContent = () => @" using System; @@ -414,6 +418,7 @@ public AttributedButtonStub (Context context) : base (context) } }; + proj.SetRuntime (runtime); proj.MainActivity = proj.DefaultMainActivity.Replace ("//${AFTER_ONCREATE}", $@" var myButton = new AttributedButtonStub (this); myButton.Text = ""Bug #35710""; From 161e275a1027fe884a4cc5bd152b4e208b2e5c76 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 4 Dec 2025 11:33:52 +0100 Subject: [PATCH 08/15] LinkerTests.AndroidAddKeepAlives works --- .../Tasks/LinkerTests.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs index 3cf3b6a331b..5949ec1eae3 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs @@ -433,7 +433,7 @@ static IEnumerable Get_AndroidAddKeepAlivesData () { var ret = new List (); - foreach (AndroidRuntime runtime in new[] { AndroidRuntime.MonoVM, AndroidRuntime.CoreCLR }) { + foreach (AndroidRuntime runtime in Enum.GetValues (typeof (AndroidRuntime))) { // Debug configuration AddTestData (isRelease: false, setAndroidAddKeepAlivesTrue: false, setLinkModeNone: false, shouldAddKeepAlives: false, runtime); @@ -465,6 +465,10 @@ void AddTestData (bool isRelease, bool setAndroidAddKeepAlivesTrue, bool setLink [TestCaseSource (nameof (Get_AndroidAddKeepAlivesData))] public void AndroidAddKeepAlives (bool isRelease, bool setAndroidAddKeepAlivesTrue, bool setLinkModeNone, bool shouldAddKeepAlives, AndroidRuntime runtime) { + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + if (runtime == AndroidRuntime.CoreCLR && isRelease && !setAndroidAddKeepAlivesTrue && setLinkModeNone && shouldAddKeepAlives) { // This currently fails with the following exception: // @@ -529,7 +533,12 @@ public unsafe bool MyMethod (Android.OS.IBinder windowToken, [global::Android.Ru var assemblyFile = "UnnamedProject.dll"; if (!isRelease || setLinkModeNone) { foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { - CheckAssembly (b.Output.GetIntermediaryPath (Path.Combine ("android", "assets", abi, assemblyFile)), projectDir); + string assemblyDir = runtime switch { + AndroidRuntime.NativeAOT => Path.Combine (MonoAndroidHelper.AbiToRid (abi), "linked"), + _ => Path.Combine ("android", "assets", abi) + }; + + CheckAssembly (b.Output.GetIntermediaryPath (Path.Combine (assemblyDir, assemblyFile)), projectDir); } } else { CheckAssembly (BuildTest.GetLinkedPath (b, true, assemblyFile), projectDir); From 585f5157f3d71cde14984122ccfc780e70ff68ba Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 4 Dec 2025 11:41:05 +0100 Subject: [PATCH 09/15] LinkerTests.AndroidUseNegotiateAuthentication works --- .../Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs index 5949ec1eae3..ad00c108593 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs @@ -579,9 +579,15 @@ void CheckAssembly (string assemblyPath, string projectDir) } [Test] - public void AndroidUseNegotiateAuthentication ([Values (true, false, null)] bool? useNegotiateAuthentication) + public void AndroidUseNegotiateAuthentication ([Values (true, false, null)] bool? useNegotiateAuthentication, [Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + var proj = new XamarinAndroidApplicationProject { IsRelease = true }; + proj.SetRuntime (runtime); proj.AddReferences ("System.Net.Http"); proj.MainActivity = proj.DefaultMainActivity.Replace ( "base.OnCreate (bundle);", From a7109487bc6e211dfa62e3fe30ce13b0e2577a7a Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 4 Dec 2025 11:46:20 +0100 Subject: [PATCH 10/15] LinkerTests.PreserveIX509TrustManagerSubclasses works --- .../Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs index ad00c108593..6dad45432f6 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs @@ -617,9 +617,14 @@ public void AndroidUseNegotiateAuthentication ([Values (true, false, null)] bool } [Test] - public void PreserveIX509TrustManagerSubclasses ([Values(true, false)] bool hasServerCertificateCustomValidationCallback) + public void PreserveIX509TrustManagerSubclasses ([Values] bool hasServerCertificateCustomValidationCallback, [Values] AndroidRuntime runtime) { - var proj = new XamarinAndroidApplicationProject { IsRelease = true }; + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + var proj = new XamarinAndroidApplicationProject { IsRelease = isRelease }; + proj.SetRuntime (runtime); proj.AddReferences ("System.Net.Http"); proj.MainActivity = proj.DefaultMainActivity.Replace ( "base.OnCreate (bundle);", From 099f3c69e9c3989f7cb060490608e7e8752f7850 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 4 Dec 2025 11:50:59 +0100 Subject: [PATCH 11/15] LinkerTests.PreserveServices works --- .../Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs index 6dad45432f6..8da7f1013f1 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs @@ -656,15 +656,21 @@ public void PreserveIX509TrustManagerSubclasses ([Values] bool hasServerCertific } [Test] - public void PreserveServices () + public void PreserveServices ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + var proj = new XamarinAndroidApplicationProject { - IsRelease = true, + IsRelease = isRelease, TrimModeRelease = TrimMode.Full, PackageReferences = { new Package { Id = "Plugin.Firebase.CloudMessaging", Version = "3.0.0" }, } }; + proj.SetRuntime (runtime); proj.MainActivity = proj.DefaultMainActivity .Replace ("//${FIELDS}", """ From 3e9b9961f21f5e3428a0719057383a1058d6c6a5 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 4 Dec 2025 11:58:23 +0100 Subject: [PATCH 12/15] LinkerTests.WarnWithReferenceToPreserveAttribute works --- .../Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs index 8da7f1013f1..1c995304248 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs @@ -802,9 +802,15 @@ void Assert64Bit(string rid, bool expected64) } [Test] - public void WarnWithReferenceToPreserveAttribute () + public void WarnWithReferenceToPreserveAttribute ([Values] AndroidRuntime runtime) { - var proj = new XamarinAndroidApplicationProject { IsRelease = true }; + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + + var proj = new XamarinAndroidApplicationProject { IsRelease = isRelease }; + proj.SetRuntime (runtime); proj.AddReferences ("System.Net.Http"); proj.MainActivity = proj.DefaultMainActivity.Replace ( "protected override void OnCreate", From 727298b9b496c0066d0cfbd0a0c4364c59f13ffd Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 4 Dec 2025 12:04:11 +0100 Subject: [PATCH 13/15] ResolveMonoAndroidSdksTests.NormalInputs works --- .../Tasks/ResolveMonoAndroidSdksTests.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs index 5b88fe568cd..238f65cc24c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using NUnit.Framework; +using Xamarin.Android.Tasks; using Xamarin.ProjectTools; namespace Xamarin.Android.Build.Tests @@ -40,9 +41,17 @@ static Dictionary ValuesFromLog (ProjectBuilder b) } [Test] - public void NormalInputs () + public void NormalInputs ([Values] AndroidRuntime runtime) { - var proj = new XamarinAndroidApplicationProject (); + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + + var proj = new XamarinAndroidApplicationProject { + IsRelease = isRelease, + }; + proj.SetRuntime (runtime); proj.SetProperty ("MonoAndroidToolsDirectory", "xat"); proj.SetProperty ("_JavaSdkDirectory", "jdk"); proj.SetProperty ("_AndroidSdkDirectory", "sdk"); From a7d0d6b7543c29a08f5f78d55531dbc5b6b31ed4 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 4 Dec 2025 12:07:20 +0100 Subject: [PATCH 14/15] ResolveMonoAndroidSdksTests.MissingAndroidNDK works --- .../Tasks/ResolveMonoAndroidSdksTests.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs index 238f65cc24c..cc1cf71efeb 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs @@ -72,9 +72,17 @@ public void NormalInputs ([Values] AndroidRuntime runtime) } [Test] - public void MissingAndroidNDK () + public void MissingAndroidNDK ([Values] AndroidRuntime runtime) { - var proj = new XamarinAndroidApplicationProject (); + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + + var proj = new XamarinAndroidApplicationProject { + IsRelease = isRelease, + }; + proj.SetRuntime (runtime); proj.SetProperty ("MonoAndroidToolsDirectory", "xat"); proj.SetProperty ("_JavaSdkDirectory", "jdk"); proj.SetProperty ("_AndroidSdkDirectory", "sdk"); From 67571c45d88dac051988cd311524e5b13d01cacf Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 4 Dec 2025 12:10:20 +0100 Subject: [PATCH 15/15] ResolveMonoAndroidSdksTests.HasTrailingSlash works --- .../Tasks/ResolveMonoAndroidSdksTests.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs index cc1cf71efeb..45f522b886f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveMonoAndroidSdksTests.cs @@ -103,9 +103,16 @@ public void MissingAndroidNDK ([Values] AndroidRuntime runtime) } [Test] - public void HasTrailingSlash () + public void HasTrailingSlash ([Values] AndroidRuntime runtime) { - var proj = new XamarinAndroidApplicationProject (); + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + + var proj = new XamarinAndroidApplicationProject { + IsRelease = isRelease, + }; proj.SetProperty ("MonoAndroidToolsDirectory", $"xat{Path.DirectorySeparatorChar}"); proj.SetProperty ("_JavaSdkDirectory", $"jdk{Path.DirectorySeparatorChar}"); proj.SetProperty ("_AndroidSdkDirectory", $"sdk{Path.DirectorySeparatorChar}");