From a584a3356b5916ab92ffca393b402b2dbb15c02f Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Mon, 13 Jan 2025 10:41:33 -0500 Subject: [PATCH] [build] Support JDK-21 (#9672) Context: https://github.com/dotnet/android/pull/9651 PR #9651 demonstrated that it was fairly straightforward to use JDK-21 on CI. We don't want to fully bump to JDK-21, because we still support building with JDK-17, so we *at minimum* need to run tests on both JDK-17 and JDK-21. As a "minimal introductory step", add support for JDK-21: * Update to Gradle 8.12, for harmony with dotnet/java-interop. * Update the `` task to use `javac --release N` when using JDK-17 and later. JDK-11 doesn't support `javac --release`. (Why care about JDK-11? Because .NET 8 still supports it, and this will make future cherry-picking easier.) * Set `$(LatestSupportedJavaVersion)`=21.0.99, which removes the XA0030 error which would result from using JDK-21. --- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../Android/Xamarin.Android.Javac.targets | 2 ++ .../Tasks/Javac.cs | 22 +++++++++++++++++-- .../Xamarin.Android.Common.props.in | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/build-tools/gradle/gradle/wrapper/gradle-wrapper.properties b/build-tools/gradle/gradle/wrapper/gradle-wrapper.properties index fae08049a6f..d6e308a6378 100644 --- a/build-tools/gradle/gradle/wrapper/gradle-wrapper.properties +++ b/build-tools/gradle/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Javac.targets b/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Javac.targets index 4c2a8ed5173..5be2f0eef1c 100644 --- a/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Javac.targets +++ b/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Javac.targets @@ -124,6 +124,7 @@ It is shared between "legacy" binding projects and .NET 7+ projects. Jars="@(_BindingJavaLibrariesToCompile);@(_ReferenceJavaLibs)" JavacTargetVersion="$(JavacTargetVersion)" JavacSourceVersion="$(JavacSourceVersion)" + JdkVersion="$(_JdkVersion)" IntermediateOutputPath="$(IntermediateOutputPath)" AssemblyIdentityMapFile="$(_AndroidLibrayProjectAssemblyMapFile)" /> @@ -171,6 +172,7 @@ It is shared between "legacy" binding projects and .NET 7+ projects. Jars="@(_JavaLibrariesToCompile);@(_InstantRunJavaReference);@(_ReferenceJavaLibs)" JavacTargetVersion="$(JavacTargetVersion)" JavacSourceVersion="$(JavacSourceVersion)" + JdkVersion="$(_JdkVersion)" IntermediateOutputPath="$(IntermediateOutputPath)" AssemblyIdentityMapFile="$(_AndroidLibrayProjectAssemblyMapFile)" /> diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs index b7df052a49f..74cbb16c6e4 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs @@ -27,6 +27,8 @@ public class Javac : JavaCompileToolTask public string JavacTargetVersion { get; set; } public string JavacSourceVersion { get; set; } + public string JdkVersion { get; set; } + public override string DefaultErrorCode => "JAVAC0000"; public override bool RunTask () @@ -61,12 +63,28 @@ protected override string GenerateCommandLineCommands () cmd.AppendSwitchIfNotNull ("-J-Dfile.encoding=", "UTF8"); cmd.AppendFileNameIfNotNull (string.Format ("@{0}", TemporarySourceListFile)); - cmd.AppendSwitchIfNotNull ("-target ", JavacTargetVersion); - cmd.AppendSwitchIfNotNull ("-source ", JavacSourceVersion); + + if (int.TryParse (JavacSourceVersion, out int sourceVersion) && + int.TryParse (JavacTargetVersion, out int targetVersion) && + JavacSupportsRelease ()) { + cmd.AppendSwitchIfNotNull ("--release ", Math.Max (sourceVersion, targetVersion).ToString ()); + } else { + cmd.AppendSwitchIfNotNull ("-target ", JavacTargetVersion); + cmd.AppendSwitchIfNotNull ("-source ", JavacSourceVersion); + } return cmd.ToString (); } + bool JavacSupportsRelease () + { + if (string.IsNullOrEmpty (JdkVersion)) { + return false; + } + var jdkVersion = Version.Parse (JdkVersion); + return jdkVersion.Major >= 17; + } + protected override void WriteOptionsToResponseFile (StreamWriter sw) { sw.WriteLine ($"-d \"{ClassesOutputDirectory.Replace (@"\", @"\\")}\""); diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in index f58d69ec2d7..8be23004de8 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in @@ -17,7 +17,7 @@ false true true - 17.0.99 + 21.0.99 1.6.0 {abi}{versionCode:D5} UpdateGeneratedFiles