diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.CoreCLR.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.CoreCLR.targets index 705237961ab..a74ffe62b34 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.CoreCLR.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.CoreCLR.targets @@ -13,8 +13,8 @@ This file contains the CoreCLR-specific MSBuild logic for .NET for Android. - - true + + true true <_IsPublishing Condition=" '$(_IsPublishing)' == '' and '$(PublishReadyToRun)' == 'true' ">true true diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs index e3c049a1295..3a863bd0fb2 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Xml.Linq; using System.Reflection; +using System.Reflection.PortableExecutable; using System.Text; using NUnit.Framework; using Xamarin.Android.Tools; @@ -279,6 +280,37 @@ public void DotNetPublishDefaultValues ([Values] bool isRelease, [Values] Androi Assert.IsTrue (dotnet.Publish (), "`dotnet publish` should succeed"); } + [Test] + public void DotNetPublishReadyToRunCustomConfiguration () + { + const string runtimeIdentifier = "android-arm64"; + var proj = new XamarinAndroidApplicationProject (); + proj.SetRuntime (AndroidRuntime.CoreCLR); + proj.SetProperty (KnownProperties.RuntimeIdentifier, runtimeIdentifier); + proj.SetProperty ("AndroidEnableAssemblyCompression", "false"); + + var builder = CreateDllBuilder (); + builder.Save (proj); + var dotnet = new DotNetCLI (Path.Combine (Root, builder.ProjectDirectory, proj.ProjectFilePath)); + Assert.IsTrue (dotnet.Publish (parameters: new [] { "Configuration=CustomRelease" }), "`dotnet publish -c CustomRelease` should succeed"); + + var assemblyName = proj.ProjectName; + // Configuration=CustomRelease produces output under bin/CustomRelease/ + var publishDirectory = Path.Combine (Root, builder.ProjectDirectory, "bin", "CustomRelease", runtimeIdentifier, "publish"); + var apkSigned = Path.Combine (publishDirectory, $"{proj.PackageName}-Signed.apk"); + FileAssert.Exists (apkSigned); + + var helper = new ArchiveAssemblyHelper (apkSigned, true); + var abi = MonoAndroidHelper.RidToAbi (runtimeIdentifier); + Assert.IsTrue (helper.Exists ($"assemblies/{abi}/{assemblyName}.dll"), $"{assemblyName}.dll should exist in apk!"); + + using var stream = helper.ReadEntry ($"assemblies/{assemblyName}.dll"); + stream.Position = 0; + using var peReader = new PEReader (stream); + Assert.IsTrue (peReader.PEHeaders.CorHeader.ManagedNativeHeaderDirectory.Size > 0, + $"ReadyToRun image not found in {assemblyName}.dll! ManagedNativeHeaderDirectory should not be empty!"); + } + [Test] public void DotNetPublish ([Values] bool isRelease, [ValueSource (nameof(Get_DotNetTargetFrameworks_Data))] object[] data) {