Skip to content

Commit cb01ba5

Browse files
committed
[Xamarin.Android.Tools.AndroidSdk] Probe for Microsoft OpenJDK dirs
1 parent e618e00 commit cb01ba5

File tree

2 files changed

+78
-2
lines changed

2 files changed

+78
-2
lines changed

src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ public static IEnumerable<JdkInfo> GetKnownSystemJdkInfos (Action<TraceLevel, st
287287
return GetEnvironmentVariableJdks ("JI_JAVA_HOME", logger)
288288
.Concat (GetWindowsJdks (logger))
289289
.Concat (GetConfiguredJdks (logger))
290+
.Concat (GetMacOSMicrosoftOpenJdks (logger))
290291
.Concat (GetMacOSMicrosoftJdks (logger))
291292
.Concat (GetEnvironmentVariableJdks ("JAVA_HOME", logger))
292293
.Concat (GetPathEnvironmentJdks (logger))
@@ -313,6 +314,32 @@ static IEnumerable<string> GetConfiguredJdkPaths (Action<TraceLevel, string> log
313314
}
314315
}
315316

317+
internal static IEnumerable<JdkInfo> GetMacOSMicrosoftOpenJdks (Action<TraceLevel, string> logger)
318+
{
319+
return GetMacOSMicrosoftOpenJdkPaths ()
320+
.Select (p => TryGetJdkInfo (p, logger, "/Library/Java/JavaVirtualMachines/microsoft-*.jdk"))
321+
.Where (jdk => jdk != null)
322+
.Select (jdk => jdk!)
323+
.OrderByDescending (jdk => jdk, JdkInfoVersionComparer.Default);
324+
}
325+
326+
static IEnumerable<string> GetMacOSMicrosoftOpenJdkPaths ()
327+
{
328+
var jdk = AppDomain.CurrentDomain.GetData ($"GetMacOSMicrosoftOpenJdkPath override! {typeof (JdkInfo).AssemblyQualifiedName}")
329+
?.ToString ();
330+
if (jdk != null) {
331+
yield return jdk;
332+
yield break;
333+
}
334+
const string JVMs = "/Library/Java/JavaVirtualMachines";
335+
foreach (var dir in Directory.EnumerateDirectories (JVMs, "microsoft-*.jdk")) {
336+
var home = Path.Combine (dir, "Contents", "Home");
337+
if (!Directory.Exists (home))
338+
continue;
339+
yield return home;
340+
}
341+
}
342+
316343
internal static IEnumerable<JdkInfo> GetMacOSMicrosoftJdks (Action<TraceLevel, string> logger)
317344
{
318345
return GetMacOSMicrosoftJdkPaths ()

src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ IEnumerable<JdkInfo> ToJdkInfos (IEnumerable<string> paths, string locator)
131131
}
132132

133133
return ToJdkInfos (GetPreferredJdkPaths (), "Preferred Registry")
134-
.Concat (ToJdkInfos (GetOpenJdkPaths (), "OpenJDK"))
134+
.Concat (ToJdkInfos (GetMicrosoftOpenJdkPaths (), "Microsoft OpenJDK"))
135+
.Concat (ToJdkInfos (GetVSAndroidJdkPaths (), @"HKLM\SOFTWARE\Microsoft\VisualStudio\Android@JavaHome"))
135136
.Concat (ToJdkInfos (GetKnownOpenJdkPaths (), "Well-known OpenJDK paths"))
136137
.Concat (ToJdkInfos (GetOracleJdkPaths (), "Oracle JDK"))
137138
;
@@ -150,7 +151,7 @@ private static IEnumerable<string> GetPreferredJdkPaths ()
150151
}
151152
}
152153

153-
private static IEnumerable<string> GetOpenJdkPaths ()
154+
private static IEnumerable<string> GetVSAndroidJdkPaths ()
154155
{
155156
var root = RegistryEx.LocalMachine;
156157
var wows = new[] { RegistryEx.Wow64.Key32, RegistryEx.Wow64.Key64 };
@@ -162,6 +163,54 @@ private static IEnumerable<string> GetOpenJdkPaths ()
162163
yield return RegistryEx.GetValueString (root, subKey, valueName, wow) ?? "";
163164
}
164165
}
166+
private static IEnumerable<string> GetMicrosoftOpenJdkPaths ()
167+
{
168+
const string JdkFolderNamePrefix = "jdk-";
169+
170+
var paths = new List<Tuple<string, Version>> ();
171+
var rootPaths = new List<string> {
172+
Path.Combine (Environment.ExpandEnvironmentVariables ("%ProgramW6432%"), "Microsoft"),
173+
Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86), "Android", "jdk"),
174+
};
175+
176+
foreach (var rootPath in rootPaths) {
177+
if (!Directory.Exists (rootPath))
178+
continue;
179+
foreach (var directoryName in Directory.EnumerateDirectories (rootPath, $"{JdkFolderNamePrefix}*").ToList ()) {
180+
var version = ExtractVersion (directoryName, JdkFolderNamePrefix);
181+
if (version == null)
182+
continue;
183+
paths.Add (Tuple.Create (directoryName, version));
184+
}
185+
}
186+
187+
return paths.OrderByDescending (v => v.Item2)
188+
.Where (openJdk => ProcessUtils.FindExecutablesInDirectory (Path.Combine (openJdk.Item1, "bin"), _JarSigner).Any ())
189+
.Select (openJdk => openJdk.Item1);
190+
}
191+
192+
static Version? ExtractVersion (string path, string prefix)
193+
{
194+
var name = Path.GetFileName (path);
195+
if (name.Length <= prefix.Length)
196+
return null;
197+
if (!name.StartsWith (prefix, StringComparison.OrdinalIgnoreCase))
198+
return null;
199+
200+
name = name.Substring (prefix.Length);
201+
int end = 0;
202+
while (end < name.Length &&
203+
(char.IsDigit (name [end]) || name [end] == '.'))
204+
end++;
205+
206+
do {
207+
if (Version.TryParse (name.Substring (0, end), out var v))
208+
return v;
209+
end = name.LastIndexOf ('.', end);
210+
} while (end > 0);
211+
212+
return null;
213+
}
165214

166215
/// <summary>
167216
/// Locate OpenJDK installations by well known path.

0 commit comments

Comments
 (0)