From a6d2c9da489198c04c1996707a9ce3a7cb5589f9 Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Tue, 9 May 2023 11:08:24 -0500 Subject: [PATCH 1/3] [Xamarin.Android.Tools.AndroidSdk] Fix NRT warnings. --- .../AndroidAppManifest.cs | 22 +++++++++++-------- .../AndroidSdkInfo.cs | 2 +- .../AndroidVersion.cs | 10 ++++----- .../JdkInfo.cs | 14 ++++++------ .../Jdks/JdkLocations.MacOS.cs | 4 ++++ .../Sdks/AndroidSdkUnix.cs | 18 ++++++++++++--- 6 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs b/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs index a8024c4..5ef7e13 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs @@ -31,16 +31,20 @@ public class AndroidAppManifest throw new ArgumentNullException (nameof (doc)); this.versions = versions; this.doc = doc; - manifest = doc.Root; - if (manifest.Name != "manifest") + + if (doc.Root is null || doc.Root.Name != "manifest") throw new ArgumentException ("App manifest does not have 'manifest' root element", nameof (doc)); - application = manifest.Element ("application"); - if (application == null) + manifest = doc.Root; + + if (manifest.Element ("application") is XElement app) + application = app; + else manifest.Add (application = new XElement ("application")); - usesSdk = manifest.Element ("uses-sdk"); - if (usesSdk == null) + if (manifest.Element ("uses-sdk") is XElement uses) + usesSdk = uses; + else manifest.Add (usesSdk = new XElement ("uses-sdk")); } @@ -185,7 +189,7 @@ public int? TargetSdkVersion { set { usesSdk.SetAttributeValue (aNS + "targetSdkVersion", value == null ? null : value.ToString ()); } } - int? ParseSdkVersion (XAttribute attribute) + int? ParseSdkVersion (XAttribute? attribute) { var version = (string?) attribute; if (version == null || string.IsNullOrEmpty (version)) @@ -247,9 +251,9 @@ void AddAndroidPermissions (IEnumerable permissions) lastPerm = el; } } else { - var parentNode = (XNode) manifest.Element ("application") ?? manifest.LastNode; + var parentNode = (XNode?) manifest.Element ("application") ?? manifest.LastNode; foreach (var el in newElements) - parentNode.AddBeforeSelf (el); + parentNode!.AddBeforeSelf (el); } } diff --git a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs index 0b9cf60..e0eedb6 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs @@ -193,7 +193,7 @@ public static void DetectAndSetPreferredJavaSdkPathToLatest (Action static AndroidVersion Load (XDocument doc) { - var id = (string) doc.Root.Element ("Id"); - var level = (int) doc.Root.Element ("Level"); - var name = (string) doc.Root.Element ("Name"); - var version = (string) doc.Root.Element ("Version"); - var stable = (bool) doc.Root.Element ("Stable"); + var id = (string?) doc.Root?.Element ("Id") ?? throw new InvalidOperationException ("Missing Id element"); + var level = (int?) doc.Root?.Element ("Level") ?? throw new InvalidOperationException ("Missing Level element"); + var name = (string?) doc.Root?.Element ("Name") ?? throw new InvalidOperationException ("Missing Name element"); + var version = (string?) doc.Root?.Element ("Version") ?? throw new InvalidOperationException ("Missing Version element"); + var stable = (bool?) doc.Root?.Element ("Stable") ?? throw new InvalidOperationException ("Missing Stable element"); return new AndroidVersion (level, version.TrimStart ('v'), name, id, stable); } diff --git a/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs b/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs index a6c8666..b7ade09 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs @@ -21,9 +21,9 @@ public class JdkInfo { public string? Locator {get;} - public string JarPath {get;} - public string JavaPath {get;} - public string JavacPath {get;} + public string? JarPath {get;} + public string? JavaPath {get;} + public string? JavacPath {get;} public string JdkJvmPath {get;} public ReadOnlyCollection IncludePath {get;} @@ -400,12 +400,12 @@ static IEnumerable GetLibexecJdkPaths (Action logger yield break; } foreach (var info in plist.Elements ("array").Elements ("dict")) { - var JVMHomePath = (XNode) info.Elements ("key").FirstOrDefault (e => e.Value == "JVMHomePath"); + var JVMHomePath = (XNode?) info.Elements ("key").FirstOrDefault (e => e.Value == "JVMHomePath"); if (JVMHomePath == null) continue; - while (JVMHomePath.NextNode.NodeType != XmlNodeType.Element) - JVMHomePath = JVMHomePath.NextNode; - var strElement = (XElement) JVMHomePath.NextNode; + while (JVMHomePath.NextNode!.NodeType != XmlNodeType.Element) + JVMHomePath = JVMHomePath.NextNode!; + var strElement = (XElement) JVMHomePath.NextNode!; var path = strElement.Value; yield return path; } diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Jdks/JdkLocations.MacOS.cs b/src/Xamarin.Android.Tools.AndroidSdk/Jdks/JdkLocations.MacOS.cs index 0559c9d..0edf1f4 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Jdks/JdkLocations.MacOS.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Jdks/JdkLocations.MacOS.cs @@ -20,6 +20,10 @@ static IEnumerable GetUnixPreferredJdks (Action log static IEnumerable GetUnixConfiguredJdkPaths (Action logger) { var config = AndroidSdkUnix.GetUnixConfigFile (logger); + + if (config.Root is null) + throw new InvalidOperationException ("Unix config file root is missing"); + foreach (var java_sdk in config.Root.Elements ("java-sdk")) { var path = (string?) java_sdk.Attribute ("path"); if (path != null && !string.IsNullOrEmpty (path)) { diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs index 82302a1..0d5fcf8 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs @@ -46,7 +46,7 @@ public override string NdkHostPlatform64Bit { public override string? PreferedAndroidSdkPath { get { var config_file = GetUnixConfigFile (Logger); - var androidEl = config_file.Root.Element ("android-sdk"); + var androidEl = config_file.Root?.Element ("android-sdk"); if (androidEl != null) { var path = (string?)androidEl.Attribute ("path"); @@ -61,7 +61,7 @@ public override string? PreferedAndroidSdkPath { public override string? PreferedAndroidNdkPath { get { var config_file = GetUnixConfigFile (Logger); - var androidEl = config_file.Root.Element ("android-ndk"); + var androidEl = config_file.Root?.Element ("android-ndk"); if (androidEl != null) { var path = (string?)androidEl.Attribute ("path"); @@ -76,7 +76,7 @@ public override string? PreferedAndroidNdkPath { public override string? PreferedJavaSdkPath { get { var config_file = GetUnixConfigFile (Logger); - var javaEl = config_file.Root.Element ("java-sdk"); + var javaEl = config_file.Root?.Element ("java-sdk"); if (javaEl != null) { var path = (string?)javaEl.Attribute ("path"); @@ -126,6 +126,10 @@ public override void SetPreferredAndroidSdkPath (string? path) path = NullIfEmpty (path); var doc = GetUnixConfigFile (Logger); + + if (doc.Root is null) + throw new InvalidOperationException ("Unix config file root is missing"); + var androidEl = doc.Root.Element ("android-sdk"); if (androidEl == null) { @@ -142,6 +146,10 @@ public override void SetPreferredJavaSdkPath (string? path) path = NullIfEmpty (path); var doc = GetUnixConfigFile (Logger); + + if (doc.Root is null) + throw new InvalidOperationException ("Unix config file root is missing"); + var javaEl = doc.Root.Element ("java-sdk"); if (javaEl == null) { @@ -158,6 +166,10 @@ public override void SetPreferredAndroidNdkPath (string? path) path = NullIfEmpty (path); var doc = GetUnixConfigFile (Logger); + + if (doc.Root is null) + throw new InvalidOperationException ("Unix config file root is missing"); + var androidEl = doc.Root.Element ("android-ndk"); if (androidEl == null) { From cff4ee6e15b21be0cf56bf2e57cfb1865e1ad82e Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Thu, 11 May 2023 13:39:42 -0500 Subject: [PATCH 2/3] Address review suggestion. --- .../JdkInfo.cs | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs b/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs index b7ade09..644ef90 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs @@ -21,9 +21,9 @@ public class JdkInfo { public string? Locator {get;} - public string? JarPath {get;} - public string? JavaPath {get;} - public string? JavacPath {get;} + public string JarPath {get;} + public string JavaPath {get;} + public string JavacPath {get;} public string JdkJvmPath {get;} public ReadOnlyCollection IncludePath {get;} @@ -61,18 +61,15 @@ public JdkInfo (string homePath, string? locator = null, Action (); var jdkInclude = Path.Combine (HomePath, "include"); @@ -153,12 +150,21 @@ static IEnumerable FindLibrariesInDirectory (string dir, string libraryN return Directory.EnumerateFiles (dir, library, SearchOption.AllDirectories); } - void ValidateFile (string name, string? path) + void ValidateFile (string name, [NotNull]string? path) { if (path == null || !File.Exists (path)) throw new ArgumentException ($"Could not find required file `{name}` within `{HomePath}`; is this a valid JDK?", "homePath"); } + string RequireExecutableInDirectory (string binPath, string fileName) + { + var file = ProcessUtils.FindExecutablesInDirectory (binPath, fileName).FirstOrDefault (); + + ValidateFile (fileName, file); + + return file; + } + static Regex NonDigitMatcher = new Regex (@"[^\d]", RegexOptions.Compiled | RegexOptions.CultureInvariant); Version? GetJavaVersion () From 5bec2153f7c6638c8d943d710a3defa999a3e3a7 Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Thu, 11 May 2023 14:43:17 -0500 Subject: [PATCH 3/3] Review fixes. --- .../Jdks/JdkLocations.MacOS.cs | 5 +-- .../Sdks/AndroidSdkUnix.cs | 33 +++++++------------ 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Jdks/JdkLocations.MacOS.cs b/src/Xamarin.Android.Tools.AndroidSdk/Jdks/JdkLocations.MacOS.cs index 0edf1f4..1aeb1fa 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Jdks/JdkLocations.MacOS.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Jdks/JdkLocations.MacOS.cs @@ -21,10 +21,7 @@ static IEnumerable GetUnixConfiguredJdkPaths (Action { var config = AndroidSdkUnix.GetUnixConfigFile (logger); - if (config.Root is null) - throw new InvalidOperationException ("Unix config file root is missing"); - - foreach (var java_sdk in config.Root.Elements ("java-sdk")) { + foreach (var java_sdk in config.Elements ("java-sdk")) { var path = (string?) java_sdk.Attribute ("path"); if (path != null && !string.IsNullOrEmpty (path)) { yield return path; diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs index 0d5fcf8..788c41e 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs @@ -46,7 +46,7 @@ public override string NdkHostPlatform64Bit { public override string? PreferedAndroidSdkPath { get { var config_file = GetUnixConfigFile (Logger); - var androidEl = config_file.Root?.Element ("android-sdk"); + var androidEl = config_file.Element ("android-sdk"); if (androidEl != null) { var path = (string?)androidEl.Attribute ("path"); @@ -61,7 +61,7 @@ public override string? PreferedAndroidSdkPath { public override string? PreferedAndroidNdkPath { get { var config_file = GetUnixConfigFile (Logger); - var androidEl = config_file.Root?.Element ("android-ndk"); + var androidEl = config_file.Element ("android-ndk"); if (androidEl != null) { var path = (string?)androidEl.Attribute ("path"); @@ -76,7 +76,7 @@ public override string? PreferedAndroidNdkPath { public override string? PreferedJavaSdkPath { get { var config_file = GetUnixConfigFile (Logger); - var javaEl = config_file.Root?.Element ("java-sdk"); + var javaEl = config_file.Element ("java-sdk"); if (javaEl != null) { var path = (string?)javaEl.Attribute ("path"); @@ -127,14 +127,11 @@ public override void SetPreferredAndroidSdkPath (string? path) var doc = GetUnixConfigFile (Logger); - if (doc.Root is null) - throw new InvalidOperationException ("Unix config file root is missing"); - - var androidEl = doc.Root.Element ("android-sdk"); + var androidEl = doc.Element ("android-sdk"); if (androidEl == null) { androidEl = new XElement ("android-sdk"); - doc.Root.Add (androidEl); + doc.Add (androidEl); } androidEl.SetAttributeValue ("path", path); @@ -147,14 +144,11 @@ public override void SetPreferredJavaSdkPath (string? path) var doc = GetUnixConfigFile (Logger); - if (doc.Root is null) - throw new InvalidOperationException ("Unix config file root is missing"); - - var javaEl = doc.Root.Element ("java-sdk"); + var javaEl = doc.Element ("java-sdk"); if (javaEl == null) { javaEl = new XElement ("java-sdk"); - doc.Root.Add (javaEl); + doc.Add (javaEl); } javaEl.SetAttributeValue ("path", path); @@ -167,21 +161,18 @@ public override void SetPreferredAndroidNdkPath (string? path) var doc = GetUnixConfigFile (Logger); - if (doc.Root is null) - throw new InvalidOperationException ("Unix config file root is missing"); - - var androidEl = doc.Root.Element ("android-ndk"); + var androidEl = doc.Element ("android-ndk"); if (androidEl == null) { androidEl = new XElement ("android-ndk"); - doc.Root.Add (androidEl); + doc.Add (androidEl); } androidEl.SetAttributeValue ("path", path); SaveConfig (doc); } - void SaveConfig (XDocument doc) + void SaveConfig (XElement doc) { string cfg = UnixConfigPath; List ? created = null; @@ -241,7 +232,7 @@ private static string UnixConfigPath { } } - internal static XDocument GetUnixConfigFile (Action logger) + internal static XElement GetUnixConfigFile (Action logger) { var file = UnixConfigPath; XDocument? doc = null; @@ -266,7 +257,7 @@ internal static XDocument GetUnixConfigFile (Action logger) if (doc == null || doc.Root == null) { doc = new XDocument (new XElement ("monodroid")); } - return doc; + return doc.Root!; } void FixOwnership (List? paths)