From b25b841cb381269bc48d8b3c3041214a7a738341 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Fri, 13 Mar 2026 12:08:03 -0500 Subject: [PATCH 1/2] [xabt] Filter non-Android .so files from _ResolvedNativeLibraries NuGet packages like Microsoft.Testing.Extensions.CodeCoverage ship native .so files under runtimes/linux-x64/native/. The .NET SDK stamps RuntimeIdentifier=android-arm64 metadata on all ResolvedFileToPublish items during inner builds, causing ProcessNativeLibraries to treat these non-Android libraries as valid Android native libs. This leads to spurious XA0141 warnings about 16 KB page alignment. Use %(PathInPackage) metadata to detect the actual source RID and exclude .so files from non-Android runtimes (linux-x64, linux-musl-x64, osx-x64, win-x64, etc.) while preserving android-* and linux-bionic-* RIDs which are valid Android targets. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Microsoft.Android.Sdk.AssemblyResolution.targets | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets index 6b627177c5e..e53ef3e7f3e 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets @@ -248,6 +248,16 @@ _ResolveAssemblies MSBuild target. <_ResolvedNativeLibraries Include="@(ResolvedFileToPublish)" Condition=" '%(ResolvedFileToPublish.Extension)' == '.so' " /> + + <_ResolvedNativeLibraries Remove="@(_ResolvedNativeLibraries)" + Condition=" '%(PathInPackage)' != '' And + $([System.String]::new('%(PathInPackage)').StartsWith('runtimes/')) And + !$([System.String]::new('%(PathInPackage)').StartsWith('runtimes/android')) And + !$([System.String]::new('%(PathInPackage)').StartsWith('runtimes/linux-bionic')) " /> <_MonoComponent Condition=" '$(AndroidEnableProfiler)' == 'true' " Include="diagnostics_tracing" /> From 8899be4df5312c285e0eab9f79b61b83ec590c1a Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Fri, 13 Mar 2026 12:29:19 -0500 Subject: [PATCH 2/2] [xabt] Fix non-Android .so filter and add test Use %(Identity) path instead of %(PathInPackage) metadata to filter non-Android .so files from _ResolvedNativeLibraries, since runtime pack items don't define PathInPackage (causing MSB4096). Add NonAndroidNativeLibrariesDoNotProduceWarnings test that injects a fake linux-x64 .so into ResolvedFileToPublish with RuntimeIdentifier set to android-arm64, verifying the filter prevents spurious warnings. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ...oft.Android.Sdk.AssemblyResolution.targets | 9 +++--- .../Xamarin.Android.Build.Tests/BuildTest2.cs | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets index e53ef3e7f3e..ed73ea268e4 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets @@ -251,13 +251,12 @@ _ResolveAssemblies MSBuild target. <_ResolvedNativeLibraries Remove="@(_ResolvedNativeLibraries)" - Condition=" '%(PathInPackage)' != '' And - $([System.String]::new('%(PathInPackage)').StartsWith('runtimes/')) And - !$([System.String]::new('%(PathInPackage)').StartsWith('runtimes/android')) And - !$([System.String]::new('%(PathInPackage)').StartsWith('runtimes/linux-bionic')) " /> + Condition=" $([System.String]::new('%(Identity)').Replace('\','/').Contains('/runtimes/')) And + !$([System.String]::new('%(Identity)').Replace('\','/').Contains('/runtimes/android')) And + !$([System.String]::new('%(Identity)').Replace('\','/').Contains('/runtimes/linux-bionic')) " /> <_MonoComponent Condition=" '$(AndroidEnableProfiler)' == 'true' " Include="diagnostics_tracing" /> diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs index da233a70a47..d1f97917d20 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs @@ -629,6 +629,38 @@ public void XA0141ErrorIsRaised ([Values] bool isRelease, [Values] AndroidRuntim } } + [Test] + public void NonAndroidNativeLibrariesDoNotProduceWarnings () + { + var proj = new XamarinAndroidApplicationProject (); + // Create a dummy .so at a path mimicking a non-Android NuGet native library + proj.OtherBuildItems.Add (new BuildItem ("None", "runtimes/linux-x64/native/libFake.so") { + BinaryContent = () => new byte [128], + }); + // Inject it into ResolvedFileToPublish with RuntimeIdentifier=android-arm64, + // simulating what the .NET SDK does for packages like Microsoft.Testing.Extensions.CodeCoverage + proj.Imports.Add (new Import ("non-android-so.targets") { + TextContent = () => + """ + + + + + + android-arm64 + FakePackage + 1.0.0 + + + + + """, + }); + using var b = CreateApkBuilder (); + Assert.IsTrue (b.Build (proj), "Build should have succeeded."); + b.AssertHasNoWarnings (); + } + static IEnumerable Get_XA1037PropertyDeprecatedWarningData () { var ret = new List ();