Skip to content

Commit 7696554

Browse files
[Xamarin.Android.Build.Tasks] require JDK 11 for API 31
API 31 builds fail when using JDK 1.8 with: /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1728,3): error JAVAC0000: java.lang.AssertionError: annotationType() : unrecognized Attribute name MODULE (class com.sun.tools.javac.util.SharedNameTable$NameImpl) To solve this issue, we must require JDK 11 for API 31. There are two code paths here for "legacy" Xamarin.Android and .NET 6. Legacy is straightforward, as we already had a pattern for this. In .NET 6, I checked the `$(TargetPlatformVersion)` property for now and require JDK 11 in that case. When API 31 is stable, we can probably remove this code and just set this value by default: <MinimumSupportedJavaVersion Condition=" '$(MinimumSupportedJavaVersion)' == '' ">11.0</MinimumSupportedJavaVersion> I updated some tests in this area as well.
1 parent b529d52 commit 7696554

File tree

4 files changed

+30
-13
lines changed

4 files changed

+30
-13
lines changed

src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.Tooling.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ called for "legacy" projects in Xamarin.Android.Legacy.targets.
2323
JavaSdkPath="$(_JavaSdkDirectory)"
2424
JavaToolExe="$(JavaToolExe)"
2525
JavacToolExe="$(JavacToolExe)"
26+
TargetPlatformVersion="$(TargetPlatformVersion)"
2627
LatestSupportedJavaVersion="$(LatestSupportedJavaVersion)"
2728
MinimumSupportedJavaVersion="$(MinimumSupportedJavaVersion)">
2829
<Output TaskParameter="JdkVersion" PropertyName="_JdkVersion" />

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,8 @@ protected override bool ValidateJava (string javaExe, Regex versionRegex)
5050
Version GetJavaVersionForFramework ()
5151
{
5252
var apiLevel = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (TargetFrameworkVersion);
53-
if (apiLevel >= 30) {
54-
// At present, it *looks like* API-R works with Build-tools r29, but
55-
// historically API-X requires Build-tools rX, so if/when API-30
56-
// requires Build-tools r30, it will require JDK11.
57-
// return new Version (11, 0);
58-
return new Version (1, 8);
59-
}
53+
if (apiLevel >= 31)
54+
return new Version (11, 0);
6055
if (apiLevel >= 24)
6156
return new Version (1, 8);
6257
else if (apiLevel == 23)

src/Xamarin.Android.Build.Tasks/Tasks/ValidateJavaVersion.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public class ValidateJavaVersion : AndroidTask
2121

2222
public string JavacToolExe { get; set; }
2323

24+
public string TargetPlatformVersion { get; set; }
25+
2426
[Required]
2527
public string LatestSupportedJavaVersion { get; set; }
2628

@@ -67,6 +69,11 @@ bool ValidateJava ()
6769
protected virtual bool ValidateJava (string javaExe, Regex versionRegex)
6870
{
6971
var required = Version.Parse (MinimumSupportedJavaVersion);
72+
// NOTE: when API 31 is stable and the default, we should
73+
// remove this check and rely solely on $(MinimumSupportedJavaVersion).
74+
if (Version.TryParse (TargetPlatformVersion, out var targetPlatformVersion) && targetPlatformVersion.Major >= 31) {
75+
required = new Version (11, 0);
76+
}
7077
MinimumRequiredJdkVersion = required.ToString ();
7178

7279
try {

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

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ public class ResolveSdksTaskTests : BaseTest {
2121
new ApiInfo () { Id = "25", Level = 25, Name = "Nougat", FrameworkVersion = "v7.1", Stable = true },
2222
new ApiInfo () { Id = "26", Level = 26, Name = "Oreo", FrameworkVersion = "v8.0", Stable = true },
2323
new ApiInfo () { Id = "27", Level = 27, Name = "Oreo", FrameworkVersion = "v8.1", Stable = true },
24-
new ApiInfo () { Id = "P", Level = 28, Name = "P", FrameworkVersion = "v8.99", Stable = false },
24+
new ApiInfo () { Id = "28", Level = 28, Name = "Pie", FrameworkVersion = "v9.0", Stable = false },
25+
new ApiInfo () { Id = "29", Level = 29, Name = "Android10", FrameworkVersion = "v10.0", Stable = false },
26+
new ApiInfo () { Id = "30", Level = 30, Name = "Android11", FrameworkVersion = "v11.0", Stable = false },
27+
new ApiInfo () { Id = "S", Level = 31, Name = "S", FrameworkVersion = "v11.0.99", Stable = false },
2528
new ApiInfo () { Id = "Z", Level = 127, Name = "Z", FrameworkVersion = "v108.1.99", Stable = false },
2629
};
2730

@@ -35,9 +38,9 @@ public class ResolveSdksTaskTests : BaseTest {
3538
/* jdk */ "1.8.0",
3639
/* apis*/ apiInfoSelection,
3740
/* useLatestAndroidSdk */ true,
38-
/* targetFrameworkVersion */ "v8.99",
41+
/* targetFrameworkVersion */ "v9.0",
3942
/* expectedTaskResult */ true,
40-
/* expectedTargetFramework */ "v8.99",
43+
/* expectedTargetFramework */ "v9.0",
4144
/* expectedError */ "",
4245
/* expectedErrorMessage */ "",
4346
},
@@ -101,9 +104,9 @@ public class ResolveSdksTaskTests : BaseTest {
101104
/* jdk */ "1.8.0",
102105
/* apis*/ apiInfoSelection,
103106
/* useLatestAndroidSdk */ false,
104-
/* targetFrameworkVersion */ "v8.99",
107+
/* targetFrameworkVersion */ "v9.0",
105108
/* expectedTaskResult */ true,
106-
/* expectedTargetFramework */ "v8.99",
109+
/* expectedTargetFramework */ "v9.0",
107110
/* expectedError */ "",
108111
/* expectedErrorMessage */ "",
109112
},
@@ -151,6 +154,17 @@ public class ResolveSdksTaskTests : BaseTest {
151154
/* expectedError */ "XA0001",
152155
/* expectedErrorMessage */ "Unsupported or invalid $(TargetFrameworkVersion) value of 'v6.0'. Please update your Project Options.",
153156
},
157+
new object[] {
158+
/* buildtools */ "30.0.0",
159+
/* jdk */ "11.0",
160+
/* apis*/ apiInfoSelection,
161+
/* useLatestAndroidSdk */ false,
162+
/* targetFrameworkVersion */ "v11.0.99",
163+
/* expectedTaskResult */ true,
164+
/* expectedTargetFramework */ "v11.0.99",
165+
/* expectedError */ "",
166+
/* expectedErrorMessage */ "",
167+
},
154168
};
155169
#pragma warning restore 414
156170
[Test]
@@ -184,7 +198,7 @@ public void UseLatestAndroidSdk (string buildtools, string jdk, ApiInfo[] apis,
184198
JavaSdkPath = javaPath,
185199
JavaToolExe = javaExe,
186200
JavacToolExe = javacExe,
187-
LatestSupportedJavaVersion = "1.8.0",
201+
LatestSupportedJavaVersion = LatestSupportedJavaVersion,
188202
MinimumSupportedJavaVersion = "1.7.0",
189203
};
190204
var androidTooling = new ResolveAndroidTooling {

0 commit comments

Comments
 (0)