diff --git a/Documentation/docs-mobile/TOC.yml b/Documentation/docs-mobile/TOC.yml index 25edf535e06..1244c066b05 100644 --- a/Documentation/docs-mobile/TOC.yml +++ b/Documentation/docs-mobile/TOC.yml @@ -270,6 +270,8 @@ href: messages/xa1043.md - name: XA1048 href: messages/xa1048.md + - name: XA1049 + href: messages/xa1049.md - name: "XA2xxx: Linker" items: - name: "XA2xxx: Linker" diff --git a/Documentation/docs-mobile/building-apps/build-properties.md b/Documentation/docs-mobile/building-apps/build-properties.md index 11d6036471b..475a57bbbdd 100644 --- a/Documentation/docs-mobile/building-apps/build-properties.md +++ b/Documentation/docs-mobile/building-apps/build-properties.md @@ -399,6 +399,9 @@ for Java `native` method registration. This property is False by default. +This property cannot be set to `true` when +[`$(PublishReadyToRun)`](#publishreadytorun) is `true`. + Added in .NET 8. ## AndroidEnableMultiDex diff --git a/Documentation/docs-mobile/messages/index.md b/Documentation/docs-mobile/messages/index.md index 8c4ea0192de..dabb47571de 100644 --- a/Documentation/docs-mobile/messages/index.md +++ b/Documentation/docs-mobile/messages/index.md @@ -158,6 +158,7 @@ Either change the value in the AndroidManifest.xml to match the $(SupportedOSPla + [XA1046](xa1046.md): Attribute '{0}' in element '{1}' has value '{2}' that cannot be parsed as boolean; {3} line {4}. + [XA1047](xa1047.md): Required attribute '{0}' missing from element '{1}'; {2} line {3}. + [XA1048](xa1048.md): '{0}' does not contain an <instrumentation> element. ++ [XA1049](xa1049.md): The 'AndroidEnableMarshalMethods' and 'PublishReadyToRun' MSBuild properties cannot both be set to 'true'. ## XA2xxx: Linker diff --git a/Documentation/docs-mobile/messages/xa1049.md b/Documentation/docs-mobile/messages/xa1049.md new file mode 100644 index 00000000000..4d617f1abda --- /dev/null +++ b/Documentation/docs-mobile/messages/xa1049.md @@ -0,0 +1,41 @@ +--- +title: .NET for Android error XA1049 +description: XA1049 error code +ms.date: 08/31/2026 +f1_keywords: + - "XA1049" +--- + +# .NET for Android error XA1049 + +## Example messages + +```dotnetcli +error XA1049: The 'AndroidEnableMarshalMethods' and 'PublishReadyToRun' MSBuild properties cannot both be set to 'true'. Set one property to 'false'. +``` + +## Issue + +[`$(AndroidEnableMarshalMethods)`](../building-apps/build-properties.md#androidenablemarshalmethods) +rewrites managed assemblies after trimming, while +[`$(PublishReadyToRun)`](../building-apps/build-properties.md#publishreadytorun) +adds native code to those assemblies. The marshal methods rewriter cannot modify +ReadyToRun assemblies. + +## Solution + +Disable marshal methods or ReadyToRun in the project file: + +```xml + + false + +``` + +Alternatively: + +```xml + + false + +``` diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs b/src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs index 15af76356e0..db2a9c4243c 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs @@ -1015,6 +1015,15 @@ public static string XA1048 { return ResourceManager.GetString("XA1048", resourceCulture); } } + + /// + /// Looks up a localized string similar to The 'AndroidEnableMarshalMethods' and 'PublishReadyToRun' MSBuild properties cannot both be set to 'true'. Set one property to 'false'.. + /// + public static string XA1049 { + get { + return ResourceManager.GetString("XA1049", resourceCulture); + } + } /// /// Looks up a localized string similar to Use of AppDomain.CreateDomain() detected in assembly: {0}. .NET 6 and higher will only support a single AppDomain, so this API will no longer be available in .NET for Android once .NET 6 is released.. diff --git a/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx b/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx index 75a82d67971..aef2dbc527a 100644 --- a/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx +++ b/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx @@ -1128,6 +1128,10 @@ To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MS {0} - The path to the AndroidManifest.xml file. + + The 'AndroidEnableMarshalMethods' and 'PublishReadyToRun' MSBuild properties cannot both be set to 'true'. Set one property to 'false'. + The following are literal names and should not be translated: AndroidEnableMarshalMethods, PublishReadyToRun, MSBuild, true, false. + Java dependency '{0}' is not satisfied. The following are literal names and should not be translated: Java. 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 b5c91792cf8..19d3f973235 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 @@ -101,6 +101,25 @@ public void BasicApplicationPublishReadyToRun ([Values] bool isComposite, [Value StringAssert.Contains ("@uncompressed_assemblies_data_buffer = dso_local local_unnamed_addr global [0 x i8] zeroinitializer, align 1", compressedAssembliesSourceText); } + [Test] + public void AndroidEnableMarshalMethodsWithReadyToRunFailsBuild () + { + var proj = new XamarinAndroidApplicationProject { + IsRelease = true, + EnableMarshalMethods = true, + }; + proj.SetRuntime (AndroidRuntime.CoreCLR); + proj.SetProperty ("PublishReadyToRun", "true"); + + using var b = CreateApkBuilder (); + b.ThrowOnBuildFailure = false; + Assert.IsFalse (b.Build (proj), "Build should have failed."); + StringAssertEx.Contains ("error XA1049", b.LastBuildOutput); + StringAssertEx.Contains ("AndroidEnableMarshalMethods", b.LastBuildOutput); + StringAssertEx.Contains ("PublishReadyToRun", b.LastBuildOutput); + StringAssertEx.DoesNotContain ("XARMM7015", b.LastBuildOutput, "Build should fail before rewriting ReadyToRun assemblies."); + } + [Test] public void BasicApplicationPublishReadyToRunCustomConfiguration ([Values] bool isComposite, [Values ("android-x64", "android-arm64")] string rid) { diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 72b19c3ffec..2c081594465 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -532,6 +532,10 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved. ResourceName="XA0119_ReadyToRunWithoutTrimming" Condition=" '$(_AndroidReadyToRunWithoutTrimming)' == 'true' " /> +