From dfd674fdd7cc1f0ae4bf7ab8236b9c5ae734e3e7 Mon Sep 17 00:00:00 2001 From: Kyle White Date: Fri, 7 Jun 2019 09:43:32 -0400 Subject: [PATCH 1/7] Add GetKnownOpenJdkPaths in AndroidSdkWindows This method will location Microsoft OpenJdk based on well-known install location. As of AB#735565 we can no longer rely on regristry keys. GetJdkInfos will prefer these well-known paths. --- .../Sdks/AndroidSdkWindows.cs | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs index 04a3371..c78d753 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs @@ -132,7 +132,8 @@ IEnumerable ToJdkInfos (IEnumerable paths, string locator) .OrderByDescending (jdk => jdk, JdkInfoVersionComparer.Default); } - return ToJdkInfos (GetPreferredJdkPaths (), "Preferred Registry") + return ToJdkInfos (GetKnownOpenJdkPaths (), "Well-known OpenJDK paths") + .Concat (ToJdkInfos(GetPreferredJdkPaths (), "Preferred Registry")) .Concat (ToJdkInfos (GetOpenJdkPaths (), "OpenJDK")) .Concat (ToJdkInfos (GetOracleJdkPaths (), "Oracle JDK")); } @@ -163,6 +164,37 @@ private static IEnumerable GetOpenJdkPaths () } } + /// + /// Locate OpenJDK installations by well known path. + /// + /// List of valid OpenJDK paths in version descending order. + private static IEnumerable GetKnownOpenJdkPaths () + { + string JdkFolderNamePattern = "microsoft_dist_openjdk_"; + + var paths = new List (); + var rootPaths = new List + { + Path.Combine (Environment.ExpandEnvironmentVariables ("%ProgramW6432%"), "Android", "Jdk"), + Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86), "Android", "Jdk") + }; + + foreach (var rootPath in rootPaths) { + if (Directory.Exists (rootPath)) { + foreach (var directoryName in Directory.EnumerateDirectories (rootPath, $"{JdkFolderNamePattern}*").ToList ()) { + var versionString = directoryName.Replace ($"{rootPath}\\{JdkFolderNamePattern}", string.Empty); + if (Version.TryParse (versionString, out Version ver)) { + paths.Add (new { Path = directoryName, Version = ver }); + } + } + } + } + + return paths.OrderByDescending (v => v.Version) + .Where (openJdk => ProcessUtils.FindExecutablesInDirectory (Path.Combine(openJdk, "bin"), _JarSigner).Any()) + .Select (openJdk => (string) openJdk.Path); + } + private static IEnumerable GetOracleJdkPaths () { string subkey = @"SOFTWARE\JavaSoft\Java Development Kit"; From d17b4c35b7daab0685b5ce7df43c2c4e7265bde1 Mon Sep 17 00:00:00 2001 From: Kyle White Date: Fri, 7 Jun 2019 09:46:49 -0400 Subject: [PATCH 2/7] PreferredJavaSdk should come from well-known path Fixes AB#735565 --- .../Sdks/AndroidSdkWindows.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs index c78d753..1e4362b 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs @@ -41,6 +41,7 @@ public override string PreferedAndroidSdkPath { return null; } } + public override string PreferedAndroidNdkPath { get { var wow = RegistryEx.Wow64.Key32; @@ -50,13 +51,10 @@ public override string PreferedAndroidNdkPath { return null; } } + public override string PreferedJavaSdkPath { get { - var wow = RegistryEx.Wow64.Key32; - var regKey = GetMDRegistryKey (); - if (CheckRegistryKeyForExecutable (RegistryEx.CurrentUser, regKey, MDREG_JAVA_SDK, wow, "bin", JarSigner)) - return RegistryEx.GetValueString (RegistryEx.CurrentUser, regKey, MDREG_JAVA_SDK, wow); - return null; + return GetKnownOpenJdkPaths ().FirstOrDefault (); } } From 96f7ffce3267c70385bd8be72775529511d3651d Mon Sep 17 00:00:00 2001 From: Kyle White Date: Fri, 7 Jun 2019 09:48:04 -0400 Subject: [PATCH 3/7] Bump nuget package version --- nuget.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nuget.version b/nuget.version index 9f8e9b6..b123147 100644 --- a/nuget.version +++ b/nuget.version @@ -1 +1 @@ -1.0 \ No newline at end of file +1.1 \ No newline at end of file From 10445fd4652c837f8d952dc63fb7a188ad3d9f1c Mon Sep 17 00:00:00 2001 From: Kyle White Date: Fri, 7 Jun 2019 10:00:43 -0400 Subject: [PATCH 4/7] Use a Tuple instead of dynamic Fixes CI build --- .../Sdks/AndroidSdkWindows.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs index 1e4362b..3037295 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs @@ -170,7 +170,7 @@ private static IEnumerable GetKnownOpenJdkPaths () { string JdkFolderNamePattern = "microsoft_dist_openjdk_"; - var paths = new List (); + var paths = new List> (); var rootPaths = new List { Path.Combine (Environment.ExpandEnvironmentVariables ("%ProgramW6432%"), "Android", "Jdk"), @@ -182,15 +182,15 @@ private static IEnumerable GetKnownOpenJdkPaths () foreach (var directoryName in Directory.EnumerateDirectories (rootPath, $"{JdkFolderNamePattern}*").ToList ()) { var versionString = directoryName.Replace ($"{rootPath}\\{JdkFolderNamePattern}", string.Empty); if (Version.TryParse (versionString, out Version ver)) { - paths.Add (new { Path = directoryName, Version = ver }); + paths.Add (new Tuple(directoryName, ver)); } } } } - return paths.OrderByDescending (v => v.Version) - .Where (openJdk => ProcessUtils.FindExecutablesInDirectory (Path.Combine(openJdk, "bin"), _JarSigner).Any()) - .Select (openJdk => (string) openJdk.Path); + return paths.OrderByDescending (v => v.Item2) + .Where (openJdk => ProcessUtils.FindExecutablesInDirectory (Path.Combine(openJdk.Item1, "bin"), _JarSigner).Any()) + .Select (openJdk => openJdk.Item1); } private static IEnumerable GetOracleJdkPaths () From 71a51b5a375e2b9761b319b33b4146b46151ac81 Mon Sep 17 00:00:00 2001 From: Kyle White Date: Fri, 7 Jun 2019 12:03:38 -0400 Subject: [PATCH 5/7] Well known OpenJDK paths are lowercase jdk Although I don't think case matters in paths on Windows. --- .../Sdks/AndroidSdkWindows.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs index 3037295..f11a40a 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs @@ -173,8 +173,8 @@ private static IEnumerable GetKnownOpenJdkPaths () var paths = new List> (); var rootPaths = new List { - Path.Combine (Environment.ExpandEnvironmentVariables ("%ProgramW6432%"), "Android", "Jdk"), - Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86), "Android", "Jdk") + Path.Combine (Environment.ExpandEnvironmentVariables ("%ProgramW6432%"), "Android", "jdk"), + Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86), "Android", "jdk") }; foreach (var rootPath in rootPaths) { From cdabcdad91ea26d13c252e680e17cb869a5b6d63 Mon Sep 17 00:00:00 2001 From: Kyle White Date: Fri, 7 Jun 2019 15:54:34 -0400 Subject: [PATCH 6/7] Revert changes to PreferredJdkPathsOnly use well-known paths when others fail --- .../Sdks/AndroidSdkWindows.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs index f11a40a..fafbd39 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs @@ -41,7 +41,6 @@ public override string PreferedAndroidSdkPath { return null; } } - public override string PreferedAndroidNdkPath { get { var wow = RegistryEx.Wow64.Key32; @@ -51,10 +50,13 @@ public override string PreferedAndroidNdkPath { return null; } } - public override string PreferedJavaSdkPath { get { - return GetKnownOpenJdkPaths ().FirstOrDefault (); + var wow = RegistryEx.Wow64.Key32; + var regKey = GetMDRegistryKey (); + if (CheckRegistryKeyForExecutable (RegistryEx.CurrentUser, regKey, MDREG_JAVA_SDK, wow, "bin", JarSigner)) + return RegistryEx.GetValueString (RegistryEx.CurrentUser, regKey, MDREG_JAVA_SDK, wow); + return null; } } @@ -130,9 +132,9 @@ IEnumerable ToJdkInfos (IEnumerable paths, string locator) .OrderByDescending (jdk => jdk, JdkInfoVersionComparer.Default); } - return ToJdkInfos (GetKnownOpenJdkPaths (), "Well-known OpenJDK paths") - .Concat (ToJdkInfos(GetPreferredJdkPaths (), "Preferred Registry")) + return ToJdkInfos (GetPreferredJdkPaths (), "Preferred Registry") .Concat (ToJdkInfos (GetOpenJdkPaths (), "OpenJDK")) + .Concat (ToJdkInfos (GetKnownOpenJdkPaths (), "Well-known OpenJDK paths")) .Concat (ToJdkInfos (GetOracleJdkPaths (), "Oracle JDK")); } @@ -189,8 +191,8 @@ private static IEnumerable GetKnownOpenJdkPaths () } return paths.OrderByDescending (v => v.Item2) - .Where (openJdk => ProcessUtils.FindExecutablesInDirectory (Path.Combine(openJdk.Item1, "bin"), _JarSigner).Any()) - .Select (openJdk => openJdk.Item1); + .Where (openJdk => ProcessUtils.FindExecutablesInDirectory (Path.Combine(openJdk.Item1, "bin"), _JarSigner).Any()) + .Select (openJdk => openJdk.Item1); } private static IEnumerable GetOracleJdkPaths () From 6e29e272ac33ec72e6576588388af023b100d248 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Mon, 10 Jun 2019 11:45:01 -0400 Subject: [PATCH 7/7] Fix formatting --- .../Sdks/AndroidSdkWindows.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs index fafbd39..549267e 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs @@ -173,10 +173,9 @@ private static IEnumerable GetKnownOpenJdkPaths () string JdkFolderNamePattern = "microsoft_dist_openjdk_"; var paths = new List> (); - var rootPaths = new List - { + var rootPaths = new List { Path.Combine (Environment.ExpandEnvironmentVariables ("%ProgramW6432%"), "Android", "jdk"), - Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86), "Android", "jdk") + Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86), "Android", "jdk"), }; foreach (var rootPath in rootPaths) { @@ -191,7 +190,7 @@ private static IEnumerable GetKnownOpenJdkPaths () } return paths.OrderByDescending (v => v.Item2) - .Where (openJdk => ProcessUtils.FindExecutablesInDirectory (Path.Combine(openJdk.Item1, "bin"), _JarSigner).Any()) + .Where (openJdk => ProcessUtils.FindExecutablesInDirectory (Path.Combine (openJdk.Item1, "bin"), _JarSigner).Any ()) .Select (openJdk => openJdk.Item1); }