Skip to content

Comments

Default .NET 11 to target net11.0-android36.1 only#10829

Draft
jonathanpeppers wants to merge 10 commits intomainfrom
dev/peppers/36.1-default
Draft

Default .NET 11 to target net11.0-android36.1 only#10829
jonathanpeppers wants to merge 10 commits intomainfrom
dev/peppers/36.1-default

Conversation

@jonathanpeppers
Copy link
Member

Stop building API 36.0 as a separate stable target and make net11.0-android36.1 the sole default target framework for .NET 11. Targeting net11.0-android36 (36.0) is no longer supported on .NET 11; it remains valid for net10.0.

Changes:

  • Configuration.props: Set AndroidLatestStableApiLevel to 36.1, update framework version to v16.1, comment out AndroidLatestStableApiLevel2 with a 37.1 example for future use
  • SupportedPlatforms.targets: Default TargetPlatformVersion changed to 36.1, mark 36.0 as DefineConstantsOnly (no targeting pack)
  • BundledVersions.targets: Update generated _AndroidLatestStableApiLevel
  • Mono.Android.csproj: Adjust IsUnstableVersion to handle the commented-out AndroidLatestStableApiLevel2 gracefully
  • AndroidToolchain.cs: Remove isLatestStable from platform-36
  • Xamarin.Android.Common.props: Update AndroidSdkPlatformVersion
  • Tests: Remove android36 (Major-only) test case from Get_DotNetTargetFrameworks_Data, replace hardcoded .1 references with XABuildConfig.AndroidLatestStableApiLevel

Stop building API 36.0 as a separate stable target and make
net11.0-android36.1 the sole default target framework for .NET 11.
Targeting net11.0-android36 (36.0) is no longer supported on .NET 11;
it remains valid for net10.0.

Changes:
- Configuration.props: Set AndroidLatestStableApiLevel to 36.1,
  update framework version to v16.1, comment out
  AndroidLatestStableApiLevel2 with a 37.1 example for future use
- SupportedPlatforms.targets: Default TargetPlatformVersion changed
  to 36.1, mark 36.0 as DefineConstantsOnly (no targeting pack)
- BundledVersions.targets: Update generated _AndroidLatestStableApiLevel
- Mono.Android.csproj: Adjust IsUnstableVersion to handle the
  commented-out AndroidLatestStableApiLevel2 gracefully
- AndroidToolchain.cs: Remove isLatestStable from platform-36
- Xamarin.Android.Common.props: Update AndroidSdkPlatformVersion
- Tests: Remove android36 (Major-only) test case from
  Get_DotNetTargetFrameworks_Data, replace hardcoded .1 references
  with XABuildConfig.AndroidLatestStableApiLevel
The v16.1 assembly has expected attribute differences from v16.0:
- ObsoletedOSPlatformAttribute removed from WifiConfiguration members
  that were undeprecated in API 36.1
- RequiresPermissionAttribute removed from TelephonyManager members
  where permission requirements changed
@jonathanpeppers jonathanpeppers added copilot `copilot-cli` or other AIs were used to author this labels Feb 18, 2026
…nyManager

The net11.0 reference assembly was built against API 36.0, but the
implementation now targets 36.1 where WifiConfiguration was undeprecated
and TelephonyManager permission attributes changed.
The android workload packs list referenced API 36 packs (Ref, Runtime,
Mono, CoreCLR, NativeAOT) but the build now only produces 36.1 packs.
Update the packs list to reference 36.1 and add 36.1 pack definitions
for all Mono/CoreCLR/NativeAOT runtime flavors. The 36 pack definitions
are retained for net10 resolution via KnownFrameworkReference.
When multiple API versions share the same ApiLevel (e.g. 36.0 and 36.1
both have ApiLevel=36), GetIdFromApiLevel(36) can return '36.1' if that
entry appears first in installedVersions. This causes the manifest merger
to reject the non-integer targetSdkVersion value.

TargetSdkVersion is already resolved to the integer API level string by
GenerateMainAndroidManifest, so return it directly instead of round-tripping
through GetIdFromApiLevel which can pick the wrong version's Id.
Use MonoAndroidHelper.TryParseApiLevel to parse AndroidApiLevel into a
System.Version, preserving the minor version (e.g. 36.1). Use
GetIdFromVersionCodeFull to get the correct platform directory name.

Make AndroidApiLevel [Required] and remove unused TargetFrameworkVersion
property since _AndroidApiLevel is always set by ResolveAndroidTooling.
Update the test to use XABuildConfig.AndroidLatestStableApiLevel for minSdkVersion instead of XABuildConfig.AndroidDefaultTargetDotnetApiLevel with a ".0" suffix. This aligns the manifest test with the latest stable Android API level and removes the redundant ".0" formatting.
TargetSdkVersionName now returns TargetSdkVersion directly instead of
calling GetIdFromApiLevel, so it must not be null when Merge() creates
the uses-sdk element.
Same issue as TargetSdkVersionName: MinSdkVersion is already resolved to
an integer API level string by GenerateMainAndroidManifest. Round-tripping
through GetIdFromApiLevel() returns '36.1' for input '36' when both 36.0
and 36.1 share ApiLevel=36, which then fails int.TryParse and falls back
to AndroidMinimumDotNetApiLevel (21).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

copilot `copilot-cli` or other AIs were used to author this

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant