diff --git a/build-tools/scripts/Jar.targets b/build-tools/scripts/Jar.targets
new file mode 100644
index 00000000000..d381a96a2c6
--- /dev/null
+++ b/build-tools/scripts/Jar.targets
@@ -0,0 +1,43 @@
+
+
+
+
+ <_JavacSourceVersion Condition="$(_JdkVersion.StartsWith ('9'))">1.8
+ <_JavacSourceVersion Condition=" '$(_JavacSourceVersion)' == '' ">1.5
+ <_JavacTargetVersion Condition="$(_JdkVersion.StartsWith ('9'))">1.8
+ <_JavacTargetVersion Condition=" '$(_JavacTargetVersion)' == '' ">1.6
+
+
+
+
+ <_JavacSource
+ Include="@(TestJarEntry)"
+ />
+
+
+ <_Javac>"$(JavaCPath)"
+ <_Jar>"$(JarPath)"
+ <_Targets>-source $(_JavacSourceVersion) -target $(_JavacTargetVersion)
+ <_DestDir>$(IntermediateOutputPath)__CreateTestJarFile-bin
+ <_AndroidJar>-cp "$(AndroidSdkDirectory)\platforms\android-$(_AndroidApiLevelName)\android.jar"
+
+
+
+
+
+
+
+
+
+
+
diff --git a/external/mono b/external/mono
index 9c9140bb726..ab882c0c3de 160000
--- a/external/mono
+++ b/external/mono
@@ -1 +1 @@
-Subproject commit 9c9140bb726579b3ec67bbf98808decd5f97a8a8
+Subproject commit ab882c0c3decfaa2e2d71b85404ce35328a2a99d
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/AdjustJavacVersionArguments.cs b/src/Xamarin.Android.Build.Tasks/Tasks/AdjustJavacVersionArguments.cs
index 758bc338973..f0b385a39fd 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/AdjustJavacVersionArguments.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/AdjustJavacVersionArguments.cs
@@ -7,10 +7,13 @@
namespace Xamarin.Android.Tasks
{
- public class AdjustJavacVersionArguments : ToolTask
+ public class AdjustJavacVersionArguments : Task
{
[Required]
- public string ToolPath { get; set; }
+ public string JdkVersion { get; set; }
+
+ [Required]
+ public string DefaultJdkVersion { get; set; }
public bool EnableProguard { get; set; }
@@ -24,18 +27,18 @@ public class AdjustJavacVersionArguments : ToolTask
[Output]
public string SourceVersion { get; set; }
- protected override string ToolName {
- get { return OS.IsWindows ? "javac.exe" : "javac"; }
- }
-
public override bool Execute ()
{
- Log.LogDebugMessage ("ToolPath: {0}", ToolPath);
- Log.LogDebugMessage ("ToolExe: {0}", ToolExe);
+ Log.LogDebugMessage ($"{nameof (DefaultJdkVersion)}: {DefaultJdkVersion}");
Log.LogDebugMessage ("EnableProguard: {0}", EnableProguard);
Log.LogDebugMessage ("EnableMultiDex: {0}", EnableMultiDex);
+ Log.LogDebugMessage ($"{nameof (JdkVersion)}: {JdkVersion}");
Log.LogDebugMessage ("SkipJavacVersionCheck: {0}", SkipJavacVersionCheck);
+ if (JdkVersion.StartsWith ("9", StringComparison.OrdinalIgnoreCase)) {
+ TargetVersion = SourceVersion = DefaultJdkVersion;
+ }
+
if (SkipJavacVersionCheck)
return true;
@@ -43,34 +46,13 @@ public override bool Execute ()
if (!EnableProguard && !EnableMultiDex)
return true;
- var psi = new ProcessStartInfo (Path.Combine (ToolPath, ToolExe ?? ToolName), "-version") {
- RedirectStandardOutput = true,
- RedirectStandardError = true,
- UseShellExecute = false,
- CreateNoWindow = true,
- WindowStyle = ProcessWindowStyle.Hidden,
- };
- var proc = Process.Start (psi);
- proc.WaitForExit ();
- var line = proc.StandardError.ReadLine ();
- if (!line.StartsWith ("javac "))
- // otherwise ignore.
- return true;
-
- var version = line.Substring (6);
-
- if (version.StartsWith ("1.8")) {
+ if (JdkVersion.StartsWith ("1.8", StringComparison.OrdinalIgnoreCase)) {
TargetVersion = SourceVersion = "1.7";
Log.LogDebugMessage ("Javac TargetVersion adjusted to: {0}", TargetVersion);
Log.LogDebugMessage ("Javac SourceVersion adjusted to: {0}", SourceVersion);
}
- return true;
- }
-
- protected override string GenerateFullPathToTool ()
- {
- return Path.Combine (ToolPath, ToolExe);
+ return !Log.HasLoggedErrors;
}
}
}
diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs
index ff3a4178409..fe57098b4a7 100644
--- a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs
+++ b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs
@@ -116,6 +116,12 @@ public class ResolveSdks : Task
[Output]
public bool AndroidUseApkSigner { get; set; }
+ [Output]
+ public string JdkVersion { get; set; }
+
+ [Output]
+ public string MinimumRequiredJdkVersion { get; set; }
+
static bool IsWindows = Path.DirectorySeparatorChar == '\\';
static readonly string ZipAlign = IsWindows ? "zipalign.exe" : "zipalign";
static readonly string Aapt = IsWindows ? "aapt.exe" : "aapt";
@@ -140,6 +146,7 @@ public bool RunTask ()
Log.LogDebugMessage (" AndroidSdkBuildToolsVersion: {0}", AndroidSdkBuildToolsVersion);
Log.LogDebugMessage ($" {nameof (AndroidSdkPath)}: {AndroidSdkPath}");
Log.LogDebugMessage ($" {nameof (AndroidNdkPath)}: {AndroidNdkPath}");
+ Log.LogDebugMessage ($" {nameof (JavaSdkPath)}: {JavaSdkPath}");
Log.LogDebugTaskItems (" ReferenceAssemblyPaths: ", ReferenceAssemblyPaths);
Log.LogDebugMessage (" TargetFrameworkVersion: {0}", TargetFrameworkVersion);
Log.LogDebugMessage (" UseLatestAndroidPlatformSdk: {0}", UseLatestAndroidPlatformSdk);
@@ -280,6 +287,8 @@ public bool RunTask ()
Log.LogDebugMessage (" AndroidSdkBuildToolsBinPath: {0}", AndroidSdkBuildToolsBinPath);
Log.LogDebugMessage (" AndroidSdkPath: {0}", AndroidSdkPath);
Log.LogDebugMessage (" JavaSdkPath: {0}", JavaSdkPath);
+ Log.LogDebugMessage (" JdkVersion: {0}", JdkVersion);
+ Log.LogDebugMessage (" MinimumRequiredJdkVersion: {0}", MinimumRequiredJdkVersion);
Log.LogDebugMessage (" MonoAndroidBinPath: {0}", MonoAndroidBinPath);
Log.LogDebugMessage (" MonoAndroidToolsPath: {0}", MonoAndroidToolsPath);
Log.LogDebugMessage (" TargetFrameworkVersion: {0}", TargetFrameworkVersion);
@@ -320,7 +329,10 @@ public bool RunTask ()
return !Log.HasLoggedErrors;
}
- static readonly Regex javaVersionRegex = new Regex (@"""(?[\d\.]+)_\d+""");
+ // `java -version` will produce values such as:
+ // java version "9.0.4"
+ // java version "1.8.0_77"
+ static readonly Regex javaVersionRegex = new Regex (@"version ""(?[\d\.]+)(_\d+)?""");
Version GetJavaVersionForFramework (string targetFrameworkVersion)
{
@@ -350,6 +362,8 @@ bool ValidateJavaVersion (string targetFrameworkVersion, string buildToolsVersio
Version requiredJavaForBuildTools = GetJavaVersionForBuildTools (buildToolsVersion);
Version required = requiredJavaForFrameworkVersion > requiredJavaForBuildTools ? requiredJavaForFrameworkVersion : requiredJavaForBuildTools;
+
+ MinimumRequiredJdkVersion = required.ToString ();
var sb = new StringBuilder ();
@@ -372,6 +386,7 @@ bool ValidateJavaVersion (string targetFrameworkVersion, string buildToolsVersio
var versionNumberMatch = javaVersionRegex.Match (versionInfo);
Version versionNumber;
if (versionNumberMatch.Success && Version.TryParse (versionNumberMatch.Groups ["version"]?.Value, out versionNumber)) {
+ JdkVersion = versionNumberMatch.Groups ["version"].Value;
Log.LogMessage (MessageImportance.Normal, $"Found Java SDK version {versionNumber}.");
if (versionNumber < requiredJavaForFrameworkVersion) {
Log.LogError ($"Java SDK {requiredJavaForFrameworkVersion} or above is required when targeting FrameworkVerison {targetFrameworkVersion}.");
@@ -379,8 +394,11 @@ bool ValidateJavaVersion (string targetFrameworkVersion, string buildToolsVersio
if (versionNumber < requiredJavaForBuildTools) {
Log.LogError ($"Java SDK {requiredJavaForBuildTools} or above is required when using build-tools {buildToolsVersion}.");
}
+ if (versionNumber > Version.Parse (LatestSupportedJavaVersion)) {
+ Log.LogWarning ($"JDK Version `{versionNumber}` is later than latest suppored JDK version `{LatestSupportedJavaVersion}`.");
+ }
} else
- Log.LogWarning ($"Failed to get the Java SDK version. Found {versionInfo} but this does not seem to contain a valid version number.");
+ Log.LogWarning ($"Failed to get the Java SDK version as it does not appear to contain a valid version number. `javac -version` returned: ```{versionInfo}```");
return !Log.HasLoggedErrors;
}
diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Bindings.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Bindings.targets
index c063e092880..5ef8fd04dcb 100755
--- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Bindings.targets
+++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Bindings.targets
@@ -190,6 +190,8 @@ Copyright (C) 2012 Xamarin Inc. All rights reserved.
+
+
+
+