Skip to content

Commit 2609c38

Browse files
authored
[Xamarin.Android.Tools.AndroidSdk] Prefer major versions (#262)
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
1 parent 31609ca commit 2609c38

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

src/Xamarin.Android.Tools.AndroidSdk/AndroidVersions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ void LoadVersions (IEnumerable<AndroidVersion> versions)
7575
MinStableVersion = version;
7676
}
7777
}
78+
installedVersions.Sort ((x, y) => {
79+
return x.VersionCodeFull.CompareTo (y.VersionCodeFull);
80+
});
7881
}
7982

8083
public int? GetApiLevelFromFrameworkVersion (string frameworkVersion)

tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidVersionsTests.cs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,10 @@ static AndroidVersions CreateTestVersions ()
140140
// Hides/shadows a Known Version
141141
new AndroidVersion (apiLevel: 14, osVersion: "4.0", id: "II", stable: false),
142142
// Demonstrates new "minor" release support
143+
new AndroidVersion (versionCodeFull: new Version (36, 1), osVersion: "16.1", id: "CANARY", stable: true),
143144
new AndroidVersion (versionCodeFull: new Version (36, 0), osVersion: "16.0", id: "Baklava", stable: true),
144-
new AndroidVersion (versionCodeFull: new Version (36, 1), osVersion: "16.1", id: "CANARY", stable: false),
145+
new AndroidVersion (versionCodeFull: new Version (37, 1), osVersion: "17.1", id: "E", stable: false),
146+
new AndroidVersion (versionCodeFull: new Version (37, 0), osVersion: "17.0", id: "D", stable: true),
145147
});
146148
}
147149

@@ -161,7 +163,10 @@ public void GetApiLevelFromFrameworkVersion ()
161163
Assert.AreEqual (null, versions.GetApiLevelFromFrameworkVersion ("1.3"));
162164
Assert.AreEqual (14, versions.GetApiLevelFromFrameworkVersion ("v4.0"));
163165
Assert.AreEqual (14, versions.GetApiLevelFromFrameworkVersion ("4.0"));
166+
Assert.AreEqual (36, versions.GetApiLevelFromFrameworkVersion ("16.0"));
164167
Assert.AreEqual (36, versions.GetApiLevelFromFrameworkVersion ("16.1"));
168+
Assert.AreEqual (37, versions.GetApiLevelFromFrameworkVersion ("17.0"));
169+
Assert.AreEqual (37, versions.GetApiLevelFromFrameworkVersion ("17.1"));
165170

166171
// via KnownVersions
167172
Assert.AreEqual (4, versions.GetApiLevelFromFrameworkVersion ("v1.6"));
@@ -183,9 +188,13 @@ public void GetApiLevelFromId ()
183188
Assert.AreEqual (14, versions.GetApiLevelFromId ("14"));
184189
Assert.AreEqual (14, versions.GetApiLevelFromId ("II"));
185190
Assert.AreEqual (36, versions.GetApiLevelFromId ("36"));
191+
Assert.AreEqual (36, versions.GetApiLevelFromId ("36.1"));
186192
Assert.AreEqual (36, versions.GetApiLevelFromId ("CANARY"));
193+
Assert.AreEqual (37, versions.GetApiLevelFromId ("37"));
194+
Assert.AreEqual (37, versions.GetApiLevelFromId ("37.1"));
195+
Assert.AreEqual (37, versions.GetApiLevelFromId ("D"));
187196

188-
Assert.AreEqual (null, versions.GetApiLevelFromId ("D"));
197+
Assert.AreEqual (null, versions.GetApiLevelFromId ("Z"));
189198

190199
// via KnownVersions
191200
Assert.AreEqual (11, versions.GetApiLevelFromId ("H"));
@@ -216,9 +225,17 @@ public void GetIdFromApiLevel ()
216225
Assert.AreEqual ("CANARY", versions.GetIdFromApiLevel ("36.1"));
217226
Assert.AreEqual ("CANARY", versions.GetIdFromApiLevel ("CANARY"));
218227

228+
Assert.AreEqual ("D", versions.GetIdFromApiLevel (37));
229+
Assert.AreEqual ("D", versions.GetIdFromApiLevel ("37"));
230+
Assert.AreEqual ("D", versions.GetIdFromApiLevel ("37.0"));
231+
Assert.AreEqual ("D", versions.GetIdFromApiLevel ("D"));
232+
Assert.AreEqual ("E", versions.GetIdFromApiLevel ("37.1"));
233+
Assert.AreEqual ("E", versions.GetIdFromApiLevel ("E"));
234+
235+
// "GIGO"
219236
Assert.AreEqual ("-1", versions.GetIdFromApiLevel (-1));
220237
Assert.AreEqual ("-1", versions.GetIdFromApiLevel ("-1"));
221-
Assert.AreEqual ("D", versions.GetIdFromApiLevel ("D"));
238+
Assert.AreEqual ("Z", versions.GetIdFromApiLevel ("Z"));
222239

223240
// via KnownVersions
224241
Assert.AreEqual ("11", versions.GetIdFromApiLevel (11));
@@ -240,8 +257,12 @@ public void GetIdFromFrameworkVersion ()
240257
Assert.AreEqual ("C", versions.GetIdFromFrameworkVersion ("1.2"));
241258
Assert.AreEqual ("II", versions.GetIdFromFrameworkVersion ("v4.0"));
242259
Assert.AreEqual ("II", versions.GetIdFromFrameworkVersion ("4.0"));
260+
Assert.AreEqual ("Baklava", versions.GetIdFromFrameworkVersion ("16.0"));
243261
Assert.AreEqual ("CANARY", versions.GetIdFromFrameworkVersion ("16.1"));
262+
Assert.AreEqual ("D", versions.GetIdFromFrameworkVersion ("17.0"));
263+
Assert.AreEqual ("E", versions.GetIdFromFrameworkVersion ("17.1"));
244264

265+
// Unknown values
245266
Assert.AreEqual (null, versions.GetIdFromFrameworkVersion ("v0.99"));
246267
Assert.AreEqual (null, versions.GetIdFromFrameworkVersion ("0.99"));
247268

@@ -261,6 +282,7 @@ public void GetFrameworkVersionFromApiLevel ()
261282
Assert.AreEqual ("v1.2", versions.GetFrameworkVersionFromApiLevel (3));
262283
Assert.AreEqual ("v4.0", versions.GetFrameworkVersionFromApiLevel (14));
263284
Assert.AreEqual ("v16.0", versions.GetFrameworkVersionFromApiLevel (36));
285+
Assert.AreEqual ("v17.0", versions.GetFrameworkVersionFromApiLevel (37));
264286

265287
// via KnownVersions
266288
Assert.AreEqual ("v2.3", versions.GetFrameworkVersionFromApiLevel (10));
@@ -284,6 +306,10 @@ public void GetFrameworkVersionFromId ()
284306
Assert.AreEqual ("v16.0", versions.GetFrameworkVersionFromId ("Baklava"));
285307
Assert.AreEqual ("v16.1", versions.GetFrameworkVersionFromId ("36.1"));
286308
Assert.AreEqual ("v16.1", versions.GetFrameworkVersionFromId ("CANARY"));
309+
Assert.AreEqual ("v17.0", versions.GetFrameworkVersionFromId ("37"));
310+
Assert.AreEqual ("v17.0", versions.GetFrameworkVersionFromId ("D"));
311+
Assert.AreEqual ("v17.1", versions.GetFrameworkVersionFromId ("37.1"));
312+
Assert.AreEqual ("v17.1", versions.GetFrameworkVersionFromId ("E"));
287313

288314
// via KnownVersions
289315
Assert.AreEqual ("v3.0", versions.GetFrameworkVersionFromId ("11"));

0 commit comments

Comments
 (0)