From 68c3d155e232834559217d1c6dff3721f5928acb Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Wed, 25 Jul 2018 17:34:08 -0500 Subject: [PATCH 1/4] [Mac] Handle OpenJDK paths and path validation As per the OpenJDK spec, GetJavaSdkPath() now follows these steps when fetching the SDK path: 1. Gets the prefered SDK path from ~/.config/xbuild/monodroid-config.xml 2. Checks $JAVA_HOME 3. Checks the output of /usr/libexec/java_home 4. ** NOT IMPLEMENTED YET **: Checks /etc/alternatives/java 5. A directory in $PATH that contains jarsigner Fixes VSTS #652760 and VSTS #646086 --- .../Sdks/AndroidSdkUnix.cs | 71 ++++++++++++++----- 1 file changed, 53 insertions(+), 18 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs index b6b5451..ec5113d 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs @@ -62,6 +62,7 @@ public override string PreferedJavaSdkPath { if (ValidateJavaSdkLocation (path)) return path; } + return null; } } @@ -93,6 +94,14 @@ protected override string GetJavaSdkPath () if (!string.IsNullOrEmpty (preferedJavaSdkPath)) return preferedJavaSdkPath; + var javaHomeEnv = Environment.GetEnvironmentVariable ("JAVA_HOME"); + if (!String.IsNullOrEmpty (javaHomeEnv) && ValidateJavaSdkLocation (javaHomeEnv)) + return javaHomeEnv; + + var libExecJavaHome = GetUsrLibExecJavaHomeSdkPath (); + if (!String.IsNullOrEmpty (libExecJavaHome) && ValidateJavaSdkLocation (libExecJavaHome)) + return libExecJavaHome; + // Look in PATH foreach (var path in FindExecutableInPath (JarSigner)) { // Strip off "bin" @@ -105,29 +114,34 @@ protected override string GetJavaSdkPath () return null; } - public override bool ValidateJavaSdkLocation (string loc) + public override bool ValidateJavaSdkLocation (string loc) { var result = base.ValidateJavaSdkLocation (loc); if (result) { - // handle apple's java stub - const string javaHomeExe = "/usr/libexec/java_home"; - - if (File.Exists (javaHomeExe)) { - // returns true if there is a java installed - var javaHomeTask = ProcessUtils.ExecuteToolAsync (javaHomeExe, - (output) => { - if (output.Contains ("(null)")) { - return false; - } - - return true; - }, System.Threading.CancellationToken.None - ); - - if (!javaHomeTask.Result) { - return false; + if (loc == "/usr") { + // handle apple's java stub + const string javaHomeExe = "/usr/libexec/java_home"; + + if (File.Exists (javaHomeExe)) { + // returns true if there is a java installed + var javaHomeTask = ProcessUtils.ExecuteToolAsync (javaHomeExe, + (output) => { + if (output.Contains ("(null)")) { + return false; + } + + return true; + }, System.Threading.CancellationToken.None + ); + + if (!javaHomeTask.Result) { + return false; + } } + } else { + // Handle OpenJDK or other paths + return File.Exists (Path.Combine (loc, "bin", "javac")); } } @@ -201,6 +215,27 @@ public override void SetPreferredAndroidNdkPath (string path) doc.Save (UnixConfigPath); } + string GetUsrLibExecJavaHomeSdkPath () + { + const string javaHomeExe = "/usr/libexec/java_home"; + + if (File.Exists (javaHomeExe)) { + var javaHomeTask = ProcessUtils.ExecuteToolAsync (javaHomeExe, + (output) => { + if (output.Contains ("(null)")) { + return null; + } + + return output; + }, System.Threading.CancellationToken.None + ); + + return javaHomeTask.Result; + } + + return null; + } + private static string UnixConfigPath { get { var p = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData); From b20c3771f9501d0383e4537ac388da843d174311 Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Wed, 25 Jul 2018 17:45:51 -0500 Subject: [PATCH 2/4] Simplify ValidateJavaSdkLocation() --- .../Sdks/AndroidSdkUnix.cs | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs index 6fc5c2c..aeb4b68 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs @@ -138,30 +138,7 @@ public override bool ValidateJavaSdkLocation (string loc) var result = base.ValidateJavaSdkLocation (loc); if (result) { - if (loc == "/usr") { - // handle apple's java stub - const string javaHomeExe = "/usr/libexec/java_home"; - - if (File.Exists (javaHomeExe)) { - // returns true if there is a java installed - var javaHomeTask = ProcessUtils.ExecuteToolAsync (javaHomeExe, - (output) => { - if (output.Contains ("(null)")) { - return false; - } - - return true; - }, System.Threading.CancellationToken.None - ); - - if (!javaHomeTask.Result) { - return false; - } - } - } else { - // Handle OpenJDK or other paths - return File.Exists (Path.Combine (loc, "bin", "javac")); - } + return File.Exists (Path.Combine (loc, "bin", "javac")); } return result; From c08bac16a40b53b9d12e5c1573969a9205dd919d Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Wed, 25 Jul 2018 22:02:22 -0500 Subject: [PATCH 3/4] Remove code that is already covered in another PR https://github.com/xamarin/xamarin-android-tools/pull/32 --- .../Sdks/AndroidSdkUnix.cs | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs index aeb4b68..4de3d6c 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs @@ -81,7 +81,6 @@ public override string PreferedJavaSdkPath { if (ValidateJavaSdkLocation (path)) return path; } - return null; } } @@ -113,14 +112,6 @@ protected override string GetJavaSdkPath () if (!string.IsNullOrEmpty (preferedJavaSdkPath)) return preferedJavaSdkPath; - var javaHomeEnv = Environment.GetEnvironmentVariable ("JAVA_HOME"); - if (!String.IsNullOrEmpty (javaHomeEnv) && ValidateJavaSdkLocation (javaHomeEnv)) - return javaHomeEnv; - - var libExecJavaHome = GetUsrLibExecJavaHomeSdkPath (); - if (!String.IsNullOrEmpty (libExecJavaHome) && ValidateJavaSdkLocation (libExecJavaHome)) - return libExecJavaHome; - // Look in PATH foreach (var path in FindExecutableInPath (JarSigner)) { // Strip off "bin" @@ -211,27 +202,6 @@ public override void SetPreferredAndroidNdkPath (string path) SaveConfig (doc); } - string GetUsrLibExecJavaHomeSdkPath () - { - const string javaHomeExe = "/usr/libexec/java_home"; - - if (File.Exists (javaHomeExe)) { - var javaHomeTask = ProcessUtils.ExecuteToolAsync (javaHomeExe, - (output) => { - if (output.Contains ("(null)")) { - return null; - } - - return output; - }, System.Threading.CancellationToken.None - ); - - return javaHomeTask.Result; - } - - return null; - } - void SaveConfig (XDocument doc) { string cfg = UnixConfigPath; From 9222cf91db427bf8cd48566f0a258b6336c79aba Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Thu, 26 Jul 2018 10:20:04 -0500 Subject: [PATCH 4/4] Update GetJavaSdkPath() to use JdkInfo --- .../Sdks/AndroidSdkUnix.cs | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs index fbb5f50..eba5184 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -108,20 +109,7 @@ protected override IEnumerable GetAllAvailableAndroidSdks () protected override string GetJavaSdkPath () { - var preferedJavaSdkPath = PreferedJavaSdkPath; - if (!string.IsNullOrEmpty (preferedJavaSdkPath)) - return preferedJavaSdkPath; - - // Look in PATH - foreach (var path in ProcessUtils.FindExecutablesInPath (JarSigner)) { - // Strip off "bin" - var dir = Path.GetDirectoryName (path); - - if (ValidateJavaSdkLocation (dir)) - return dir; - } - - return null; + return JdkInfo.GetKnownSystemJdkInfos (Logger).FirstOrDefault ()?.HomePath; } public override bool ValidateJavaSdkLocation (string loc)