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 2d622b7e161..075ad1e9b3f 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 @@ -107,11 +107,8 @@ public void BuildBasicApplication ([Values (true, false)] bool isRelease, [Value } [Test] - public void BasicApplicationOtherRuntime ([Values (true, false)] bool isRelease) + public void BasicApplicationBuildCoreCLR ([Values (true, false)] bool isRelease) { - // This test would fail, as it requires **our** updated runtime pack, which isn't currently created - // It is created in `src/native/native-clr.csproj` which isn't built atm. - Assert.Ignore ("CoreCLR support isn't fully enabled yet. This test will be enabled in a follow-up PR."); var proj = new XamarinAndroidApplicationProject { IsRelease = isRelease, // Add locally downloaded CoreCLR packs @@ -124,6 +121,64 @@ public void BasicApplicationOtherRuntime ([Values (true, false)] bool isRelease) Assert.IsTrue (b.Build (proj), "Build should have succeeded."); } + static object [] ReadyToRunConfigurationSource = new object [] { + new object[] { + /* isComposite */ true, + /* rid */ "android-x64" + }, + new object[] { + /* isComposite */ false, + /* rid */ "android-x64" + }, + new object[] { + /* isComposite */ true, + /* rid */ "android-arm64" + }, + new object[] { + /* isComposite */ false, + /* rid */ "android-arm64" + } + }; + + [Test] + [TestCaseSource (nameof (ReadyToRunConfigurationSource))] + public void BasicApplicationPublishReadyToRun (bool isComposite, string rid) + { + var proj = new XamarinAndroidApplicationProject { + IsRelease = true, + // Add locally downloaded CoreCLR packs + ExtraNuGetConfigSources = { + Path.Combine (XABuildPaths.BuildOutputDirectory, "nuget-unsigned"), + } + }; + + proj.SetProperty ("RuntimeIdentifier", rid); + proj.SetProperty ("UseMonoRuntime", "false"); // Enables CoreCLR + proj.SetProperty ("_IsPublishing", "true"); // Make "dotnet build" act as "dotnet publish" + proj.SetProperty ("PublishReadyToRun", "true"); // Enable R2R + proj.SetProperty ("AndroidEnableAssemblyCompression", "false"); + + if (isComposite) + proj.SetProperty ("PublishReadyToRunComposite", "true"); // Enable R2R composite + + var b = CreateApkBuilder (); + Assert.IsTrue (b.Build (proj), "Build should have succeeded."); + + var assemblyName = proj.ProjectName; + var apk = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, rid, $"{proj.PackageName}-Signed.apk"); + FileAssert.Exists (apk); + + var helper = new ArchiveAssemblyHelper (apk, true); + var abi = MonoAndroidHelper.RidToAbi (rid); + 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 System.Reflection.PortableExecutable.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 NativeAOT () { diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 07408951c6e..43e4ca59898 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -342,13 +342,10 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved. true True False - True + True - False + False - - False <_AndroidUseMarshalMethods Condition=" '$(AndroidIncludeDebugSymbols)' == 'True' ">False <_AndroidUseMarshalMethods Condition=" '$(AndroidIncludeDebugSymbols)' != 'True' ">$(AndroidEnableMarshalMethods) @@ -2062,7 +2059,7 @@ because xbuild doesn't support framework reference assemblies.