Skip to content

Commit

Permalink
[Xamarin.Android.Buid.Tasks] don't set $(PublishSelfContained) for .N…
Browse files Browse the repository at this point in the history
…ET 9 (#8565)

Context: dotnet/sdk@d21e6bf
Context: 8fa5d99
Context: 0cd963a
Context: 95946d2
Context: 964746e

Building a `net8.0-android` project with a .NET 9 SDK will fail when
providing an RID:

	> dotnet publish
	# works

	> dotnet publish -r android-arm64
	MSBuild version 17.9.0-preview-23577-01+31108edc1 for .NET
	…
	bin\Debug\dotnet\sdk\9.0.100-alpha.1.23603.1\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.FrameworkReferenceResolution.targets(494,5):
	error NETSDK1112: The runtime pack for Microsoft.Android.Runtime.34.android-arm64 was not downloaded. Try running a NuGet restore with the RuntimeIdentifier 'android-arm64'.

Our repo also sets `$(DisableTransitiveFrameworkReferenceDownloads)`
within unit tests (95946d2), which causes a slightly different error
message:

	error NETSDK1185: The Runtime Pack for FrameworkReference 'Microsoft.Android.Runtime.34.android-arm' was not available. This may be because DisableTransitiveFrameworkReferenceDownloads was set to true.

which matches the TODO within 8fa5d99:

>  * A specific case of `dotnet publish -f net8.0-android -r android-arm`
>    is failing with:
> 
>        error NETSDK1185: The Runtime Pack for FrameworkReference 'Microsoft.Android.Runtime.34.android-arm' was not available. This may be because DisableTransitiveFrameworkReferenceDownloads was set to true.
> 
>    This is related to `$(AllowSelfContainedWithoutRuntimeIdentifier)`,
>    but I will address in a future PR.  This will likely require .NET 8
>    Android workload changes.

In .NET 8, 0cd963a began setting `$(PublishSelfContained)`=false
as a way to avoid the error:

	Microsoft.NET.RuntimeIdentifierInference.targets(212,5):
	error NETSDK1191: A runtime identifier for the property 'SelfContained' couldn't be inferred. Specify a rid explicitly.

Because Android is always self-contained, we set `$(SelfContained)`
through other means (964746e; `$(SelfContained)` is set as part of the
inner builds), and everything worked.

In .NET 9, other changes were made such that this "workaround" no
longer works.  To fix this, @@rolfbjarne introduced dotnet/sdk@d21e6bf5
and `$(AllowSelfContainedWithoutRuntimeIdentifier)` as a way to fix the
issue going forward in .NET 9.  We are using the new property in .NET 9
since 8fa5d99.

Unfortunately, this leaves one case that is still broken:

 1. Create a new project with `$(TargetFramework)`=net8.0-android
    (i.e. a .NET 8 project)

 2. Using the .NET 9 SDK

 3. Building while specifying a RID, e.g.
 
        dotnet publish -r android-arm64

It seems like, for now, we can just condition our workaround for
.NET 8 and below:

	<PublishSelfContained Condition=" '$(PublishSelfContained)' == '' and $([MSBuild]::VersionLessThan($(NETCoreSdkVersion), '9.0')) ">false</PublishSelfContained>

Making this change locally, both cases work for me:

  * .NET 8 project, .NET 8 SDK: `dotnet publish -r android-arm64`

  * .NET 8 project, .NET 9 SDK: `dotnet publish -r android-arm64`

The only other solution would be to create our own empty
`_CheckForUnsupportedAppHostUsage` target to avoid errors, but that
seems explicitly worse.  We should also backport dotnet/sdk#d21e6bf5
to .NET 8 SDKs, but it will probably take a month for that to ship.

After this is merged and we have a new, nightly .NET 8 build, we can
restore the [`XASdkTests.DotNetPublish()` unit test][0] on main.

[0]: https://github.com/xamarin/xamarin-android/blob/40cc8eaf78eb9f95abcc0e966ab274cef1692acc/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs#L202-L205
  • Loading branch information
jonathanpeppers authored Dec 13, 2023
1 parent 3333306 commit 73efcfc
Showing 1 changed file with 1 addition and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
This prevents an early error message during 'dotnet publish'.
We handle $(SelfContained) in a custom way where it is forced to be true.
-->
<PublishSelfContained Condition=" '$(PublishSelfContained)' == '' ">false</PublishSelfContained>
<PublishSelfContained Condition=" '$(PublishSelfContained)' == '' and $([MSBuild]::VersionLessThan($(NETCoreSdkVersion), '9.0')) ">false</PublishSelfContained>
<AndroidLinkMode Condition=" '$(AndroidLinkMode)' == '' and '$(PublishTrimmed)' == 'true' ">SdkOnly</AndroidLinkMode>
<AndroidLinkMode Condition=" '$(AndroidLinkMode)' == '' ">None</AndroidLinkMode>
<!-- For compat with user code not marked trimmable, only trim opt-in by default. -->
Expand Down

0 comments on commit 73efcfc

Please sign in to comment.