diff --git a/Configuration.props b/Configuration.props
index 3cab97338eb..10858bfbdbf 100644
--- a/Configuration.props
+++ b/Configuration.props
@@ -157,11 +157,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..655edfd2286 100644
--- a/build-tools/automation/azure-pipelines-internal.yaml
+++ b/build-tools/automation/azure-pipelines-internal.yaml
@@ -63,9 +63,6 @@ variables:
value: 'true'
- name: NuGetAudit
value: 'false'
-# Override for internal pipeline
-- name: DefaultJavaSdkMajorVersion
- value: 21
# 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
@@ -736,6 +733,8 @@ stages:
steps:
- template: /build-tools/automation/yaml-templates/setup-test-environment-public.yaml
parameters:
+ jdkMajorVersion: $(DefaultJavaSdkMajorVersion)
+ useAgentJdkPath: true
installTestSlicer: true
installApkDiff: false
use1ESTemplate: false
@@ -829,7 +828,8 @@ stages:
androidSdkPlatforms: $(DefaultTestSdkPlatforms)
dotnetVersion: $(DotNetSdkVersion)
dotnetQuality: $(DotNetSdkQuality)
- useAgentJdkPath: false
+ jdkMajorVersion: $(DefaultJavaSdkMajorVersion)
+ useAgentJdkPath: true
use1ESTemplate: false
- task: DownloadPipelineArtifact@2
diff --git a/build-tools/automation/azure-pipelines-public.yaml b/build-tools/automation/azure-pipelines-public.yaml
index 44eae1ceb96..e396a8094c3 100644
--- a/build-tools/automation/azure-pipelines-public.yaml
+++ b/build-tools/automation/azure-pipelines-public.yaml
@@ -44,9 +44,6 @@ resources:
# Global variables
variables:
- template: /build-tools/automation/yaml-templates/variables.yaml@self
-# Override for public pipeline
-- name: DefaultJavaSdkMajorVersion
- value: 21
# Override pool images for public Microsoft-hosted agents
- name: LinuxPoolImage
value: ubuntu-22.04
@@ -393,6 +390,8 @@ stages:
steps:
- template: /build-tools/automation/yaml-templates/setup-test-environment-public.yaml
parameters:
+ jdkMajorVersion: $(DefaultJavaSdkMajorVersion)
+ useAgentJdkPath: true
installTestSlicer: true
installApkDiff: false
use1ESTemplate: false
@@ -507,7 +506,8 @@ stages:
androidSdkPlatforms: $(DefaultTestSdkPlatforms)
dotnetVersion: $(DotNetSdkVersion)
dotnetQuality: $(DotNetSdkQuality)
- useAgentJdkPath: false
+ jdkMajorVersion: $(DefaultJavaSdkMajorVersion)
+ useAgentJdkPath: true
use1ESTemplate: false
- task: DownloadPipelineArtifact@2
diff --git a/build-tools/automation/yaml-templates/run-emulator-tests.yaml b/build-tools/automation/yaml-templates/run-emulator-tests.yaml
index 2ce355278c0..9d086147bc3 100644
--- a/build-tools/automation/yaml-templates/run-emulator-tests.yaml
+++ b/build-tools/automation/yaml-templates/run-emulator-tests.yaml
@@ -5,7 +5,7 @@ parameters:
jobName: CheckTimeZoneInfoIsCorrectNode1
jobTimeout: 360
jdkMajorVersion: $(DefaultJavaSdkMajorVersion)
- useAgentJdkPath: false
+ useAgentJdkPath: true
testSteps: []
use1ESTemplate: true
diff --git a/build-tools/automation/yaml-templates/setup-jdk-variables.yaml b/build-tools/automation/yaml-templates/setup-jdk-variables.yaml
index adb99c5fa02..fa45a2266ec 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:
@@ -16,6 +16,7 @@ steps:
$jdkHomeVarName="JAVA_HOME_${jdkMajorVersion}_${agentArch}"
$jdkHomePath=(Get-Item -Path "env:$jdkHomeVarName").Value
}
- Write-Host "Setting variable 'JAVA_HOME' to '$jdkHomePath'"
+ Write-Host "Setting variables 'JAVA_HOME' and 'JavaSdkDirectory' to '$jdkHomePath'"
Write-Host "##vso[task.setvariable variable=JAVA_HOME]$jdkHomePath"
- displayName: set JAVA_HOME
+ Write-Host "##vso[task.setvariable variable=JavaSdkDirectory]$jdkHomePath"
+ displayName: set JDK variables
diff --git a/build-tools/automation/yaml-templates/setup-test-environment-public.yaml b/build-tools/automation/yaml-templates/setup-test-environment-public.yaml
index b0cfeaaceb5..408169bc64b 100644
--- a/build-tools/automation/yaml-templates/setup-test-environment-public.yaml
+++ b/build-tools/automation/yaml-templates/setup-test-environment-public.yaml
@@ -4,7 +4,7 @@
parameters:
configuration: $(XA.Build.Configuration)
xaSourcePath: $(System.DefaultWorkingDirectory)
- jdkMajorVersion: $(DefaultJavaSdkMajorVersion)
+ jdkMajorVersion: $(LatestJavaSdkMajorVersion)
useAgentJdkPath: false
remove_dotnet: false
dotnetVersion: $(DotNetSdkVersion)
diff --git a/build-tools/automation/yaml-templates/variables.yaml b/build-tools/automation/yaml-templates/variables.yaml
index 050f31c9c27..890a9f071d4 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,37.2
- 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/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs
index 0221e7d0a76..12dfee5ad01 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
@@ -2219,8 +2219,11 @@ public void CheckJavaError ([Values (AndroidRuntime.CoreCLR, AndroidRuntime.Nati
var ext = b.IsUnix ? "" : ".exe";
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");
+ var expectedErrors = new [] {
+ $"TestMe2.java(1,41): javac{ext} error JAVAC0000: error: ';' expected",
+ $"TestMe2.java(1,41): javac{ext} error JAVAC0000: error: '{{' or ';' expected",
+ };
+ Assert.IsTrue (expectedErrors.Any (error => StringAssertEx.ContainsText (b.LastBuildOutput, error)), "TestMe2.java(1,41) expected");
Assert.IsTrue (b.Clean (proj), "Clean should have succeeded.");
}
}
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/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs
index bb4f44a1fe4..1360b59499c 100644
--- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs
@@ -3,6 +3,7 @@
using System.IO;
using System.Linq;
using System.Reflection;
+using System.Runtime.InteropServices;
using System.Text;
using NUnit.Framework;
using Xamarin.Android.Tools;
@@ -186,6 +187,9 @@ public String Say (String quote) {
var projBuilder = CreateDllBuilder ();
projBuilder.Save (proj);
var dotnet = new DotNetCLI (Path.Combine (Root, projBuilder.ProjectDirectory, proj.ProjectFilePath));
+ if (dotnetVersion == XABuildConfig.PreviousDotNetTargetFramework) {
+ dotnet.JavaSdkPath = GetPreviousWorkloadJavaSdkPath ();
+ }
Assert.IsTrue (dotnet.Pack (parameters: ["Configuration=Release"]), "`dotnet pack` should succeed");
var nupkgPath = Path.Combine (Root, projBuilder.ProjectDirectory, proj.OutputPath, $"{proj.ProjectName}.1.0.0.nupkg");
@@ -439,11 +443,26 @@ public abstract class Foo : ViewHandlerfalse
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 0f952417c5c..2416b1c63c0 100644
--- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
+++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets
@@ -909,6 +909,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(LintToolPath)"
ToolExe="$(LintToolExe)"
JavaSdkPath="$(_JavaSdkDirectory)"
+ JdkVersion="$(_JdkVersion)"
/>
@@ -2373,6 +2374,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(JavaToolPath)"
JavaMaximumHeapSize="$(JavaMaximumHeapSize)"
JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
JarPath="$(AndroidBundleToolJarPath)"
BaseZip="$(_BaseZipIntermediate)"
Modules="@(AndroidAppBundleModules)"
@@ -2489,6 +2491,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(JavaToolPath)"
JavaMaximumHeapSize="$(JavaMaximumHeapSize)"
JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
JarPath="$(AndroidBundleToolJarPath)"
BaseZip="$(_BaseZipIntermediate)"
Modules="@(AndroidAppBundleModules)"
@@ -2689,6 +2692,8 @@ because xbuild doesn't support framework reference assemblies.
ToolExe="$(JavaToolExe)"
ManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml"
AdditionalArguments="$(AndroidApkSignerAdditionalArguments)"
+ JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
/>
@@ -2736,6 +2741,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(JavaToolPath)"
JavaMaximumHeapSize="$(JavaMaximumHeapSize)"
JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
JarPath="$(AndroidBundleToolJarPath)"
AdbToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
@@ -2957,6 +2963,7 @@ because xbuild doesn't support framework reference assemblies.
ToolPath="$(JavaToolPath)"
JavaMaximumHeapSize="$(JavaMaximumHeapSize)"
JavaOptions="$(JavaOptions)"
+ JdkVersion="$(_JdkVersion)"
JarPath="$(AndroidBundleToolJarPath)"
AdbToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
@@ -3000,6 +3007,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)