Skip to content

Commit 265a63b

Browse files
[xabt] Remove UseLatestAndroidPlatformSdk (#10839)
Removes the legacy `UseLatestAndroidPlatformSdk` concept from .NET Android. This property was a Xamarin.Android-era feature with no use in the .NET Android SDK — treating it as always `false` and inlining accordingly. ### `ResolveAndroidTooling.cs` (Legacy task) - Removed `UseLatestAndroidPlatformSdk` property - Removed the "use latest installed SDK" branch from `ValidateApiLevels()` along with its priority-order comment - Removed `GetMaxInstalledApiLevel()` helper (only used by the removed branch) - `ValidateApiLevels()` now only resolves via `$(TargetFrameworkVersion)` or `$(AndroidApiLevel)`; logs `XA0000` if neither is set ### `ResolveSdksTaskTests.cs` - Removed `TargetFrameworkPairing` test and data (relied entirely on `UseLatestAndroidPlatformSdk = true`) - Removed the 6 parameterized cases that set `UseLatestAndroidPlatformSdk = true` and the implicit-fallback case where neither TFV nor API level was provided - Renamed remaining test data/method: `UseLatestAndroidSdkTestCases` → `ResolveAndroidToolingTestCases`, `UseLatestAndroidSdk` → `ResolveAndroidToolingTest` - Removed `UseLatestAndroidPlatformSdk = false` from `ResolveSdkTiming` Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
1 parent b13f7b4 commit 265a63b

File tree

2 files changed

+4
-306
lines changed

2 files changed

+4
-306
lines changed

src/Xamarin.Android.Build.Tasks/Tasks/Legacy/ResolveAndroidTooling.cs

Lines changed: 0 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ namespace Xamarin.Android.Tasks.Legacy
1717
/// </summary>
1818
public class ResolveAndroidTooling : Xamarin.Android.Tasks.ResolveAndroidTooling
1919
{
20-
public bool UseLatestAndroidPlatformSdk { get; set; }
21-
2220
[Output]
2321
public string? TargetFrameworkVersion { get; set; }
2422

@@ -65,63 +63,6 @@ protected override void LogOutputs ()
6563

6664
bool ValidateApiLevels ()
6765
{
68-
// Priority:
69-
// $(UseLatestAndroidPlatformSdk) > $(AndroidApiLevel) > $(TargetFrameworkVersion)
70-
//
71-
// If $(TargetFrameworkVersion) isn't set, and $(AndroidApiLevel) isn't
72-
// set, act as if $(UseLatestAndroidPlatformSdk) is True
73-
//
74-
// If $(UseLatestAndroidPlatformSdk) is true, we do as it says: use the
75-
// latest installed version.
76-
//
77-
// Otherwise, if $(AndroidApiLevel) is set, use it and set $(TargetFrameworkVersion).
78-
// Rationale: monodroid/samples/xbuild.make uses $(AndroidApiLevel)
79-
// to build for a specific API level.
80-
// Otherwise, if $(TargetFrameworkVersion) is set, use it and set $(AndroidApiLevel).
81-
82-
UseLatestAndroidPlatformSdk = UseLatestAndroidPlatformSdk ||
83-
(AndroidApiLevel.IsNullOrWhiteSpace () && TargetFrameworkVersion.IsNullOrWhiteSpace ());
84-
85-
if (UseLatestAndroidPlatformSdk) {
86-
int maxInstalled = GetMaxInstalledApiLevel ();
87-
int maxSupported = GetMaxStableApiLevel ();
88-
AndroidApiLevel = maxInstalled.ToString ();
89-
if (maxInstalled > maxSupported) {
90-
Log.LogDebugMessage ($"API Level {maxInstalled} is greater than the maximum supported API level of {maxSupported}. " +
91-
"Support for this API will be added in a future release.");
92-
}
93-
if (!TargetFrameworkVersion.IsNullOrWhiteSpace ()) {
94-
var userSelected = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (TargetFrameworkVersion);
95-
// overwrite using user version only if it is
96-
// above the maxStableApi and a valid apiLevel.
97-
if (userSelected != null && userSelected > maxSupported && userSelected <= maxInstalled) {
98-
maxInstalled =
99-
maxSupported = userSelected.Value;
100-
AndroidApiLevel = userSelected.ToString ();
101-
}
102-
}
103-
104-
var minStableVersion = MonoAndroidHelper.SupportedVersions.MinStableVersion;
105-
if (minStableVersion == null)
106-
return false;
107-
108-
for (int apiLevel = maxSupported; apiLevel >= minStableVersion.ApiLevel; apiLevel--) {
109-
var id = MonoAndroidHelper.SupportedVersions.GetIdFromApiLevel (apiLevel);
110-
if (id == null)
111-
continue;
112-
var apiPlatformDir = MonoAndroidHelper.AndroidSdk.TryGetPlatformDirectoryFromApiLevel (id, MonoAndroidHelper.SupportedVersions);
113-
if (apiPlatformDir != null && Directory.Exists (apiPlatformDir)) {
114-
var targetFramework = MonoAndroidHelper.SupportedVersions.GetFrameworkVersionFromId (id);
115-
if (targetFramework != null && MonoAndroidHelper.SupportedVersions.InstalledBindingVersions.Any (b => b.FrameworkVersion == targetFramework)) {
116-
AndroidApiLevel = apiLevel.ToString ();
117-
TargetFrameworkVersion = targetFramework;
118-
break;
119-
}
120-
}
121-
}
122-
return TargetFrameworkVersion != null;
123-
}
124-
12566
if (!TargetFrameworkVersion.IsNullOrWhiteSpace ()) {
12667
TargetFrameworkVersion = TargetFrameworkVersion.Trim ();
12768
string? id = MonoAndroidHelper.SupportedVersions.GetIdFromFrameworkVersion (TargetFrameworkVersion);
@@ -144,32 +85,6 @@ bool ValidateApiLevels ()
14485
}
14586

14687

147-
int GetMaxInstalledApiLevel ()
148-
{
149-
int maxApiLevel = int.MinValue;
150-
string platformsDir = Path.Combine (AndroidSdkPath, "platforms");
151-
if (Directory.Exists (platformsDir)) {
152-
var apiIds = Directory.EnumerateDirectories (platformsDir)
153-
.Select (platformDir => Path.GetFileName (platformDir))
154-
.Where (dir => dir.StartsWith ("android-", StringComparison.OrdinalIgnoreCase))
155-
.Select (dir => dir.Substring ("android-".Length))
156-
.Select (apiName => MonoAndroidHelper.SupportedVersions.GetIdFromApiLevel (apiName))
157-
.Where (id => id != null);
158-
foreach (var id in apiIds) {
159-
if (id == null)
160-
continue;
161-
int? v = MonoAndroidHelper.SupportedVersions.GetApiLevelFromId (id);
162-
if (!v.HasValue)
163-
continue;
164-
maxApiLevel = Math.Max (maxApiLevel, v.Value);
165-
}
166-
}
167-
if (maxApiLevel < 0)
168-
Log.LogCodedError ("XA5300", Properties.Resources.XA5300_Android_Platforms,
169-
platformsDir, AndroidSdkPath, Path.DirectorySeparatorChar, Android);
170-
return maxApiLevel;
171-
}
172-
17388
string? GetTargetFrameworkVersionFromApiLevel ()
17489
{
17590
if (AndroidApiLevel == null)

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ResolveSdksTaskTests.cs

Lines changed: 4 additions & 221 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,11 @@ public class ResolveSdksTaskTests : BaseTest {
3131
const string MinimumSupportedJavaVersion = "1.6.0";
3232
const string LatestSupportedJavaVersion = "11.0.99";
3333

34-
static object [] UseLatestAndroidSdkTestCases = new object [] {
34+
static object [] ResolveAndroidToolingTestCases = new object [] {
3535
new object[] {
3636
/* buildtools */ "26.0.3",
3737
/* jdk */ "1.8.0",
3838
/* apis*/ apiInfoSelection,
39-
/* useLatestAndroidSdk */ true,
4039
/* targetFrameworkVersion */ "v9.0",
4140
/* expectedTaskResult */ true,
4241
/* expectedTargetFramework */ "v9.0",
@@ -47,73 +46,6 @@ public class ResolveSdksTaskTests : BaseTest {
4746
/* buildtools */ "26.0.3",
4847
/* jdk */ "1.8.0",
4948
/* apis*/ apiInfoSelection,
50-
/* useLatestAndroidSdk */ true,
51-
/* targetFrameworkVersion */ "v8.0",
52-
/* expectedTaskResult */ true,
53-
/* expectedTargetFramework */ "v8.1",
54-
/* expectedError */ "",
55-
/* expectedErrorMessage */ "",
56-
},
57-
new object[] {
58-
/* buildtools */ "26.0.3",
59-
/* jdk */ "1.8.0",
60-
/* apis*/ apiInfoSelection,
61-
/* useLatestAndroidSdk */ true,
62-
/* targetFrameworkVersion */ "v8.1",
63-
/* expectedTaskResult */ true,
64-
/* expectedTargetFramework */ "v8.1",
65-
/* expectedError */ "",
66-
/* expectedErrorMessage */ "",
67-
},
68-
new object[] {
69-
/* buildtools */ "26.0.3",
70-
/* jdk */ "1.8.0",
71-
/* apis*/ apiInfoSelection,
72-
/* useLatestAndroidSdk */ true,
73-
/* targetFrameworkVersion */ "v6.0",
74-
/* expectedTaskResult */ true,
75-
/* expectedTargetFramework */ "v8.1",
76-
/* expectedError */ "",
77-
/* expectedErrorMessage */ "",
78-
},
79-
new object[] {
80-
/* buildtools */ "26.0.3",
81-
/* jdk */ "1.8.0",
82-
/* apis*/ apiInfoSelection,
83-
/* useLatestAndroidSdk */ true,
84-
/* targetFrameworkVersion */ null,
85-
/* expectedTaskResult */ true,
86-
/* expectedTargetFramework */ "v8.1",
87-
/* expectedError */ "",
88-
/* expectedErrorMessage */ "",
89-
},
90-
new object[] {
91-
/* buildtools */ "26.0.3",
92-
/* jdk */ "1.8.0",
93-
/* apis*/ apiInfoSelection,
94-
/* useLatestAndroidSdk */ true,
95-
/* targetFrameworkVersion */ "v7.1",
96-
/* expectedTaskResult */ true,
97-
/* expectedTargetFramework */ "v8.1",
98-
/* expectedError */ "",
99-
/* expectedErrorMessage */ "",
100-
},
101-
new object[] {
102-
/* buildtools */ "26.0.3",
103-
/* jdk */ "1.8.0",
104-
/* apis*/ apiInfoSelection,
105-
/* useLatestAndroidSdk */ false,
106-
/* targetFrameworkVersion */ "v9.0",
107-
/* expectedTaskResult */ true,
108-
/* expectedTargetFramework */ "v9.0",
109-
/* expectedError */ "",
110-
/* expectedErrorMessage */ "",
111-
},
112-
new object[] {
113-
/* buildtools */ "26.0.3",
114-
/* jdk */ "1.8.0",
115-
/* apis*/ apiInfoSelection,
116-
/* useLatestAndroidSdk */ false,
11749
/* targetFrameworkVersion */ "v8.1",
11850
/* expectedTaskResult */ true,
11951
/* expectedTargetFramework */ "v8.1",
@@ -124,7 +56,6 @@ public class ResolveSdksTaskTests : BaseTest {
12456
/* buildtools */ "26.0.3",
12557
/* jdk */ "1.8.0",
12658
/* apis*/ apiInfoSelection,
127-
/* useLatestAndroidSdk */ false,
12859
/* targetFrameworkVersion */ "v8.0",
12960
/* expectedTaskResult */ true,
13061
/* expectedTargetFramework */ "v8.0",
@@ -135,18 +66,6 @@ public class ResolveSdksTaskTests : BaseTest {
13566
/* buildtools */ "26.0.3",
13667
/* jdk */ "1.8.0",
13768
/* apis*/ apiInfoSelection,
138-
/* useLatestAndroidSdk */ false,
139-
/* targetFrameworkVersion */ null,
140-
/* expectedTaskResult */ true,
141-
/* expectedTargetFramework */ "v8.1",
142-
/* expectedError */ "",
143-
/* expectedErrorMessage */ "",
144-
},
145-
new object[] {
146-
/* buildtools */ "26.0.3",
147-
/* jdk */ "1.8.0",
148-
/* apis*/ apiInfoSelection,
149-
/* useLatestAndroidSdk */ false,
15069
/* targetFrameworkVersion */ "v6.0",
15170
/* expectedTaskResult */ false,
15271
/* expectedTargetFramework */ "v6.0",
@@ -157,7 +76,6 @@ public class ResolveSdksTaskTests : BaseTest {
15776
/* buildtools */ "30.0.0",
15877
/* jdk */ "11.0",
15978
/* apis*/ apiInfoSelection,
160-
/* useLatestAndroidSdk */ false,
16179
/* targetFrameworkVersion */ "v11.0.99",
16280
/* expectedTaskResult */ true,
16381
/* expectedTargetFramework */ "v11.0.99",
@@ -167,10 +85,10 @@ public class ResolveSdksTaskTests : BaseTest {
16785
};
16886
#pragma warning restore 414
16987
[Test]
170-
[TestCaseSource(nameof(UseLatestAndroidSdkTestCases))]
171-
public void UseLatestAndroidSdk (string buildtools, string jdk, ApiInfo[] apis, bool useLatestAndroidSdk, string targetFrameworkVersion, bool expectedTaskResult, string expectedTargetFramework, string expectedError = "", string expectedErrorMessage = "")
88+
[TestCaseSource(nameof(ResolveAndroidToolingTestCases))]
89+
public void ResolveAndroidToolingTest (string buildtools, string jdk, ApiInfo[] apis, string targetFrameworkVersion, bool expectedTaskResult, string expectedTargetFramework, string expectedError = "", string expectedErrorMessage = "")
17290
{
173-
var path = Path.Combine ("temp", "UseLatestAndroidSdk_" + Guid.NewGuid ());
91+
var path = Path.Combine ("temp", "ResolveAndroidToolingTest_" + Guid.NewGuid ());
17492
var androidSdkPath = CreateFauxAndroidSdkDirectory (Path.Combine (path, "android-sdk"), buildtools, apis);
17593
var androidNdkPath = CreateFauxAndroidNdkDirectory (Path.Combine (path, "android-ndk"));
17694
string javaExe = string.Empty;
@@ -205,7 +123,6 @@ public void UseLatestAndroidSdk (string buildtools, string jdk, ApiInfo[] apis,
205123
AndroidSdkPath = androidSdkPath,
206124
TargetFrameworkVersion = targetFrameworkVersion,
207125
AndroidSdkBuildToolsVersion = buildtools,
208-
UseLatestAndroidPlatformSdk = useLatestAndroidSdk,
209126
AotAssemblies = false,
210127
SequencePointsMode = "None",
211128
AndroidApplication = true,
@@ -260,7 +177,6 @@ public void ResolveSdkTiming ()
260177
AndroidSdkPath = androidSdkPath,
261178
TargetFrameworkVersion = "v8.0",
262179
AndroidSdkBuildToolsVersion = "26.0.3",
263-
UseLatestAndroidPlatformSdk = false,
264180
AotAssemblies = false,
265181
SequencePointsMode = "None",
266182
AndroidApplication = true,
@@ -303,138 +219,5 @@ public void ResolveSdkTiming ()
303219
Directory.Delete (Path.Combine (Root, path), recursive: true);
304220
}
305221

306-
static object [] TargetFrameworkPairingParameters = new [] {
307-
//We support 28, but only 27 is installed
308-
new object [] {
309-
"Older API Installed", //description
310-
// androidSdks
311-
new [] {
312-
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
313-
},
314-
// targetFrameworks
315-
new ApiInfo [] {
316-
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
317-
new ApiInfo () { Id = "28", Level = 28, Name = "P", FrameworkVersion = "v9.0", Stable = true },
318-
},
319-
null, //userSelected
320-
"27", //androidApiLevel
321-
"27", //androidApiLevelName
322-
"v8.1", //targetFrameworkVersion
323-
},
324-
//28 is installed but we only support 27
325-
new object [] {
326-
"Newer API Installed", //description
327-
// androidSdks
328-
new [] {
329-
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
330-
new ApiInfo () { Id = "28", Level = 28, Name = "P", FrameworkVersion = "v9.0", Stable = true },
331-
},
332-
// targetFrameworks
333-
new ApiInfo [] {
334-
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
335-
},
336-
null, //userSelected
337-
"27", //androidApiLevel
338-
"27", //androidApiLevelName
339-
"v8.1", //targetFrameworkVersion
340-
},
341-
//A paired downgrade to API 26
342-
new object [] {
343-
"Paired Downgrade", //description
344-
// androidSdks
345-
new [] {
346-
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
347-
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
348-
},
349-
// targetFrameworks
350-
new ApiInfo [] {
351-
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
352-
new ApiInfo () { Id = "28", Level = 28, Name = "P", FrameworkVersion = "v9.0", Stable = true },
353-
},
354-
null, //userSelected
355-
"26", //androidApiLevel
356-
"26", //androidApiLevelName
357-
"v8.0", //targetFrameworkVersion
358-
},
359-
//A new API level 28 is not stable yet
360-
new object [] {
361-
"New Unstable API", //description
362-
// androidSdks
363-
new [] {
364-
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
365-
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
366-
new ApiInfo () { Id = "28", Level = 28, Name = "P", FrameworkVersion = "v9.0", Stable = false },
367-
},
368-
// targetFrameworks
369-
new ApiInfo [] {
370-
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
371-
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
372-
new ApiInfo () { Id = "28", Level = 28, Name = "P", FrameworkVersion = "v9.0", Stable = false },
373-
},
374-
null, //userSelected
375-
"27", //androidApiLevel
376-
"27", //androidApiLevelName
377-
"v8.1", //targetFrameworkVersion
378-
},
379-
//User selected a new API level 28 is not stable yet
380-
new object [] {
381-
"User Selected Unstable API", //description
382-
// androidSdks
383-
new [] {
384-
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
385-
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
386-
new ApiInfo () { Id = "28", Level = 28, Name = "P", FrameworkVersion = "v9.0", Stable = false },
387-
},
388-
// targetFrameworks
389-
new ApiInfo [] {
390-
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
391-
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
392-
new ApiInfo () { Id = "28", Level = 28, Name = "P", FrameworkVersion = "v9.0", Stable = false },
393-
},
394-
"v9.0", //userSelected
395-
"28", //androidApiLevel
396-
"28", //androidApiLevelName
397-
"v9.0", //targetFrameworkVersion
398-
},
399-
};
400-
401-
[Test]
402-
[TestCaseSource (nameof (TargetFrameworkPairingParameters))]
403-
public void TargetFrameworkPairing (string description, ApiInfo[] androidSdk, ApiInfo[] targetFrameworks, string userSelected, string androidApiLevel, string androidApiLevelName, string targetFrameworkVersion)
404-
{
405-
var path = Path.Combine ("temp", $"{nameof (TargetFrameworkPairing)}_{description}");
406-
var androidSdkPath = CreateFauxAndroidSdkDirectory (Path.Combine (path, "android-sdk"), "26.0.3", androidSdk);
407-
var androidNdkPath = CreateFauxAndroidNdkDirectory (Path.Combine (path, "android-ndk"));
408-
string javaExe = string.Empty;
409-
string javacExe;
410-
var javaPath = CreateFauxJavaSdkDirectory (Path.Combine (path, "jdk"), "1.8.0", out javaExe, out javacExe);
411-
var referencePath = CreateFauxReferencesDirectory (Path.Combine (path, "references"), targetFrameworks);
412-
IBuildEngine engine = new MockBuildEngine (TestContext.Out);
413-
var resolveSdks = new ResolveSdks {
414-
BuildEngine = engine,
415-
AndroidSdkPath = androidSdkPath,
416-
AndroidNdkPath = androidNdkPath,
417-
JavaSdkPath = javaPath,
418-
MinimumSupportedJavaVersion = MinimumSupportedJavaVersion,
419-
LatestSupportedJavaVersion = LatestSupportedJavaVersion,
420-
ReferenceAssemblyPaths = new [] {
421-
Path.Combine (referencePath, "MonoAndroid"),
422-
},
423-
};
424-
var androidTooling = new ResolveAndroidTooling {
425-
BuildEngine = engine,
426-
AndroidSdkPath = androidSdkPath,
427-
UseLatestAndroidPlatformSdk = true,
428-
TargetFrameworkVersion = userSelected,
429-
AndroidApplication = true,
430-
};
431-
Assert.IsTrue (resolveSdks.Execute (), "ResolveSdks should succeed!");
432-
Assert.IsTrue (androidTooling.Execute (), "ResolveAndroidTooling should succeed!");
433-
Assert.AreEqual (androidApiLevel, androidTooling.AndroidApiLevel, $"AndroidApiLevel should be {androidApiLevel}");
434-
Assert.AreEqual (androidApiLevelName, androidTooling.AndroidApiLevelName, $"AndroidApiLevelName should be {androidApiLevelName}");
435-
Assert.AreEqual (targetFrameworkVersion, androidTooling.TargetFrameworkVersion, $"TargetFrameworkVersion should be {targetFrameworkVersion}");
436-
Directory.Delete (Path.Combine (Root, path), recursive: true);
437-
}
438-
439222
}
440223
}

0 commit comments

Comments
 (0)