Skip to content

Conversation

@jonpryor
Copy link
Contributor

@jonpryor jonpryor commented Sep 8, 2025

Context: dotnet/android#10438

On dotnet/android#10438, many unit tests are failing due to the following warning:

Xamarin.Android.Tooling.targets(88,5): warning XA4211: AndroidManifest.xml //uses-sdk/@android:targetSdkVersion 'CANARY' is less than $(TargetPlatformVersion) '36.0'. Using API-CANARY for ACW compilation.

Looking at the diagnostic .binlog, we also see:

Target "_ResolveSdks: …" in file "…\Xamarin.Android.Tooling.targets" from project "…\CodeBehindBuildTests.NET.csproj" (target "_ResolveMonoAndroidSdks" depends on it):
…
Added Item(s):
    _AndroidApiInfo=
        C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.0.0-ci.pr.gh10438.318\tools\..\data\net10.0-android36.1\AndroidApiInfo.xml
        C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.0.0-ci.pr.gh10438.318\tools\..\data\net10.0-android36\AndroidApiInfo.xml
…
Task "ResolveSdks" (TaskId:104)
  Task Parameter:AndroidSdkPath=C:\Android\android-sdk (TaskId:104)
  Task Parameter:MinimumSupportedJavaVersion=17.0 (TaskId:104)
  Task Parameter:JavaSdkPath=C:\hostedtoolcache\windows\Java_Temurin-Hotspot_jdk\17.0.16-8\x64 (TaskId:104)
  Task Parameter:LatestSupportedJavaVersion=21.0.99 (TaskId:104)
  Task Parameter:
      ReferenceAssemblyPaths=
          C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.0.0-ci.pr.gh10438.318\data\net10.0-android36.1\
          C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.0.0-ci.pr.gh10438.318\data\net10.0-android36\ (TaskId:104)
  Task Parameter:CommandLineToolsVersion=19.0 (TaskId:104)

The important thing being that the preview
net10.0-android36.1\AndroidApiInfo.xml is being processed before the stable net10.0-android36\AndroidApiInfo.xml.

This in turn means that when <GetJavaPlatformJar/> calls AndroidVersions.GetIdFromApiLevel("36"), it obtained the AndroidVersion instance for API-CANARY, not API-36!

 Task "GetJavaPlatformJar" (TaskId:135)
   Task Parameter:TargetFramework=net10.0-android (TaskId:135)
   Task Parameter:BuildingInsideVisualStudio=False (TaskId:135)
   Task Parameter:SupportedOSPlatformVersion=21.0 (TaskId:135)
   Task Parameter:AndroidManifest=C:\a\_work\1\a\TestRelease\09-06_00.12.08\temp\CodeBehind\SuccessfulAndroidXApp\Release\project\Properties\AndroidManifest.xml (TaskId:135)
   Task Parameter:DesignTimeBuild=False (TaskId:135)
   Task Parameter:TargetPlatformVersion=36.0 (TaskId:135)
   Task Parameter:AndroidSdkDirectory=C:\Android\android-sdk (TaskId:135)
   Task Parameter:AndroidSdkPlatform=36 (TaskId:135)
1:7>C:\…\Properties\AndroidManifest.xml : warning XA4211: AndroidManifest.xml //uses-sdk/@android:targetSdkVersion 'CANARY' is less than $(TargetPlatformVersion) '36.0'. Using API-CANARY for ACW compilation.
   Output Property: JavaPlatformJarPath=C:\Android\android-sdk\platforms\android-CANARY\android.jar (TaskId:135)
   Output Property: _AndroidTargetSdkVersion=36 (TaskId:135)
 Done executing task "GetJavaPlatformJar". (TaskId:135)

Note input has TargetPlatformVersion=36.0, while output has JavaPlatformJarPath=…\android-CANARY\android.jar.

Update AndroidVersionsTests so that the preview API-36.1 is listed before API-36, as a stable API level (6 months in the future!), and also add stable API-37 and unstable API-37.1, to better represent this scenario.

Fix this by updating AndroidVersions to sort
AndroidVersions.installedVersions by
AndroidVersion.VersionCodeFull. This ensures that new Version(36, 0) precedes new Version(36, 1), and in turn ensures that AndroidVersions.GetIdFromApiLevel("36") returns info for API-36 and not API-CANARY.

Context: dotnet/android#10438

On dotnet/android#10438, many unit tests are failing due to the
following warning:

	Xamarin.Android.Tooling.targets(88,5): warning XA4211: AndroidManifest.xml //uses-sdk/@android:targetSdkVersion 'CANARY' is less than $(TargetPlatformVersion) '36.0'. Using API-CANARY for ACW compilation.

Looking at the diagnostic `.binlog`, we *also* see:

	Target "_ResolveSdks: …" in file "…\Xamarin.Android.Tooling.targets" from project "…\CodeBehindBuildTests.NET.csproj" (target "_ResolveMonoAndroidSdks" depends on it):
	…
	Added Item(s):
	    _AndroidApiInfo=
	        C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.0.0-ci.pr.gh10438.318\tools\..\data\net10.0-android36.1\AndroidApiInfo.xml
	        C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.0.0-ci.pr.gh10438.318\tools\..\data\net10.0-android36\AndroidApiInfo.xml
	…
	Task "ResolveSdks" (TaskId:104)
	  Task Parameter:AndroidSdkPath=C:\Android\android-sdk (TaskId:104)
	  Task Parameter:MinimumSupportedJavaVersion=17.0 (TaskId:104)
	  Task Parameter:JavaSdkPath=C:\hostedtoolcache\windows\Java_Temurin-Hotspot_jdk\17.0.16-8\x64 (TaskId:104)
	  Task Parameter:LatestSupportedJavaVersion=21.0.99 (TaskId:104)
	  Task Parameter:
	      ReferenceAssemblyPaths=
	          C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.0.0-ci.pr.gh10438.318\data\net10.0-android36.1\
	          C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.0.0-ci.pr.gh10438.318\data\net10.0-android36\ (TaskId:104)
	  Task Parameter:CommandLineToolsVersion=19.0 (TaskId:104)

The important thing being that the *preview*
`net10.0-android36.1\AndroidApiInfo.xml` is being processed *before*
the *stable* `net10.0-android36\AndroidApiInfo.xml`.

This in turn means that when [`<GetJavaPlatformJar/>`][0] calls
`AndroidVersions.GetIdFromApiLevel("36")`, it obtained the
`AndroidVersion` instance for API-CANARY, *not* API-36!

	 Task "GetJavaPlatformJar" (TaskId:135)
	   Task Parameter:TargetFramework=net10.0-android (TaskId:135)
	   Task Parameter:BuildingInsideVisualStudio=False (TaskId:135)
	   Task Parameter:SupportedOSPlatformVersion=21.0 (TaskId:135)
	   Task Parameter:AndroidManifest=C:\a\_work\1\a\TestRelease\09-06_00.12.08\temp\CodeBehind\SuccessfulAndroidXApp\Release\project\Properties\AndroidManifest.xml (TaskId:135)
	   Task Parameter:DesignTimeBuild=False (TaskId:135)
	   Task Parameter:TargetPlatformVersion=36.0 (TaskId:135)
	   Task Parameter:AndroidSdkDirectory=C:\Android\android-sdk (TaskId:135)
	   Task Parameter:AndroidSdkPlatform=36 (TaskId:135)
	1:7>C:\…\Properties\AndroidManifest.xml : warning XA4211: AndroidManifest.xml //uses-sdk/@android:targetSdkVersion 'CANARY' is less than $(TargetPlatformVersion) '36.0'. Using API-CANARY for ACW compilation.
	   Output Property: JavaPlatformJarPath=C:\Android\android-sdk\platforms\android-CANARY\android.jar (TaskId:135)
	   Output Property: _AndroidTargetSdkVersion=36 (TaskId:135)
	 Done executing task "GetJavaPlatformJar". (TaskId:135)

Note input has `TargetPlatformVersion=36.0`, while output has
`JavaPlatformJarPath=…\android-CANARY\android.jar`.

Update `AndroidVersionsTests` so that the preview API-36.1 is
listed *before* API-36, as a *stable* API level (6 months in the
future!), and *also* add stable API-37 and unstable API-37.1,
to better represent this scenario.

Fix this by updating `AndroidVersions` to *sort*
`AndroidVersions.installedVersions` by
`AndroidVersion.VersionCodeFull`.  This ensures that
`new Version(36, 0)` precedes `new Version(36, 1)`, and in turn
ensures that `AndroidVersions.GetIdFromApiLevel("36")` returns info
for API-36 and *not* API-CANARY.

[0]: https://github.com/dotnet/android/blob/976544ed415a16b1d44ab06f36f53513361307a5/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs#L120
jonpryor added a commit to jonpryor/xamarin-android that referenced this pull request Sep 8, 2025
Context: dotnet/android-tools#262

Hopefully dotnet/android-tools#262 fixes the XA4211 seen on CI…
@jonathanpeppers jonathanpeppers merged commit 2609c38 into dotnet:main Sep 8, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants