From 4f2a41a6662f4fe4cf4301d11246d8a7d5bc0ed8 Mon Sep 17 00:00:00 2001 From: Dima Date: Fri, 24 Apr 2020 02:50:54 +0300 Subject: [PATCH 01/10] Add support for new 'cmdline-tools' Google replaced 'tools' with 'cmdline-tools' Android sdk now supports multiple 'cmdline-tools' versions installed SxS For the sake of simplicity, using latest installed version for now. https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1109288 --- .../AndroidSdkInfo.cs | 13 +++++++++++++ .../Sdks/AndroidSdkBase.cs | 4 ++-- .../AndroidSdkInfoTests.cs | 6 +++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs index 5738fb1..c698ac4 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs @@ -185,5 +185,18 @@ public static void DetectAndSetPreferredJavaSdkPathToLatest (Action Date: Fri, 24 Apr 2020 19:02:48 +0300 Subject: [PATCH 02/10] Fallback to "tools" if "cmdline-tools" dir is not found on disk --- src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs index c698ac4..0d1edda 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs @@ -189,8 +189,14 @@ public static void DetectAndSetPreferredJavaSdkPathToLatest (Action Date: Thu, 30 Apr 2020 00:23:57 +0300 Subject: [PATCH 03/10] [tests] Add unit tests for AndroidSdkInfo.GetPreferredAndroidToolsPath --- .../AndroidSdkInfoTests.cs | 117 ++++++++++++++++-- 1 file changed, 108 insertions(+), 9 deletions(-) diff --git a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs index e526979..c3ecd77 100644 --- a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs +++ b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs @@ -164,13 +164,85 @@ public void JdkDirectory_JavaHome () } } + [Test] + public void Sdk_PreferredToolsPath () + { + var root = CreateRoot (); + var sdk = Path.Combine (root, "sdk"); + var latestToolsVersion = "latest"; + var toolsVersion = "1.1"; + var higherToolsVersion = "1.2"; + + Directory.CreateDirectory (sdk); + void recreateSdkDirectory () { + Directory.Delete (sdk, true); + Directory.CreateDirectory (sdk); + } + + var failureMessage = "GetPreferredAndroidToolsPath should return \"cmdline-tools\" if it is installed"; + CreateFauxAndroidSdkToolsDirectory (sdk, true, toolsVersion, false); + + var toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); + Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", toolsVersion), failureMessage); + + + failureMessage = "GetPreferredAndroidToolsPath should return \"cmdline-tools\", if both \"tools\" and \"cmdline-tools\" are installed"; + recreateSdkDirectory (); + CreateFauxAndroidSdkToolsDirectory (sdk, true, latestToolsVersion, true); + + toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); + Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", latestToolsVersion), failureMessage); + + + failureMessage = "GetPreferredAndroidToolsPath should return \"/cmdline-tools/latest\", if multiple versions are installed, including \"latest\""; + recreateSdkDirectory (); + CreateFauxAndroidSdkToolsDirectory (sdk, true, latestToolsVersion, false); + CreateFauxAndroidSdkToolsDirectory (sdk, true, toolsVersion, false); + CreateFauxAndroidSdkToolsDirectory (sdk, true, higherToolsVersion, false); + + toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); + Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", latestToolsVersion), failureMessage); + + + failureMessage = "GetPreferredAndroidToolsPath should return \"/cmdline-tools/\", if multiple versions are installed"; + recreateSdkDirectory (); + CreateFauxAndroidSdkToolsDirectory (sdk, true, toolsVersion, false); + CreateFauxAndroidSdkToolsDirectory (sdk, true, higherToolsVersion, false); + + toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); + Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", higherToolsVersion), failureMessage); + + + failureMessage = "GetPreferredAndroidToolsPath should return \"tools\" if it is installed and \"cmdline-tools\" isn't"; + recreateSdkDirectory (); + CreateFauxAndroidSdkToolsDirectory (sdk, false, toolsVersion, true); + + toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); + Assert.AreEqual (toolsPath, Path.Combine (sdk, "tools"), failureMessage); + + + failureMessage = "GetPreferredAndroidToolsPath should return \"/cmdline-tools/latest\" if both \"tools\" and \"cmdline-tools\" are not installed"; + recreateSdkDirectory (); + + toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); + Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", latestToolsVersion), failureMessage); + + Directory.Delete (root, recursive: true); + } + static bool IsWindows => OS.IsWindows; - static void CreateSdks (out string root, out string jdk, out string ndk, out string sdk) + static string CreateRoot () { - root = Path.GetTempFileName (); + var root = Path.GetTempFileName (); File.Delete (root); Directory.CreateDirectory (root); + return root; + } + + static void CreateSdks (out string root, out string jdk, out string ndk, out string sdk) + { + root = CreateRoot (); ndk = Path.Combine (root, "ndk"); sdk = Path.Combine (root, "sdk"); @@ -180,22 +252,50 @@ static void CreateSdks (out string root, out string jdk, out string ndk, out str Directory.CreateDirectory (ndk); Directory.CreateDirectory (jdk); - CreateFauxAndroidSdkDirectory (sdk, "26.0.0", "1.0"); + CreateFauxAndroidSdkDirectory (sdk, "26.0.0"); CreateFauxAndroidNdkDirectory (ndk); CreateFauxJavaSdkDirectory (jdk, "1.8.0", out var _, out var _); } - static void CreateFauxAndroidSdkDirectory (string androidSdkDirectory, string buildToolsVersion, string toolsVersion, ApiInfo [] apiLevels = null) + static void CreateFauxAndroidSdkToolsDirectory (string androidSdkDirectory, bool createToolsDir, string toolsVersion, bool createOldToolsDir) + { + if (createToolsDir) { + string androidSdkToolsPath = Path.Combine (androidSdkDirectory, "cmdline-tools", toolsVersion ?? "1.0"); + var androidSDdkToolsBinPath = Path.Combine (androidSdkToolsPath, "bin"); + + Directory.CreateDirectory (androidSdkToolsPath); + Directory.CreateDirectory (androidSDdkToolsBinPath); + + File.WriteAllText (Path.Combine (androidSdkToolsPath, IsWindows ? "lint.bat" : "lint"), ""); + } + + if (createOldToolsDir) { + string androidSdkToolsPath = Path.Combine (androidSdkDirectory, "tools"); + var androidSDdkToolsBinPath = Path.Combine (androidSdkToolsPath, "bin"); + + Directory.CreateDirectory (androidSdkToolsPath); + Directory.CreateDirectory (androidSDdkToolsBinPath); + + File.WriteAllText (Path.Combine (androidSdkToolsPath, IsWindows ? "lint.bat" : "lint"), ""); + } + + } + + static void CreateFauxAndroidSdkDirectory ( + string androidSdkDirectory, + string buildToolsVersion, + bool createToolsDir = true, + string toolsVersion = null, + bool createOldToolsDir = false, + ApiInfo [] apiLevels = null) { - var androidSdkToolsPath = Path.Combine (androidSdkDirectory, "cmdline-tools", toolsVersion); - var androidSdkBinPath = Path.Combine (androidSdkToolsPath, "bin"); + CreateFauxAndroidSdkToolsDirectory (androidSdkDirectory, createToolsDir, toolsVersion, createOldToolsDir); + var androidSdkPlatformToolsPath = Path.Combine (androidSdkDirectory, "platform-tools"); var androidSdkPlatformsPath = Path.Combine (androidSdkDirectory, "platforms"); var androidSdkBuildToolsPath = Path.Combine (androidSdkDirectory, "build-tools", buildToolsVersion); Directory.CreateDirectory (androidSdkDirectory); - Directory.CreateDirectory (androidSdkToolsPath); - Directory.CreateDirectory (androidSdkBinPath); Directory.CreateDirectory (androidSdkPlatformToolsPath); Directory.CreateDirectory (androidSdkPlatformsPath); Directory.CreateDirectory (androidSdkBuildToolsPath); @@ -203,7 +303,6 @@ static void CreateFauxAndroidSdkDirectory (string androidSdkDirectory, string bu File.WriteAllText (Path.Combine (androidSdkPlatformToolsPath, IsWindows ? "adb.exe" : "adb"), ""); File.WriteAllText (Path.Combine (androidSdkBuildToolsPath, IsWindows ? "zipalign.exe" : "zipalign"), ""); File.WriteAllText (Path.Combine (androidSdkBuildToolsPath, IsWindows ? "aapt.exe" : "aapt"), ""); - File.WriteAllText (Path.Combine (androidSdkToolsPath, IsWindows ? "lint.bat" : "lint"), ""); List defaults = new List (); for (int i = 10; i < 26; i++) { From 1c86230747159fa9ede22a2d47859f1f9f1d65dd Mon Sep 17 00:00:00 2001 From: Dima Date: Thu, 30 Apr 2020 00:29:23 +0300 Subject: [PATCH 04/10] Tweak GetPreferredAndroidToolsPath to return /cmdline-tools/latest if Tools directory was not found --- src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs index 0d1edda..24b4fb5 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs @@ -195,7 +195,7 @@ public static string GetPreferredAndroidToolsPath(string androidSdkPath) if (Directory.Exists (oldToolsDir)) return oldToolsDir; - return toolsDir; + return Path.Combine(toolsDir, "latest"); } if (Directory.Exists (Path.Combine (toolsDir, "latest"))) From 797eb881298e0e257aa1473f7692875d77bbd639 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Wed, 29 Apr 2020 18:36:17 -0400 Subject: [PATCH 05/10] Fix formatting & Semantics One "semantic" change: `lint` is in `androidSdkToolsBinPath`, *not* `androidSdkToolsPath`: ``` % find cmdline-tools -iname lint cmdline-tools/latest/bin/lint cmdline-tools/latest/lib/lint ``` --- .../AndroidSdkInfoTests.cs | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs index c3ecd77..bed16c2 100644 --- a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs +++ b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs @@ -167,20 +167,20 @@ public void JdkDirectory_JavaHome () [Test] public void Sdk_PreferredToolsPath () { - var root = CreateRoot (); - var sdk = Path.Combine (root, "sdk"); - var latestToolsVersion = "latest"; - var toolsVersion = "1.1"; - var higherToolsVersion = "1.2"; + var root = CreateRoot (); + var sdk = Path.Combine (root, "sdk"); + var latestToolsVersion = "latest"; + var toolsVersion = "1.1"; + var higherToolsVersion = "1.2"; Directory.CreateDirectory (sdk); void recreateSdkDirectory () { - Directory.Delete (sdk, true); + Directory.Delete (sdk, recursive: true); Directory.CreateDirectory (sdk); } var failureMessage = "GetPreferredAndroidToolsPath should return \"cmdline-tools\" if it is installed"; - CreateFauxAndroidSdkToolsDirectory (sdk, true, toolsVersion, false); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: toolsVersion, createOldToolsDir: false); var toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", toolsVersion), failureMessage); @@ -188,7 +188,7 @@ void recreateSdkDirectory () { failureMessage = "GetPreferredAndroidToolsPath should return \"cmdline-tools\", if both \"tools\" and \"cmdline-tools\" are installed"; recreateSdkDirectory (); - CreateFauxAndroidSdkToolsDirectory (sdk, true, latestToolsVersion, true); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: latestToolsVersion, createOldToolsDir: true); toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", latestToolsVersion), failureMessage); @@ -196,9 +196,9 @@ void recreateSdkDirectory () { failureMessage = "GetPreferredAndroidToolsPath should return \"/cmdline-tools/latest\", if multiple versions are installed, including \"latest\""; recreateSdkDirectory (); - CreateFauxAndroidSdkToolsDirectory (sdk, true, latestToolsVersion, false); - CreateFauxAndroidSdkToolsDirectory (sdk, true, toolsVersion, false); - CreateFauxAndroidSdkToolsDirectory (sdk, true, higherToolsVersion, false); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: latestToolsVersion, createOldToolsDir: false); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: toolsVersion, createOldToolsDir: false); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: higherToolsVersion, createOldToolsDir: false); toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", latestToolsVersion), failureMessage); @@ -206,16 +206,16 @@ void recreateSdkDirectory () { failureMessage = "GetPreferredAndroidToolsPath should return \"/cmdline-tools/\", if multiple versions are installed"; recreateSdkDirectory (); - CreateFauxAndroidSdkToolsDirectory (sdk, true, toolsVersion, false); - CreateFauxAndroidSdkToolsDirectory (sdk, true, higherToolsVersion, false); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: toolsVersion, createOldToolsDir: false); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: higherToolsVersion, createOldToolsDir: false); toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); - Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", higherToolsVersion), failureMessage); + Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", toolsVersion: higherToolsVersion), failureMessage); failureMessage = "GetPreferredAndroidToolsPath should return \"tools\" if it is installed and \"cmdline-tools\" isn't"; recreateSdkDirectory (); - CreateFauxAndroidSdkToolsDirectory (sdk, false, toolsVersion, true); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: false, toolsVersion: toolsVersion, createOldToolsDir: true); toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); Assert.AreEqual (toolsPath, Path.Combine (sdk, "tools"), failureMessage); @@ -260,34 +260,34 @@ static void CreateSdks (out string root, out string jdk, out string ndk, out str static void CreateFauxAndroidSdkToolsDirectory (string androidSdkDirectory, bool createToolsDir, string toolsVersion, bool createOldToolsDir) { if (createToolsDir) { - string androidSdkToolsPath = Path.Combine (androidSdkDirectory, "cmdline-tools", toolsVersion ?? "1.0"); - var androidSDdkToolsBinPath = Path.Combine (androidSdkToolsPath, "bin"); + string androidSdkToolsPath = Path.Combine (androidSdkDirectory, "cmdline-tools", toolsVersion ?? "1.0"); + string androidSdkToolsBinPath = Path.Combine (androidSdkToolsPath, "bin"); Directory.CreateDirectory (androidSdkToolsPath); - Directory.CreateDirectory (androidSDdkToolsBinPath); + Directory.CreateDirectory (androidSdkToolsBinPath); - File.WriteAllText (Path.Combine (androidSdkToolsPath, IsWindows ? "lint.bat" : "lint"), ""); + File.WriteAllText (Path.Combine (androidSdkToolsBinPath, IsWindows ? "lint.bat" : "lint"), ""); } if (createOldToolsDir) { - string androidSdkToolsPath = Path.Combine (androidSdkDirectory, "tools"); - var androidSDdkToolsBinPath = Path.Combine (androidSdkToolsPath, "bin"); + string androidSdkToolsPath = Path.Combine (androidSdkDirectory, "tools"); + string androidSDdkToolsBinPath = Path.Combine (androidSdkToolsPath, "bin"); Directory.CreateDirectory (androidSdkToolsPath); - Directory.CreateDirectory (androidSDdkToolsBinPath); + Directory.CreateDirectory (androidSdkToolsBinPath); - File.WriteAllText (Path.Combine (androidSdkToolsPath, IsWindows ? "lint.bat" : "lint"), ""); + File.WriteAllText (Path.Combine (androidSdkToolsBinPath, IsWindows ? "lint.bat" : "lint"), ""); } } static void CreateFauxAndroidSdkDirectory ( - string androidSdkDirectory, - string buildToolsVersion, - bool createToolsDir = true, - string toolsVersion = null, - bool createOldToolsDir = false, - ApiInfo [] apiLevels = null) + string androidSdkDirectory, + string buildToolsVersion, + bool createToolsDir = true, + string toolsVersion = null, + bool createOldToolsDir = false, + ApiInfo[] apiLevels = null) { CreateFauxAndroidSdkToolsDirectory (androidSdkDirectory, createToolsDir, toolsVersion, createOldToolsDir); From cc6f5f1ec218987cbc6ef282cd14585471b6b011 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Wed, 29 Apr 2020 18:46:04 -0400 Subject: [PATCH 06/10] Oops --- .../AndroidSdkInfoTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs index bed16c2..31b16ed 100644 --- a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs +++ b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs @@ -210,7 +210,7 @@ void recreateSdkDirectory () { CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: higherToolsVersion, createOldToolsDir: false); toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); - Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", toolsVersion: higherToolsVersion), failureMessage); + Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", higherToolsVersion), failureMessage); failureMessage = "GetPreferredAndroidToolsPath should return \"tools\" if it is installed and \"cmdline-tools\" isn't"; @@ -271,7 +271,7 @@ static void CreateFauxAndroidSdkToolsDirectory (string androidSdkDirectory, bool if (createOldToolsDir) { string androidSdkToolsPath = Path.Combine (androidSdkDirectory, "tools"); - string androidSDdkToolsBinPath = Path.Combine (androidSdkToolsPath, "bin"); + string androidSdkToolsBinPath = Path.Combine (androidSdkToolsPath, "bin"); Directory.CreateDirectory (androidSdkToolsPath); Directory.CreateDirectory (androidSdkToolsBinPath); From f8dac643b92420f079ea2303951290353f78405b Mon Sep 17 00:00:00 2001 From: Dima Date: Thu, 30 Apr 2020 02:08:34 +0300 Subject: [PATCH 07/10] Fix Tools version picker. Use sorted by TryParseVersion instead of dirs.Max () --- .../AndroidSdkInfo.cs | 26 ++++++++++++------- .../AndroidSdkInfoTests.cs | 4 +-- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs index 24b4fb5..8ed9b47 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs @@ -52,11 +52,7 @@ public IEnumerable GetBuildToolsPaths () foreach (var d in preview) yield return d; - var sorted = from p in Directory.EnumerateDirectories (buildTools) - let version = TryParseVersion (Path.GetFileName (p)) - where version != null - orderby version descending - select p; + var sorted = SortedSubdirectoriesByVersion (buildTools); foreach (var d in sorted) yield return d; @@ -66,6 +62,15 @@ orderby version descending yield return ptPath; } + static IEnumerable SortedSubdirectoriesByVersion (string dir) + { + return from p in Directory.EnumerateDirectories (dir) + let version = TryParseVersion (Path.GetFileName (p)) + where version != null + orderby version descending + select p; + } + static Version TryParseVersion (string v) { Version version; @@ -189,20 +194,21 @@ public static void DetectAndSetPreferredJavaSdkPathToLatest (Action Date: Thu, 30 Apr 2020 03:52:27 +0300 Subject: [PATCH 08/10] Remove AndroidToolsPath, Monitor and Android from AndroidSdkBase as they're not being used anymore. --- .../Sdks/AndroidSdkBase.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs index 8c7adae..db1e671 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs @@ -37,9 +37,7 @@ public AndroidSdkBase (Action logger) public string AndroidNdkPath { get; private set; } public string JavaSdkPath { get; private set; } public string JavaBinPath { get; private set; } - public string AndroidToolsPath { get; private set; } public string AndroidPlatformToolsPath { get; private set; } - public string AndroidToolsPathShort { get; private set; } public string AndroidPlatformToolsPathShort { get; private set; } public virtual string Adb { get; protected set; } = "adb"; @@ -76,13 +74,9 @@ public virtual void Initialize (string androidSdkPath = null, string androidNdkP } if (!string.IsNullOrEmpty (AndroidSdkPath)) { - AndroidToolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath(AndroidSdkPath); - AndroidToolsPathShort = GetShortFormPath (AndroidToolsPath); AndroidPlatformToolsPath = Path.Combine (AndroidSdkPath, "platform-tools"); AndroidPlatformToolsPathShort = GetShortFormPath (AndroidPlatformToolsPath); } else { - AndroidToolsPath = null; - AndroidToolsPathShort = null; AndroidPlatformToolsPath = null; AndroidPlatformToolsPathShort = null; } @@ -98,9 +92,7 @@ public virtual void Initialize (string androidSdkPath = null, string androidNdkP // 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 (Path.Combine (AndroidSdkPath, "emulator"), Emulator); - Monitor = GetExecutablePath (AndroidToolsPath, Monitor); NdkStack = GetExecutablePath (AndroidNdkPath, NdkStack); } From 1649622241241dac9e13bf4c3f0d8bf12703090f Mon Sep 17 00:00:00 2001 From: Dima Date: Thu, 30 Apr 2020 04:33:49 +0300 Subject: [PATCH 09/10] * Class method -> instance method * Better naming * Fixed tests --- .../AndroidSdkInfo.cs | 43 +++++--- .../AndroidSdkInfoTests.cs | 97 ++++++++----------- 2 files changed, 72 insertions(+), 68 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs index 8ed9b47..4cf0ee4 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs @@ -191,24 +191,39 @@ public static void DetectAndSetPreferredJavaSdkPathToLatest (Action GetCommandLineToolsPaths (string preferredCommandLineToolsVersion) + { + if (!string.IsNullOrEmpty (preferredCommandLineToolsVersion)) { + var preferredDir = Path.Combine (AndroidSdkPath, "cmdline-tools", preferredCommandLineToolsVersion); + if (Directory.Exists (preferredDir)) + return new[] { preferredDir }.Concat (GetCommandLineToolsPaths ().Where (p => p != preferredDir)); } + return GetCommandLineToolsPaths (); + } - if (Directory.Exists (defaultToolsPath)) - return defaultToolsPath; - - return SortedSubdirectoriesByVersion (toolsDir).FirstOrDefault () ?? defaultToolsPath; + public IEnumerable GetCommandLineToolsPaths () + { + var cmdlineToolsDir = Path.Combine (AndroidSdkPath, "cmdline-tools"); + if (Directory.Exists (cmdlineToolsDir)) { + var latestDir = Path.Combine (cmdlineToolsDir, "latest"); + if (Directory.Exists (latestDir)) + yield return latestDir; + foreach (var d in SortedSubdirectoriesByVersion (cmdlineToolsDir)) { + var version = Path.GetFileName (d); + if (version == "latest") + continue; + yield return d; + } + } + var toolsDir = Path.Combine (AndroidSdkPath, "tools"); + if (Directory.Exists (toolsDir)) { + yield return toolsDir; + } } } } diff --git a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs index 701abe8..5b31f3b 100644 --- a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs +++ b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs @@ -165,69 +165,58 @@ public void JdkDirectory_JavaHome () } [Test] - public void Sdk_PreferredToolsPath () + public void Sdk_GetCommandLineToolsPaths () { - var root = CreateRoot (); - var sdk = Path.Combine (root, "sdk"); + CreateSdks(out string root, out string jdk, out string ndk, out string sdk); + + var cmdlineTools = Path.Combine (sdk, "cmdline-tools"); var latestToolsVersion = "latest"; var toolsVersion = "2.1"; var higherToolsVersion = "11.2"; - Directory.CreateDirectory (sdk); - void recreateSdkDirectory () { - Directory.Delete (sdk, recursive: true); - Directory.CreateDirectory (sdk); + void recreateCmdlineToolsDirectory () { + Directory.Delete (cmdlineTools, recursive: true); + Directory.CreateDirectory (cmdlineTools); } - - var failureMessage = "GetPreferredAndroidToolsPath should return \"cmdline-tools\" if it is installed"; - CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: toolsVersion, createOldToolsDir: false); - - var toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); - Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", toolsVersion), failureMessage); - - - failureMessage = "GetPreferredAndroidToolsPath should return \"cmdline-tools\", if both \"tools\" and \"cmdline-tools\" are installed"; - recreateSdkDirectory (); - CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: latestToolsVersion, createOldToolsDir: true); - - toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); - Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", latestToolsVersion), failureMessage); - - - failureMessage = "GetPreferredAndroidToolsPath should return \"/cmdline-tools/latest\", if multiple versions are installed, including \"latest\""; - recreateSdkDirectory (); - CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: latestToolsVersion, createOldToolsDir: false); - CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: toolsVersion, createOldToolsDir: false); - CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: higherToolsVersion, createOldToolsDir: false); - - toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); - Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", latestToolsVersion), failureMessage); - - failureMessage = "GetPreferredAndroidToolsPath should return \"/cmdline-tools/\", if multiple versions are installed"; - recreateSdkDirectory (); - CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: toolsVersion, createOldToolsDir: false); - CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: higherToolsVersion, createOldToolsDir: false); - - toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); - Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", higherToolsVersion), failureMessage); - - - failureMessage = "GetPreferredAndroidToolsPath should return \"tools\" if it is installed and \"cmdline-tools\" isn't"; - recreateSdkDirectory (); - CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: false, toolsVersion: toolsVersion, createOldToolsDir: true); - - toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); - Assert.AreEqual (toolsPath, Path.Combine (sdk, "tools"), failureMessage); - - - failureMessage = "GetPreferredAndroidToolsPath should return \"/cmdline-tools/latest\" if both \"tools\" and \"cmdline-tools\" are not installed"; - recreateSdkDirectory (); + try { + var info = new AndroidSdkInfo (androidSdkPath: sdk); - toolsPath = AndroidSdkInfo.GetPreferredAndroidToolsPath (sdk); - Assert.AreEqual (toolsPath, Path.Combine (sdk, "cmdline-tools", latestToolsVersion), failureMessage); + // Test cmdline-tools path + recreateCmdlineToolsDirectory(); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: toolsVersion, createOldToolsDir: false); + var toolsPaths = info.GetCommandLineToolsPaths (); - Directory.Delete (root, recursive: true); + Assert.AreEqual (toolsPaths.Count (), 1, "Incorrect number of elements"); + Assert.AreEqual (toolsPaths.First (), Path.Combine (sdk, "cmdline-tools", toolsVersion), "Incorrect command line tools path"); + + // Test that cmdline-tools is preferred over tools + recreateCmdlineToolsDirectory(); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: latestToolsVersion, createOldToolsDir: true); + toolsPaths = info.GetCommandLineToolsPaths (); + + Assert.AreEqual (toolsPaths.Count (), 2, "Incorrect number of elements"); + Assert.AreEqual (toolsPaths.First (), Path.Combine (sdk, "cmdline-tools", latestToolsVersion), "Incorrect command line tools path"); + Assert.AreEqual (toolsPaths.Last (), Path.Combine (sdk, "tools"), "Incorrect tools path"); + + // Test sorting + recreateCmdlineToolsDirectory (); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: latestToolsVersion, createOldToolsDir: false); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: toolsVersion, createOldToolsDir: false); + CreateFauxAndroidSdkToolsDirectory (sdk, createToolsDir: true, toolsVersion: higherToolsVersion, createOldToolsDir: true); + toolsPaths = info.GetCommandLineToolsPaths (); + + var toolsPathsList = toolsPaths.ToList (); + Assert.AreEqual (toolsPaths.Count (), 4, "Incorrect number of elements"); + bool isOrderCorrect = toolsPathsList [0].Equals (Path.Combine (sdk, "cmdline-tools", latestToolsVersion), StringComparison.Ordinal) + && toolsPathsList [1].Equals (Path.Combine (sdk, "cmdline-tools", higherToolsVersion), StringComparison.Ordinal) + && toolsPathsList [2].Equals (Path.Combine (sdk, "cmdline-tools", toolsVersion), StringComparison.Ordinal) + && toolsPathsList [3].Equals (Path.Combine (sdk, "tools"), StringComparison.Ordinal); + + Assert.IsTrue (isOrderCorrect, "Tools order is not descending"); + } finally { + Directory.Delete (root, recursive: true); + } } static bool IsWindows => OS.IsWindows; From a960499f01e32100cd0613357ab21c135ef16c34 Mon Sep 17 00:00:00 2001 From: Dima Date: Thu, 30 Apr 2020 04:42:49 +0300 Subject: [PATCH 10/10] Remove more redundant code in AndroidSdkBase --- src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs index db1e671..b401fb6 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs @@ -41,9 +41,6 @@ public AndroidSdkBase (Action logger) public string AndroidPlatformToolsPathShort { get; private set; } 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"; @@ -92,7 +89,6 @@ public virtual void Initialize (string androidSdkPath = null, string androidNdkP // we need to look for extensions other than the default .exe|.bat // google have a habbit of changing them. Adb = GetExecutablePath (AndroidPlatformToolsPath, Adb); - Emulator = GetExecutablePath (Path.Combine (AndroidSdkPath, "emulator"), Emulator); NdkStack = GetExecutablePath (AndroidNdkPath, NdkStack); }