From 5b8a14a4ecaf64760c3cc1cf953316f1b76c07ae Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Fri, 8 Nov 2024 19:28:21 +0000 Subject: [PATCH 1/4] [build] use `javac -source 17 -target 17` (#9493) Context: https://stackoverflow.com/a/76043133 Running `javac` with a newer `-source` and `-target` can run additional optimizations that results in *slightly* smaller Java bytecode and runtime performance. We should do this for all Java code we build as part of the product, as it might improve install size & build times for tools like `manifestmerger.jar` and `r8.jar`. After this change, I got the error: error: option -bootclasspath not allowed with target 17 Which is fixed by using `-classpath` instead. --- Configuration.props | 4 ++-- build-tools/scripts/Jar.targets | 2 +- build-tools/scripts/JavaCallableWrappers.targets | 2 +- .../Tasks/JavaSourceUtils.cs | 2 +- src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs | 11 +++++++---- .../Tests/Xamarin.Android.Build.Tests/BuildTest.cs | 2 +- .../Xamarin.Android.Common.props.in | 4 ++-- src/java-runtime/java-runtime.targets | 2 +- 8 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Configuration.props b/Configuration.props index 63c44f28a69..ffe66b63e2b 100644 --- a/Configuration.props +++ b/Configuration.props @@ -135,8 +135,8 @@ $(_TestsProfiledAotName)$(_TestsAotName) - 1.8 - 1.8 + 17 + 17 $([System.IO.Path]::GetFullPath ('$(AndroidNdkDirectory)')) diff --git a/build-tools/scripts/Jar.targets b/build-tools/scripts/Jar.targets index 477afd8612c..680aa93e75e 100644 --- a/build-tools/scripts/Jar.targets +++ b/build-tools/scripts/Jar.targets @@ -33,7 +33,7 @@ <_Jar>"$(JarPath)" <_Targets>-source $(JavacSourceVersion) -target $(JavacTargetVersion) <_DestDir>$(IntermediateOutputPath)__CreateTestJarFile-bin - <_AndroidJar>-bootclasspath "$(AndroidSdkDirectory)\platforms\android-$(_AndroidApiLevelName)\android.jar" + <_AndroidJar>-classpath "$(AndroidSdkDirectory)\platforms\android-$(_AndroidApiLevelName)\android.jar" <_CP>-cp "$(_JavaInteropJarPath)" <_JavacFilesResponse>$(IntermediateOutputPath)__javac_response.txt diff --git a/build-tools/scripts/JavaCallableWrappers.targets b/build-tools/scripts/JavaCallableWrappers.targets index 07cb544a3a0..ffcd5018a72 100644 --- a/build-tools/scripts/JavaCallableWrappers.targets +++ b/build-tools/scripts/JavaCallableWrappers.targets @@ -37,7 +37,7 @@ <_MonoAndroidRuntimeJar>$(MicrosoftAndroidSdkOutDir)java_runtime.jar Path.GetFullPath (p.ItemSpec))); - AppendArg (response, "--bootclasspath"); + AppendArg (response, "--classpath"); AppendArg (response, classpath); } diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs index 74cbb16c6e4..eb17f14152a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs @@ -53,8 +53,7 @@ protected override string GenerateCommandLineCommands () // Running command: C:\Program Files (x86)\Java\jdk1.6.0_20\bin\javac.exe // "-J-Dfile.encoding=UTF8" // "-d" "bin\classes" - // "-classpath" "C:\Users\Jonathan\Documents\Visual Studio 2010\Projects\AndroidMSBuildTest\AndroidMSBuildTest\obj\Debug\android\bin\mono.android.jar" - // "-bootclasspath" "C:\Program Files (x86)\Android\android-sdk-windows\platforms\android-8\android.jar" + // "-classpath" "C:\Users\Jonathan\Documents\Visual Studio 2010\Projects\AndroidMSBuildTest\AndroidMSBuildTest\obj\Debug\android\bin\mono.android.jar";"C:\Program Files (x86)\Android\android-sdk-windows\platforms\android-8\android.jar" // "-encoding" "UTF-8" // "@C:\Users\Jonathan\AppData\Local\Temp\tmp79c4ac38.tmp" @@ -87,9 +86,13 @@ bool JavacSupportsRelease () protected override void WriteOptionsToResponseFile (StreamWriter sw) { + var jars = new List (); + if (Jars != null) + jars.AddRange (Jars.Select (i => i.ItemSpec.Replace (@"\", @"\\"))); + jars.Add (JavaPlatformJarPath.Replace (@"\", @"\\")); + sw.WriteLine ($"-d \"{ClassesOutputDirectory.Replace (@"\", @"\\")}\""); - sw.WriteLine ("-classpath \"{0}\"", Jars == null || !Jars.Any () ? null : string.Join (Path.PathSeparator.ToString (), Jars.Select (i => i.ItemSpec.Replace (@"\", @"\\")))); - sw.WriteLine ("-bootclasspath \"{0}\"", JavaPlatformJarPath.Replace (@"\", @"\\")); + sw.WriteLine ("-classpath \"{0}\"", string.Join (Path.PathSeparator.ToString (), jars)); sw.WriteLine ($"-encoding UTF8"); } } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs index aedd58f29e2..8cc76792220 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs @@ -1593,7 +1593,7 @@ public void CheckJavaError () b.ThrowOnBuildFailure = false; Assert.IsFalse (b.Build (proj), "Build should have failed."); var ext = b.IsUnix ? "" : ".exe"; - var text = $"TestMe.java(1,8): javac{ext} error JAVAC0000: error: class, interface, or enum expected"; + var text = $"TestMe.java(1,8): javac{ext} error JAVAC0000: error: class, interface, enum, or record expected"; Assert.IsTrue (StringAssertEx.ContainsText (b.LastBuildOutput, text), "TestMe.java(1,8) expected"); text = $"TestMe2.java(1,41): javac{ext} error JAVAC0000: error: ';' expected"; Assert.IsTrue (StringAssertEx.ContainsText (b.LastBuildOutput, text), "TestMe2.java(1,41) expected"); 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 afad4ac5eda..637387a05d9 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in @@ -27,8 +27,8 @@ @BUNDLETOOL_VERSION@ <_XamarinAndroidMSBuildDirectory>$(MSBuildThisFileDirectory) - 1.8 - 1.8 + 17 + 17 true diff --git a/src/java-runtime/java-runtime.targets b/src/java-runtime/java-runtime.targets index 812a73516ce..38eb73117d9 100644 --- a/src/java-runtime/java-runtime.targets +++ b/src/java-runtime/java-runtime.targets @@ -54,7 +54,7 @@ <_AndroidJar>"$(AndroidSdkDirectory)\platforms\android-$(AndroidJavaRuntimeApiLevel)\android.jar" Date: Wed, 16 Apr 2025 10:36:15 -0500 Subject: [PATCH 2/4] `$(JavacSource/TargetVersion)` 9 --- Configuration.props | 4 ++-- .../Xamarin.Android.Common.props.in | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Configuration.props b/Configuration.props index ffe66b63e2b..9c7793cfef9 100644 --- a/Configuration.props +++ b/Configuration.props @@ -135,8 +135,8 @@ $(_TestsProfiledAotName)$(_TestsAotName) - 17 - 17 + 9 + 9 $([System.IO.Path]::GetFullPath ('$(AndroidNdkDirectory)')) 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 637387a05d9..bca74976a92 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in @@ -27,8 +27,8 @@ @BUNDLETOOL_VERSION@ <_XamarinAndroidMSBuildDirectory>$(MSBuildThisFileDirectory) - 17 - 17 + 9 + 9 true From 97730f77fdfd111b1b80335de8c7e950f1febcbf Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 16 Apr 2025 14:47:30 -0500 Subject: [PATCH 3/4] Update BuildTest.cs --- .../Tests/Xamarin.Android.Build.Tests/BuildTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs index 8cc76792220..aedd58f29e2 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs @@ -1593,7 +1593,7 @@ public void CheckJavaError () b.ThrowOnBuildFailure = false; Assert.IsFalse (b.Build (proj), "Build should have failed."); var ext = b.IsUnix ? "" : ".exe"; - var text = $"TestMe.java(1,8): javac{ext} error JAVAC0000: error: class, interface, enum, or record expected"; + var text = $"TestMe.java(1,8): javac{ext} error JAVAC0000: error: class, interface, or enum expected"; Assert.IsTrue (StringAssertEx.ContainsText (b.LastBuildOutput, text), "TestMe.java(1,8) expected"); text = $"TestMe2.java(1,41): javac{ext} error JAVAC0000: error: ';' expected"; Assert.IsTrue (StringAssertEx.ContainsText (b.LastBuildOutput, text), "TestMe2.java(1,41) expected"); From 56361d29c0616aa5393748902d0bf0e585e6b0b4 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 16 Apr 2025 14:57:39 -0500 Subject: [PATCH 4/4] java-runtime.csproj with `$(JavacSourceVersion)=1.8` --- src/java-runtime/java-runtime.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/java-runtime/java-runtime.csproj b/src/java-runtime/java-runtime.csproj index 2d65059d87f..6ef3dfe931a 100644 --- a/src/java-runtime/java-runtime.csproj +++ b/src/java-runtime/java-runtime.csproj @@ -3,6 +3,9 @@ netstandard2.0 Debug false + + 1.8 + 1.8