diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets
index f03550603d9..f0161e4a517 100644
--- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets
+++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets
@@ -29,9 +29,11 @@
See: https://github.com/dotnet/sdk/blob/955c0fc7b06e2fa34bacd076ed39f61e4fb61716/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets#L16
-->
<_GetChildProjectCopyToPublishDirectoryItems>false
- <_AndroidRuntime Condition=" '$(PublishAot)' == 'true' ">NativeAOT
- <_AndroidRuntime Condition=" '$(PublishAot)' != 'true' and '$(UseMonoRuntime)' == 'true' ">MonoVM
+
+ <_AndroidRuntime Condition=" '$(_AndroidRuntime)' == '' and '$(PublishAot)' == 'true' and ('$(_IsPublishing)' == 'true' or '$(Optimize)' == 'true') ">NativeAOT
+ <_AndroidRuntime Condition=" '$(_AndroidRuntime)' == '' and '$(UseMonoRuntime)' == 'true' ">MonoVM
<_AndroidRuntime Condition=" '$(_AndroidRuntime)' == '' ">CoreCLR
+ false
true
diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.NativeAOT.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.NativeAOT.targets
index 9ec28273a23..3a89f1c582f 100644
--- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.NativeAOT.targets
+++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.NativeAOT.targets
@@ -100,6 +100,10 @@ This file contains the NativeAOT-specific MSBuild logic for .NET for Android.
<_NdkPrebuiltAbi Condition=" $([MSBuild]::IsOSPlatform('windows')) ">windows-x86_64
<_NdkPrebuiltAbi Condition=" $([MSBuild]::IsOSPlatform('osx')) ">darwin-x86_64
<_NdkPrebuiltAbi Condition=" $([MSBuild]::IsOSPlatform('linux')) ">linux-x86_64
+
+ <_AndroidNativeAotRuntimeFlavor Condition=" '$(Optimize)' == 'true' ">release
+ <_AndroidNativeAotRuntimeFlavor Condition=" '$(_AndroidNativeAotRuntimeFlavor)' == '' ">debug
+ <_AndroidNativeAotRuntimeLibraryName>libnaot-android.$(_AndroidNativeAotRuntimeFlavor)-static-$(_AndroidNativeAotRuntimeFlavor)
- <_NdkLibs Include="@(RuntimePackAsset->WithMetadataValue('Filename', 'libnaot-android.$(Configuration.ToLower())-static-$(Configuration.ToLower())'))" />
+ <_NdkLibs Include="@(RuntimePackAsset->WithMetadataValue('Filename', '$(_AndroidNativeAotRuntimeLibraryName)'))" />
<_NdkLibs Include="$(_NdkSysrootDir)libc++_static.a" />
@@ -278,7 +282,7 @@ This file contains the NativeAOT-specific MSBuild logic for .NET for Android.
_RuntimePackLibraryDirectory is not populated for NativeAOT, so derive the path from
the libnaot-android RuntimePackAsset item. -->
- <_NativeAotRuntimePackAsset Include="@(RuntimePackAsset->WithMetadataValue('Filename', 'libnaot-android.$(Configuration.ToLower())-static-$(Configuration.ToLower())'))" />
+ <_NativeAotRuntimePackAsset Include="@(RuntimePackAsset->WithMetadataValue('Filename', '$(_AndroidNativeAotRuntimeLibraryName)'))" />
<_NativeAotRuntimePackNativeDir>@(_NativeAotRuntimePackAsset->'%(RootDir)%(Directory)')
@@ -334,7 +338,7 @@ This file contains the NativeAOT-specific MSBuild logic for .NET for Android.
- <_NativeAotLinkLibraries Include="@(RuntimePackAsset->WithMetadataValue('Filename', 'libnaot-android.$(Configuration.ToLower())-static-$(Configuration.ToLower())'))" />
+ <_NativeAotLinkLibraries Include="@(RuntimePackAsset->WithMetadataValue('Filename', '$(_AndroidNativeAotRuntimeLibraryName)'))" />
<_NativeAotLinkLibraries Include="$(_NativeAotRuntimePackNativeDir)libc++_static.a" />
<_NativeAotLinkLibraries Include="$(_NativeAotRuntimePackNativeDir)libc++abi.a" />
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs
index e206f1deb68..792effba141 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs
@@ -1585,7 +1585,8 @@ public void SolutionBuildSeveralProjects ([Values (AndroidRuntime.CoreCLR, Andro
});
}
- Assert.IsTrue (sb.Build (), "Solution should have built.");
+ var parameters = isRelease ? new [] { "Configuration=Release" } : [];
+ Assert.IsTrue (sb.Build (parameters), "Solution should have built.");
}
}
}
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs
index 751e51f9562..4c71528963c 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs
@@ -414,8 +414,9 @@ public void AllProjectsHaveSameOutputDirectory ([Values (AndroidRuntime.CoreCLR,
};
app2.SetRuntime (runtime);
sb.Projects.Add (app2);
- Assert.IsTrue (sb.Build (), "Build of solution should have succeeded");
- Assert.IsTrue (sb.ReBuild (), "ReBuild of solution should have succeeded");
+ var parameters = isRelease ? new [] { "Configuration=Release" } : [];
+ Assert.IsTrue (sb.Build (parameters), "Build of solution should have succeeded");
+ Assert.IsTrue (sb.ReBuild (parameters), "ReBuild of solution should have succeeded");
sb.Dispose ();
}
@@ -453,8 +454,9 @@ public void BuildSolutionWithMultipleProjectsInParallel ([Values (AndroidRuntime
sb.Projects.Add (app1);
}
sb.BuildingInsideVisualStudio = false;
- Assert.IsTrue (sb.Build (), "Build of solution should have succeeded");
- Assert.IsTrue (sb.ReBuild (), "ReBuild of solution should have succeeded");
+ var parameters = runtime == AndroidRuntime.NativeAOT ? new [] { "Configuration=Release" } : [];
+ Assert.IsTrue (sb.Build (parameters), "Build of solution should have succeeded");
+ Assert.IsTrue (sb.ReBuild (parameters), "ReBuild of solution should have succeeded");
sb.Dispose ();
}
diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/TrimmableTypeMapBuildTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/TrimmableTypeMapBuildTests.cs
index 769a2e4992b..1b55c0823fc 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/TrimmableTypeMapBuildTests.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/TrimmableTypeMapBuildTests.cs
@@ -48,10 +48,9 @@ public void Build_PublishAotProject_UsesTrimmableTypeMapForCoreClrDebug ()
};
proj.SetRuntime (AndroidRuntime.CoreCLR);
proj.SetProperty (KnownProperties.PublishAot, "true");
- proj.SetProperty ("NativeCompilationDuringPublish", "false");
using var builder = CreateApkBuilder ();
- Assert.IsTrue (builder.Build (proj, parameters: [ "_AndroidRuntime=CoreCLR" ]), "Build should have succeeded.");
+ Assert.IsTrue (builder.Build (proj), "Build should have succeeded.");
var intermediateDir = builder.Output.GetIntermediaryPath ("typemap");
AssertTrimmableTypeMapOutputs (intermediateDir);
diff --git a/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs b/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs
index 93e64d8656b..c4a5a2feed5 100644
--- a/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs
+++ b/tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs
@@ -2754,6 +2754,44 @@ public static void logEvent(String eventName) {{
RunProjectAndAssert (proj, builder);
}
+ [Test]
+ public void NativeAOTCustomReleaseConfiguration ([Values] bool publish)
+ {
+ const string configuration = "AppStore";
+ var proj = new XamarinAndroidApplicationProject (releaseConfigurationName: configuration) {
+ IsRelease = true,
+ };
+ proj.SetRuntime (AndroidRuntime.NativeAOT);
+ var rid = MonoAndroidHelper.AbiToRid (DeviceAbi);
+ proj.SetProperty ("RuntimeIdentifier", rid);
+ proj.SetProperty (proj.ReleaseProperties, "Optimize", "true");
+ proj.SetProperty (proj.ReleaseProperties, "DebugType", "None");
+
+ using var builder = CreateApkBuilder ();
+ builder.Save (proj);
+
+ var dotnet = new DotNetCLI (Path.Combine (Root, builder.ProjectDirectory, proj.ProjectFilePath));
+ var arguments = new [] { "-c", configuration };
+ var succeeded = publish
+ ? dotnet.Publish (runtimeIdentifier: rid, msbuildArguments: arguments)
+ : dotnet.Build (runtimeIdentifier: rid, msbuildArguments: arguments);
+ Assert.IsTrue (succeeded, $"`dotnet {(publish ? "publish" : "build")} -c {configuration}` should succeed");
+
+ var outputDirectory = Path.Combine (Root, builder.ProjectDirectory, proj.OutputPath, rid);
+ if (publish) {
+ outputDirectory = Path.Combine (outputDirectory, "publish");
+ }
+ var apk = Path.Combine (outputDirectory, $"{proj.PackageName}-Signed.apk");
+ FileAssert.Exists (apk);
+ Assert.That (RunAdbCommand ($"install -r \"{apk}\"").Trim (), Does.EndWith ("Success"), "APK should install.");
+
+ ClearAdbLogcat ();
+ StartActivityAndAssert (proj);
+ Assert.IsTrue (WaitForActivityToStart (proj.PackageName, "MainActivity",
+ Path.Combine (Root, builder.ProjectDirectory, "logcat.log"), ActivityStartTimeoutInSeconds),
+ "Activity should have started.");
+ }
+
[Test]
public void NativeAOTSample ()
{