protected override string FindRuntime() { string monoAndroidPath = Environment.GetEnvironmentVariable("MONO_ANDROID_PATH"); if (!string.IsNullOrEmpty(monoAndroidPath)) { string libMandroid = Path.Combine(monoAndroidPath, "lib", "mandroid"); if (Directory.Exists(libMandroid)) { if (ValidateRuntime(libMandroid)) { return(libMandroid); } AndroidLogger.LogInfo(null, "MONO_ANDROID_PATH points to {0}, but it is invalid.", monoAndroidPath); } else { AndroidLogger.LogInfo(null, "MONO_ANDROID_PATH points to {0}, but it does not exist.", monoAndroidPath); } } // check also in the users folder var personal = Environment.GetFolderPath(Environment.SpecialFolder.Personal); var additionalSearchPaths = new [] { // for Mono.Posix and Mono.Data.Sqlite builds in xamarin-android. monoAndroidPath = Path.GetFullPath(Path.Combine(new Uri(GetType().Assembly.CodeBase).LocalPath, "..", "..", "..", "..", "..", "lib", "mandroid")), Path.Combine(personal, @".xamarin.android/lib/mandroid") }; return(additionalSearchPaths.Concat(SearchPaths).FirstOrDefault(ValidateRuntime)); }
internal static int GetManifestVersion(string file) { // It seems that MfA 1.0 on Windows didn't include the xml files to get the runtime version. if (!File.Exists(file)) { return(int.MaxValue); } try { using (var r = XmlReader.Create(file, GetSafeReaderSettings())) { if (r.MoveToContent() == XmlNodeType.Element && r.MoveToAttribute("android:versionCode")) { int value; if (int.TryParse(r.Value, out value)) { return(value); } AndroidLogger.LogInfo("Cannot parse runtime version code: ({0})", r.Value); } } } catch (Exception ex) { AndroidLogger.LogError("Error trying to find shared runtime version", ex); } return(int.MaxValue); }
protected override IEnumerable <string> GetAllAvailableAndroidSdks() { var roots = new[] { RegistryEx.CurrentUser, RegistryEx.LocalMachine }; var wow = RegistryEx.Wow64.Key32; AndroidLogger.LogInfo("sdk", "Looking for Android SDK.."); // Check for the key the user gave us in the VS/addin options foreach (var root in roots) { if (CheckRegistryKeyForExecutable(root, MDREG_KEY, MDREG_ANDROID_SDK, wow, "platform-tools", Adb)) { yield return(RegistryEx.GetValueString(root, MDREG_KEY, MDREG_ANDROID_SDK, wow)); } } // Check for the key written by the Xamarin installer if (CheckRegistryKeyForExecutable(RegistryEx.CurrentUser, XAMARIN_ANDROID_INSTALLER_PATH, XAMARIN_ANDROID_INSTALLER_KEY, wow, "platform-tools", Adb)) { yield return(RegistryEx.GetValueString(RegistryEx.CurrentUser, XAMARIN_ANDROID_INSTALLER_PATH, XAMARIN_ANDROID_INSTALLER_KEY, wow)); } // Check for the key written by the Android SDK installer foreach (var root in roots) { if (CheckRegistryKeyForExecutable(root, ANDROID_INSTALLER_PATH, ANDROID_INSTALLER_KEY, wow, "platform-tools", Adb)) { yield return(RegistryEx.GetValueString(root, ANDROID_INSTALLER_PATH, ANDROID_INSTALLER_KEY, wow)); } } // Check some hardcoded paths for good measure var xamarin_private = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Xamarin", "MonoAndroid", "android-sdk-windows"); var android_default = Path.Combine(OS.ProgramFilesX86, "Android", "android-sdk-windows"); var cdrive_default = @"C:\android-sdk-windows"; if (ValidateAndroidSdkLocation(xamarin_private)) { yield return(xamarin_private); } if (ValidateAndroidSdkLocation(android_default)) { yield return(android_default); } if (ValidateAndroidSdkLocation(cdrive_default)) { yield return(cdrive_default); } }
protected override string GetJavaSdkPath() { // check the user specified path var roots = new[] { RegistryEx.CurrentUser, RegistryEx.LocalMachine }; const RegistryEx.Wow64 wow = RegistryEx.Wow64.Key32; foreach (var root in roots) { if (CheckRegistryKeyForExecutable(root, MDREG_KEY, MDREG_JAVA_SDK, wow, "bin", JarSigner)) { return(RegistryEx.GetValueString(root, MDREG_KEY, MDREG_JAVA_SDK, wow)); } } string subkey = @"SOFTWARE\JavaSoft\Java Development Kit"; AndroidLogger.LogInfo("sdk", "Looking for Java 6 SDK.."); foreach (var wow64 in new[] { RegistryEx.Wow64.Key32, RegistryEx.Wow64.Key64 }) { string key_name = string.Format(@"{0}\{1}\{2}", "HKLM", subkey, "CurrentVersion"); var currentVersion = RegistryEx.GetValueString(RegistryEx.LocalMachine, subkey, "CurrentVersion", wow64); if (!string.IsNullOrEmpty(currentVersion)) { AndroidLogger.LogInfo("sdk", " Key {0} found.", key_name); // No matter what the CurrentVersion is, look for 1.6 or 1.7 or 1.8 if (CheckRegistryKeyForExecutable(RegistryEx.LocalMachine, subkey + "\\" + "1.6", "JavaHome", wow64, "bin", JarSigner)) { return(RegistryEx.GetValueString(RegistryEx.LocalMachine, subkey + "\\" + "1.6", "JavaHome", wow64)); } if (CheckRegistryKeyForExecutable(RegistryEx.LocalMachine, subkey + "\\" + "1.7", "JavaHome", wow64, "bin", JarSigner)) { return(RegistryEx.GetValueString(RegistryEx.LocalMachine, subkey + "\\" + "1.7", "JavaHome", wow64)); } if (CheckRegistryKeyForExecutable(RegistryEx.LocalMachine, subkey + "\\" + "1.8", "JavaHome", wow64, "bin", JarSigner)) { return(RegistryEx.GetValueString(RegistryEx.LocalMachine, subkey + "\\" + "1.8", "JavaHome", wow64)); } } AndroidLogger.LogInfo("sdk", " Key {0} not found.", key_name); } // We ran out of things to check.. return(null); }
protected override IEnumerable <string> GetAllAvailableAndroidNdks() { var roots = new[] { RegistryEx.CurrentUser, RegistryEx.LocalMachine }; var wow = RegistryEx.Wow64.Key32; AndroidLogger.LogInfo("sdk", "Looking for Android NDK.."); // Check for the key the user gave us in the VS/addin options foreach (var root in roots) { if (CheckRegistryKeyForExecutable(root, MDREG_KEY, MDREG_ANDROID_NDK, wow, ".", NdkStack)) { yield return(RegistryEx.GetValueString(root, MDREG_KEY, MDREG_ANDROID_NDK, wow)); } } /* * // Check for the key written by the Xamarin installer * if (CheckRegistryKeyForExecutable (RegistryEx.CurrentUser, XAMARIN_ANDROID_INSTALLER_PATH, XAMARIN_ANDROID_INSTALLER_KEY, wow, "platform-tools", Adb)) * yield return RegistryEx.GetValueString (RegistryEx.CurrentUser, XAMARIN_ANDROID_INSTALLER_PATH, XAMARIN_ANDROID_INSTALLER_KEY, wow); */ // Check some hardcoded paths for good measure var xamarin_private = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Xamarin", "MonoAndroid"); var android_default = Path.Combine(OS.ProgramFilesX86, "Android"); var cdrive_default = @"C:\"; foreach (var basePath in new string [] { xamarin_private, android_default, cdrive_default }) { if (Directory.Exists(basePath)) { foreach (var dir in Directory.GetDirectories(basePath, "android-ndk-r*")) { if (ValidateAndroidNdkLocation(dir)) { yield return(dir); } } } } }
private bool CheckRegistryKeyForExecutable(UIntPtr key, string subkey, string valueName, RegistryEx.Wow64 wow64, string subdir, string exe) { string key_name = string.Format(@"{0}\{1}\{2}", key == RegistryEx.CurrentUser ? "HKCU" : "HKLM", subkey, valueName); var path = NullIfEmpty(RegistryEx.GetValueString(key, subkey, valueName, wow64)); if (path == null) { AndroidLogger.LogInfo("sdk", " Key {0} not found.", key_name); return(false); } if (!FindExecutableInDirectory(exe, Path.Combine(path, subdir)).Any()) { AndroidLogger.LogInfo("sdk", " Key {0} found:\n Path does not contain {1} in \\{2} ({3}).", key_name, exe, subdir, path); return(false); } AndroidLogger.LogInfo("sdk", " Key {0} found:\n Path contains {1} in \\{2} ({3}).", key_name, exe, subdir, path); return(true); }
public static void Refresh(string androidSdkPath = null, string androidNdkPath = null, string javaSdkPath = null) { if (OS.IsWindows) { sdk = new AndroidSdkWindows(); } else { sdk = new AndroidSdkUnix(); } try { sdk.Initialize(androidSdkPath ?? sdk.PreferedAndroidSdkPath, androidNdkPath ?? sdk.PreferedAndroidNdkPath, javaSdkPath ?? sdk.PreferedJavaSdkPath); if (IsInstalled) { var levels = GetInstalledPlatformVersions().Select(l => l.ApiLevel.ToString()).ToArray(); string levelList; if (levels == null || levels.Length == 0) { levelList = "(none)"; } else { levelList = string.Join(", ", levels); } AndroidLogger.LogInfo(null, "Found Android SDK. API levels: {0}", levelList); } else { AndroidLogger.LogInfo(null, "Did not find Android SDK"); } } catch (Exception ex) { AndroidLogger.LogError("Error finding Android/Java SDKs", ex); } }