diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs index eef691130a3..4bc52f4545c 100644 --- a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs +++ b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkBase.cs @@ -34,18 +34,18 @@ public string[] AllAndroidNdks { public string AndroidToolsPathShort { get; private set; } public string AndroidPlatformToolsPathShort { get; private set; } - public abstract string Adb { get; } - public abstract string Android { get; } - public abstract string Emulator { get; } - public abstract string Monitor { get; } - public abstract string ZipAlign { get; } - public abstract string JarSigner { get; } - public abstract string KeyTool { get; } - - public abstract string NdkStack { get; } + public virtual string Adb { get; protected set; } = "adb"; + public virtual string Android { get; protected set; } = "android"; + public virtual string Emulator { get; protected set; } = "emulator"; + public virtual string Monitor { get; protected set; } = "monitor"; + public virtual string ZipAlign { get; protected set; } = "zipalign"; + public virtual string JarSigner { get; protected set; } = "jarsigner"; + public virtual string KeyTool { get; protected set; } = "keytool"; + + public virtual string NdkStack { get; protected set; } = "ndk-stack"; public abstract string NdkHostPlatform32Bit { get; } public abstract string NdkHostPlatform64Bit { get; } - public abstract string Javac { get; } + public virtual string Javac { get; protected set; } = "javac"; public abstract string PreferedAndroidSdkPath { get; } public abstract string PreferedAndroidNdkPath { get; } @@ -81,6 +81,13 @@ public virtual void Initialize (string androidSdkPath = null, string androidNdkP IsNdk64Bit = Directory.EnumerateDirectories (toolchainsDir, "arm-linux-androideabi-*") .Any (dir => Directory.Exists (Path.Combine (dir, "prebuilt", NdkHostPlatform64Bit))); } + // we need to look for extensions other than the default .exe|.bat + // google have a habbit of changing them. + Adb = GetExecutablePath (AndroidPlatformToolsPath, Adb); + Android = GetExecutablePath (AndroidToolsPath, Android); + Emulator = GetExecutablePath (AndroidToolsPath, Emulator); + Monitor = GetExecutablePath (AndroidToolsPath, Monitor); + NdkStack = GetExecutablePath (AndroidNdkPath, NdkStack); } protected abstract IEnumerable GetAllAvailableAndroidSdks (); @@ -136,16 +143,22 @@ protected IEnumerable FindExecutableInPath (string executable) protected IEnumerable FindExecutableInDirectory(string executable, string dir) { + foreach (var exe in Executables (executable)) + if (File.Exists (Path.Combine (dir, exe))) + yield return dir; + } + + IEnumerable Executables (string executable) + { + yield return executable; var pathExt = Environment.GetEnvironmentVariable ("PATHEXT"); var pathExts = pathExt?.Split (new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries); - - if (File.Exists (Path.Combine (dir, (executable)))) - yield return dir; + if (pathExts == null) yield break; + foreach (var ext in pathExts) - if (File.Exists (Path.Combine (dir, Path.ChangeExtension (executable, ext)))) - yield return dir; + yield return Path.ChangeExtension (executable, ext); } protected string NullIfEmpty (string s) @@ -155,6 +168,14 @@ protected string NullIfEmpty (string s) return null; } + + string GetExecutablePath (string dir, string exe) + { + foreach (var e in Executables (exe)) + if (File.Exists (Path.Combine (dir, e))) + return e; + return exe; + } } } diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs index 93d624d3ae8..0545c90cdc0 100644 --- a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs +++ b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkUnix.cs @@ -8,15 +8,6 @@ namespace Xamarin.Android.Build.Utilities { class AndroidSdkUnix : AndroidSdkBase { - public override string Adb { get { return "adb"; } } - public override string Android { get { return "android"; } } - public override string Emulator { get { return "emulator"; } } - public override string Monitor { get { return "monitor"; } } - public override string ZipAlign { get { return "zipalign"; } } - public override string JarSigner { get { return "jarsigner"; } } - public override string KeyTool { get { return "keytool"; } } - public override string NdkStack { get { return "ndk-stack"; } } - public override string NdkHostPlatform32Bit { get { return OS.IsMac ? "darwin-x86" : "linux-x86"; } } @@ -24,8 +15,6 @@ public override string NdkHostPlatform64Bit { get { return OS.IsMac ? "darwin-x86_64" : "linux-x86_64"; } } - public override string Javac { get { return "javac"; } } - public override string PreferedAndroidSdkPath { get { var config_file = GetUnixConfigFile (); diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs index 33beb3a7e78..1a93d52a7f4 100644 --- a/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs +++ b/src/Xamarin.Android.Build.Utilities/Sdks/AndroidSdkWindows.cs @@ -15,17 +15,13 @@ class AndroidSdkWindows : AndroidSdkBase const string XAMARIN_ANDROID_INSTALLER_PATH = @"SOFTWARE\Xamarin\MonoAndroid"; const string XAMARIN_ANDROID_INSTALLER_KEY = "PrivateAndroidSdkPath"; - public override string Adb { get { return "adb.exe"; } } - public override string Android { get { return "android.bat"; } } - public override string Emulator { get { return "emulator.exe"; } } - public override string Monitor { get { return "monitor.bat"; } } - public override string ZipAlign { get { return "zipalign.exe"; } } - public override string JarSigner { get { return "jarsigner.exe"; } } - public override string KeyTool { get { return "keytool.exe"; } } - public override string NdkStack { get { return "ndk-stack.exe"; } } + public override string ZipAlign { get; protected set; } = "zipalign.exe"; + public override string JarSigner { get; protected set; } = "jarsigner.exe"; + public override string KeyTool { get; protected set; } = "keytool.exe"; + public override string NdkHostPlatform32Bit { get { return "windows"; } } public override string NdkHostPlatform64Bit { get { return "windows-x86_64"; } } - public override string Javac { get { return "javac.exe"; } } + public override string Javac { get; protected set; } = "javac.exe"; public override string PreferedAndroidSdkPath { get {