diff --git a/Configuration.props b/Configuration.props index c6f829d80d2..b5db11046a1 100644 --- a/Configuration.props +++ b/Configuration.props @@ -137,11 +137,11 @@ L_18.1.6-8.0.0-1 5394EA6C411DA3A08BF0E6A87E1DD1B98BD2562B896C0CACD18E29E2FD4C0660 - 21.0.8 - jdk-21 - jdk-21.0.8+9 + 25.0.4.1 + jdk-25 + jdk-25.0.4.1+1 $(MicrosoftOpenJDKVersion) - 17.0 + 21.0 $(AndroidToolchainDirectory)\$(MicrosoftOpenJDKFolder) <_JdkExeExtension Condition=" '$(_JdkExeExtension)' == '' And '$(HostOS)' == 'Windows' ">.exe $(JavaSdkDirectory)\bin\java$(_JdkExeExtension) diff --git a/build-tools/automation/azure-pipelines-internal.yaml b/build-tools/automation/azure-pipelines-internal.yaml index 257c8faecdd..6f095d74024 100644 --- a/build-tools/automation/azure-pipelines-internal.yaml +++ b/build-tools/automation/azure-pipelines-internal.yaml @@ -65,7 +65,7 @@ variables: value: 'false' # Override for internal pipeline - name: DefaultJavaSdkMajorVersion - value: 21 + value: 25 # Override pool images for internal (non-"-open") dnceng agents. # Confirm these pool/image names exist in the dnceng/internal project. # Match the public pipeline's Mac image (Apple Silicon). Using the x64 diff --git a/build-tools/automation/azure-pipelines-public.yaml b/build-tools/automation/azure-pipelines-public.yaml index 44eae1ceb96..d8004eaad3d 100644 --- a/build-tools/automation/azure-pipelines-public.yaml +++ b/build-tools/automation/azure-pipelines-public.yaml @@ -46,7 +46,7 @@ variables: - template: /build-tools/automation/yaml-templates/variables.yaml@self # Override for public pipeline - name: DefaultJavaSdkMajorVersion - value: 21 + value: 25 # Override pool images for public Microsoft-hosted agents - name: LinuxPoolImage value: ubuntu-22.04 diff --git a/build-tools/automation/yaml-templates/setup-jdk-variables.yaml b/build-tools/automation/yaml-templates/setup-jdk-variables.yaml index adb99c5fa02..667056f7d24 100644 --- a/build-tools/automation/yaml-templates/setup-jdk-variables.yaml +++ b/build-tools/automation/yaml-templates/setup-jdk-variables.yaml @@ -1,5 +1,5 @@ parameters: - jdkMajorVersion: $(DefaultJavaSdkMajorVersion) # Generally 11|17|21 + jdkMajorVersion: $(DefaultJavaSdkMajorVersion) # Supported: 21|25 useAgentJdkPath: true # true to use preinstalled agent JDK, false to use 'android-toolchain/jdk-NN' steps: diff --git a/build-tools/automation/yaml-templates/variables.yaml b/build-tools/automation/yaml-templates/variables.yaml index f6ea506729f..54da62e8dad 100644 --- a/build-tools/automation/yaml-templates/variables.yaml +++ b/build-tools/automation/yaml-templates/variables.yaml @@ -61,9 +61,9 @@ variables: - name: DefaultTestSdkPlatforms # Comma-separated SDK Platform(s) to install on test agents (no spaces) value: 35,36,36.1,37.0,37.1 - name: DefaultJavaSdkMajorVersion - value: 17 -- name: LatestJavaSdkMajorVersion value: 21 +- name: LatestJavaSdkMajorVersion + value: 25 - name: ExcludedNightlyNUnitCategories value: 'cat != SystemApplication & cat != TimeZoneInfo & cat != Localization' - name: RunMAUITestJob diff --git a/eng/gradle/mirror-dependencies.ps1 b/eng/gradle/mirror-dependencies.ps1 index c28bb0e20a0..a1a0f303df8 100644 --- a/eng/gradle/mirror-dependencies.ps1 +++ b/eng/gradle/mirror-dependencies.ps1 @@ -65,8 +65,7 @@ .EXAMPLE pwsh ./eng/gradle/mirror-dependencies.ps1 ` -ProjectDir external/Java.Interop/tests/Xamarin.Android.Tools.Bytecode-Tests/kotlin-gradle ` - -Task classes ` - -GradleWrapper external/Java.Interop/build-tools/gradle/gradlew.bat + -Task classes .EXAMPLE pwsh ./eng/gradle/mirror-dependencies.ps1 ` diff --git a/external/Java.Interop/Directory.Build.props b/external/Java.Interop/Directory.Build.props index aeb0b70dc64..cc9749a6adc 100644 --- a/external/Java.Interop/Directory.Build.props +++ b/external/Java.Interop/Directory.Build.props @@ -58,7 +58,7 @@ dotnet cmake - $(MSBuildThisFileDirectory)build-tools\gradle + $(MSBuildThisFileDirectory)..\..\build-tools\gradle $(GradleHome)\gradlew --stacktrace --no-daemon 11 diff --git a/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.jar b/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 87b738cbd05..00000000000 Binary files a/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.properties b/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index d6e308a6378..00000000000 --- a/external/Java.Interop/build-tools/gradle/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/external/Java.Interop/build-tools/gradle/gradlew b/external/Java.Interop/build-tools/gradle/gradlew deleted file mode 100755 index af6708ff229..00000000000 --- a/external/Java.Interop/build-tools/gradle/gradlew +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env sh - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/external/Java.Interop/build-tools/gradle/gradlew.bat b/external/Java.Interop/build-tools/gradle/gradlew.bat deleted file mode 100644 index 6d57edc706c..00000000000 --- a/external/Java.Interop/build-tools/gradle/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/external/Java.Interop/tools/java-source-utils/build.gradle b/external/Java.Interop/tools/java-source-utils/build.gradle index ad1639e10e7..fee3b930602 100644 --- a/external/Java.Interop/tools/java-source-utils/build.gradle +++ b/external/Java.Interop/tools/java-source-utils/build.gradle @@ -33,7 +33,7 @@ dependencies { application { // Define the main class for the application. - mainClassName = 'com.microsoft.android.App' + mainClass = 'com.microsoft.android.App' } jar { diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidApkSigner.cs b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidApkSigner.cs index 6c3000d4986..91c03ba6e86 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/AndroidApkSigner.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/AndroidApkSigner.cs @@ -73,6 +73,11 @@ protected override string GenerateCommandLineCommands () { var cmd = new CommandLineBuilder (); + var javaOptions = GetJavaOptions (JavaOptions, JdkVersion); + if (!javaOptions.IsNullOrEmpty ()) { + cmd.AppendSwitch (javaOptions); + } + var manifest = AndroidAppManifest.Load (ManifestFile.ItemSpec, MonoAndroidHelper.SupportedVersions); int? minSdk = MonoAndroidHelper.SupportedVersions.MinStableVersion?.ApiLevel; int? maxSdk = MonoAndroidHelper.SupportedVersions.MaxStableVersion?.ApiLevel; diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/BundleTool.cs b/src/Xamarin.Android.Build.Tasks/Tasks/BundleTool.cs index a06dfe9f692..a425ce157f7 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/BundleTool.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/BundleTool.cs @@ -19,8 +19,9 @@ internal virtual CommandLineBuilder GetCommandLineBuilder () { var cmd = new CommandLineBuilder (); - if (!JavaOptions.IsNullOrEmpty ()) { - cmd.AppendSwitch (JavaOptions); + var javaOptions = GetJavaOptions (JavaOptions, JdkVersion); + if (!javaOptions.IsNullOrEmpty ()) { + cmd.AppendSwitch (javaOptions); } cmd.AppendSwitchIfNotNull ("-Xmx", JavaMaximumHeapSize); cmd.AppendSwitchIfNotNull ("-jar ", JarPath); diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs index 6c6f7d87d16..fba0547165f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs @@ -83,6 +83,8 @@ at com.android.dx.command.Main.main(Main.java:106) public string? JavaMaximumHeapSize { get; set; } + public string? JdkVersion { get; set; } + public virtual string DefaultErrorCode => "JAVA0000"; public string? AssemblyIdentityMapFile { get; set; } @@ -123,6 +125,26 @@ protected override string GenerateFullPathToTool () return Path.Combine (ToolPath, ToolExe); } + internal static string GetJavaOptions (string? javaOptions, string? jdkVersion) + { + string options = javaOptions ?? ""; + if (!Version.TryParse (jdkVersion, out var version) || version.Major < 24) { + return options; + } + + options = AppendJavaOption (options, "--enable-native-access=ALL-UNNAMED"); + return AppendJavaOption (options, "--sun-misc-unsafe-memory-access=allow"); + } + + static string AppendJavaOption (string options, string option) + { + if (options.IndexOf (option, StringComparison.Ordinal) >= 0) { + return options; + } + + return options.IsNullOrWhiteSpace () ? option : $"{options} {option}"; + } + protected bool LogFromException (string exception, string error) { switch (exception) { case "java.lang.OutOfMemoryError": @@ -231,4 +253,3 @@ protected override void LogEventsFromTextOutput (string singleLine, MessageImpor } } } - diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs index 4dfbfa17629..f01c6edb6d1 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Javac.cs @@ -29,8 +29,6 @@ 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 () diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs b/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs index 38f3a1e6f31..3c098ee6016 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/Lint.cs @@ -62,6 +62,8 @@ public class Lint : AndroidToolTask [Required] public string JavaSdkPath { get; set; } = ""; + public string? JdkVersion { get; set; } + /// /// Location of an xml config files used to /// determine whether issues are enabled or disabled @@ -194,7 +196,8 @@ public override bool RunTask () bool fromCmdlineTools = ToolPath.IndexOf ("cmdline-tools", StringComparison.OrdinalIgnoreCase) >= 0; - Version lintToolVersion = GetLintVersion (GenerateFullPathToTool ()); + var environmentVariables = GetJavaEnvironmentVariables (); + Version lintToolVersion = GetLintVersion (GenerateFullPathToTool (), environmentVariables); Log.LogDebugMessage (" LintVersion: {0}", lintToolVersion); foreach (var issue in DisabledIssuesByVersion) { if (fromCmdlineTools || lintToolVersion >= issue.Value) { @@ -210,7 +213,7 @@ public override bool RunTask () } } - EnvironmentVariables = new [] { "JAVA_HOME=" + JavaSdkPath }; + EnvironmentVariables = environmentVariables.Select (variable => $"{variable.Key}={variable.Value}").ToArray (); base.RunTask (); @@ -348,7 +351,19 @@ XDocument MergeConfigFiles() return config; } - Version GetLintVersion (string tool) + Dictionary GetJavaEnvironmentVariables () + { + var environmentVariables = new Dictionary { + { "JAVA_HOME", JavaSdkPath }, + }; + var javaOptions = JavaToolTask.GetJavaOptions (Environment.GetEnvironmentVariable ("JAVA_OPTS"), JdkVersion); + if (!javaOptions.IsNullOrEmpty ()) { + environmentVariables.Add ("JAVA_OPTS", javaOptions); + } + return environmentVariables; + } + + Version GetLintVersion (string tool, Dictionary environmentVariables) { var sb = new StringBuilder (); var result = MonoAndroidHelper.RunProcess (tool, "--version", (s, e) => { @@ -357,10 +372,7 @@ Version GetLintVersion (string tool) }, (s, e) => { if (!e.Data.IsNullOrEmpty ()) sb.AppendLine (e.Data); - }, - new Dictionary { - { "JAVA_HOME", JavaSdkPath } - }); + }, environmentVariables); var versionInfo = sb.ToString (); if (result != 0 || versionInfo.Contains ("unknown")) { // lets try to parse the lint-xx-x-x-dev.jar filename to get the version @@ -391,4 +403,3 @@ Version GetLintVersion (string tool) } } } - diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/JavaToolTaskTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/JavaToolTaskTests.cs new file mode 100644 index 00000000000..c0a121c5302 --- /dev/null +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/JavaToolTaskTests.cs @@ -0,0 +1,19 @@ +using NUnit.Framework; +using Xamarin.Android.Tasks; + +namespace Xamarin.Android.Build.Tests +{ + [TestFixture] + public class JavaToolTaskTests + { + [TestCase (null, null, "")] + [TestCase ("-Dfoo=bar", "21.0.8", "-Dfoo=bar")] + [TestCase (null, "25.0.4.1", "--enable-native-access=ALL-UNNAMED --sun-misc-unsafe-memory-access=allow")] + [TestCase ("-Dfoo=bar", "25.0.4.1", "-Dfoo=bar --enable-native-access=ALL-UNNAMED --sun-misc-unsafe-memory-access=allow")] + [TestCase ("--enable-native-access=ALL-UNNAMED", "25.0.4.1", "--enable-native-access=ALL-UNNAMED --sun-misc-unsafe-memory-access=allow")] + public void GetJavaOptions (string? javaOptions, string? jdkVersion, string expected) + { + Assert.AreEqual (expected, JavaToolTask.GetJavaOptions (javaOptions, jdkVersion)); + } + } +} 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 99ac3069920..69af6b074ae 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 - 21.0.99 + 25.0.99 {abi}{versionCode:D5} UpdateGeneratedFiles True diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 869750074d9..d9b33db97b8 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -905,6 +905,7 @@ because xbuild doesn't support framework reference assemblies. ToolPath="$(LintToolPath)" ToolExe="$(LintToolExe)" JavaSdkPath="$(_JavaSdkDirectory)" + JdkVersion="$(_JdkVersion)" /> @@ -2369,6 +2370,7 @@ because xbuild doesn't support framework reference assemblies. ToolPath="$(JavaToolPath)" JavaMaximumHeapSize="$(JavaMaximumHeapSize)" JavaOptions="$(JavaOptions)" + JdkVersion="$(_JdkVersion)" JarPath="$(AndroidBundleToolJarPath)" BaseZip="$(_BaseZipIntermediate)" Modules="@(AndroidAppBundleModules)" @@ -2485,6 +2487,7 @@ because xbuild doesn't support framework reference assemblies. ToolPath="$(JavaToolPath)" JavaMaximumHeapSize="$(JavaMaximumHeapSize)" JavaOptions="$(JavaOptions)" + JdkVersion="$(_JdkVersion)" JarPath="$(AndroidBundleToolJarPath)" BaseZip="$(_BaseZipIntermediate)" Modules="@(AndroidAppBundleModules)" @@ -2685,6 +2688,8 @@ because xbuild doesn't support framework reference assemblies. ToolExe="$(JavaToolExe)" ManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml" AdditionalArguments="$(AndroidApkSignerAdditionalArguments)" + JavaOptions="$(JavaOptions)" + JdkVersion="$(_JdkVersion)" /> @@ -2732,6 +2737,7 @@ because xbuild doesn't support framework reference assemblies. ToolPath="$(JavaToolPath)" JavaMaximumHeapSize="$(JavaMaximumHeapSize)" JavaOptions="$(JavaOptions)" + JdkVersion="$(_JdkVersion)" JarPath="$(AndroidBundleToolJarPath)" AdbToolPath="$(AdbToolPath)" AdbTarget="$(AdbTarget)" @@ -2953,6 +2959,7 @@ because xbuild doesn't support framework reference assemblies. ToolPath="$(JavaToolPath)" JavaMaximumHeapSize="$(JavaMaximumHeapSize)" JavaOptions="$(JavaOptions)" + JdkVersion="$(_JdkVersion)" JarPath="$(AndroidBundleToolJarPath)" AdbToolPath="$(AdbToolPath)" AdbTarget="$(AdbTarget)" @@ -2996,6 +3003,7 @@ because xbuild doesn't support framework reference assemblies. ToolPath="$(JavaToolPath)" JavaMaximumHeapSize="$(JavaMaximumHeapSize)" JavaOptions="$(JavaOptions)" + JdkVersion="$(_JdkVersion)" JarPath="$(AndroidBundleToolJarPath)" AdbToolPath="$(AdbToolPath)" AdbTarget="$(AdbTarget)" diff --git a/src/openjdk/openjdk.targets b/src/openjdk/openjdk.targets index b25c26a1934..a27c19d78a3 100644 --- a/src/openjdk/openjdk.targets +++ b/src/openjdk/openjdk.targets @@ -30,8 +30,8 @@ <_OpenJDKInstallDir>$(AndroidToolchainDirectory)\$(MicrosoftOpenJDKFolder) <_OpenJDKVersionFile>$(_OpenJDKInstallDir)\xa_jdk_version.txt + Windows/Linux archives have: jdk-25.0.4.1+1/bin/java (1 level) + macOS archives have: ./jdk-25.0.4.1+1/Contents/Home/bin/java (4 levels, ./ counts) --> <_OpenJDKStripComponents Condition=" '$(HostOS)' != 'Darwin' ">1 <_OpenJDKStripComponents Condition=" '$(HostOS)' == 'Darwin' ">4 @@ -40,7 +40,7 @@ Inputs="$(MSBuildThisFileFullPath);$(MSBuildProjectFullPath);..\..\Configuration.props" Outputs="$(_OpenJDKArchive)"> + File format: "6ecfa864... microsoft-jdk-25.0.4.1-windows-x64.zip" --> <_DownloadFile Include="$(_OpenJDKHashFileName)"> _DownloadUrl=$(_OpenJDKHashUrl);_DownloadFolder=$(AndroidToolchainCacheDirectory);_DownloadFileName=$(_OpenJDKHashFileName)