diff --git a/Makefile b/Makefile index 00901c3581a..86cf540d5bd 100644 --- a/Makefile +++ b/Makefile @@ -21,8 +21,15 @@ export MONO_OPTIONS endif include build-tools/scripts/msbuild.mk + +ifeq ($(USE_MSBUILD),1) +_SLN_BUILD = $(MSBUILD) +else # $(MSBUILD) != 1 +_SLN_BUILD = MSBUILD="$(MSBUILD)" tools/scripts/xabuild +endif # $(USE_MSBUILD) == 1 + all:: - $(MSBUILD) $(MSBUILD_FLAGS) $(SOLUTION) + $(_SLN_BUILD) $(MSBUILD_FLAGS) $(SOLUTION) all-tests:: MSBUILD="$(MSBUILD)" tools/scripts/xabuild $(MSBUILD_FLAGS) Xamarin.Android-Tests.sln diff --git a/src/Mono.Android/Mono.Android.projitems b/src/Mono.Android/Mono.Android.projitems new file mode 100644 index 00000000000..86480f66f28 --- /dev/null +++ b/src/Mono.Android/Mono.Android.projitems @@ -0,0 +1,137 @@ + + + + + Donut + 4 + 4 + True + + + Eclair + 5 + 5 + True + + + Eclair + 6 + 6 + True + + + Eclair + 7 + 7 + True + + + Froyo + 8 + 8 + True + + + Gingerbread + 10 + 10 + True + + + Honeycomb + 11 + 11 + True + + + Honeycomb + 12 + 12 + True + + + Honeycomb + 13 + 13 + True + + + Ice Cream Sandwich + 14 + 14 + True + + + Ice Cream Sandwich + 15 + 15 + True + + + Jelly Bean + 16 + 16 + True + + + Jelly Bean + 17 + 17 + True + + + Jelly Bean + 18 + 18 + True + + + Kit Kat + 19 + 19 + True + + + Kit Kat + Wear support + 20 + 20 + True + + + Lollipop + 21 + 21 + True + + + Lollipop + 22 + 22 + True + + + Marshmallow + 23 + 23 + True + + + Nougat + 24 + 24 + True + + + Nougat + 25 + 25 + True + + + Oreo + 26 + 26 + True + + + diff --git a/src/Mono.Android/Mono.Android.targets b/src/Mono.Android/Mono.Android.targets index 0093ce67c58..f298d08497b 100644 --- a/src/Mono.Android/Mono.Android.targets +++ b/src/Mono.Android/Mono.Android.targets @@ -2,6 +2,7 @@ + @@ -120,6 +121,30 @@ Overwrite="True" /> + + + + <_ApiInfo + Condition=" '%(Identity)' == '$(AndroidFrameworkVersion)' " + Include="@(AndroidApiInfo)" + /> + <_Line Include="<AndroidApiInfo>" /> + <_Line Include="@(_ApiInfo->' <Id>%(Id)</Id>')" /> + <_Line Include="@(_ApiInfo->' <Level>%(Level)</Level>')" /> + <_Line Include="@(_ApiInfo->' <Name>%(Name)</Name>')" /> + <_Line Include="@(_ApiInfo->' <Version>%(Identity)</Version>')" /> + <_Line Include="@(_ApiInfo->' <Stable>%(Stable)</Stable>')" /> + <_Line Include="</AndroidApiInfo>" /> + + + diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/CheckTargetFrameworks.cs b/src/Xamarin.Android.Build.Tasks/Tasks/CheckTargetFrameworks.cs index 974c4f22c7f..e542f350718 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/CheckTargetFrameworks.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/CheckTargetFrameworks.cs @@ -34,7 +34,7 @@ int ExtractApiLevel(DirectoryAssemblyResolver res, ITaskItem ass) var value = p.Value.ToString (); if (value.StartsWith ("MonoAndroid")) { var values = value.Split ('='); - return AndroidVersion.TryOSVersionToApiLevel (values[1]); + return MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (values [1]) ?? 0; } } break; @@ -61,9 +61,9 @@ public override bool Execute () } } - var mainapiLevel = AndroidVersion.TryOSVersionToApiLevel (TargetFrameworkVersion); + var mainapiLevel = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (TargetFrameworkVersion); foreach (var item in apiLevels.Where (x => mainapiLevel < x.Value)) { - var itemOSVersion = AndroidVersion.TryApiLevelToOSVersion (item.Value); + var itemOSVersion = MonoAndroidHelper.SupportedVersions.GetFrameworkVersionFromApiLevel (item.Value); Log.LogWarning (null, "XA0105", null, ProjectFile, 0, 0, 0, 0, "The $(TargetFrameworkVersion) for {0} (v{1}) is greater than the $(TargetFrameworkVersion) for your project ({2}). " + "You need to increase the $(TargetFrameworkVersion) for your project.", Path.GetFileName (item.Key.ItemSpec), itemOSVersion, TargetFrameworkVersion); diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs index 7455f075bc4..e621df79902 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs @@ -47,7 +47,7 @@ public override bool Execute () Log.LogDebugTaskItems (" ResolvedUserAssemblies:", ResolvedUserAssemblies); var shared_runtime = string.Compare (UseSharedRuntime, "true", true) == 0; - var doc = AndroidAppManifest.Load (Manifest); + var doc = AndroidAppManifest.Load (Manifest, MonoAndroidHelper.SupportedVersions); int minApiVersion = doc.MinSdkVersion == null ? 4 : (int) doc.MinSdkVersion; // We need to include any special assemblies in the Assemblies list var assemblies = ResolvedUserAssemblies.Select (p => p.ItemSpec) @@ -93,7 +93,7 @@ public override bool Execute () // Write the platform api apk we need pkgmgr.WriteLine ("\tpublic static final String ApiPackageName = {0};", shared_runtime ? string.Format ("\"Mono.Android.Platform.ApiLevel_{0}\"", - MonoDroidSdk.GetApiLevelForFrameworkVersion (TargetFrameworkVersion)) + MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (TargetFrameworkVersion)) : "null"); pkgmgr.WriteLine ("}"); } diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs index 84fc28b3c57..180bcb639b6 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GetJavaPlatformJar.cs @@ -70,7 +70,7 @@ public override bool Execute () } platform = GetTargetSdkVersion (platform, target_sdk); - JavaPlatformJarPath = Path.Combine (AndroidSdkDirectory, "platforms", "android-" + MonoAndroidHelper.GetPlatformApiLevelName (platform), "android.jar"); + JavaPlatformJarPath = Path.Combine (AndroidSdk.GetPlatformDirectoryFromApiLevel (platform, MonoAndroidHelper.SupportedVersions), "android.jar"); if (!File.Exists (JavaPlatformJarPath)) { Log.LogError ("Could not find android.jar for API Level {0}. " + @@ -92,8 +92,8 @@ public override bool Execute () string GetTargetSdkVersion (string target, XAttribute target_sdk) { - string targetFrameworkVersion = MonoAndroidHelper.GetPlatformApiLevel (AndroidSdkPlatform); - string targetSdkVersion = MonoAndroidHelper.GetPlatformApiLevel (target); + string targetFrameworkVersion = MonoAndroidHelper.SupportedVersions.GetIdFromApiLevel (AndroidSdkPlatform); + string targetSdkVersion = MonoAndroidHelper.SupportedVersions.GetIdFromApiLevel (target); int frameworkSdk, targetSdk; if (int.TryParse (targetFrameworkVersion, out frameworkSdk) && @@ -118,8 +118,8 @@ string GetTargetSdkVersion (string target, XAttribute target_sdk) message: "AndroidManifest.xml //uses-sdk/@android:targetSdkVersion '{0}' is less than $(TargetFrameworkVersion) '{1}'. Using API-{2} for ACW compilation.", messageArgs: new[]{ targetSdkVersion, - MonoDroidSdk.GetFrameworkVersionForApiLevel (targetFrameworkVersion), - MonoAndroidHelper.GetPlatformApiLevelName (targetFrameworkVersion), + MonoAndroidHelper.SupportedVersions.GetIdFromFrameworkVersion (targetFrameworkVersion), + MonoAndroidHelper.SupportedVersions.GetIdFromApiLevel (targetFrameworkVersion), } ); return targetFrameworkVersion; diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/JarToXml.cs b/src/Xamarin.Android.Build.Tasks/Tasks/JarToXml.cs index 495743d29a8..b58547e5218 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/JarToXml.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/JarToXml.cs @@ -58,7 +58,6 @@ public override bool Execute () Log.LogDebugMessage (" Java7DocPaths: {0}", Java7DocPaths); Log.LogDebugMessage (" Java8DocPaths: {0}", Java8DocPaths); Log.LogDebugTaskItems (" JavaDocs: {0}", JavaDocs); - Log.LogDebugMessage (" AndroidApiLevel: {0}", AndroidApiLevel); Log.LogDebugTaskItems (" LibraryProjectJars:", LibraryProjectJars); Log.LogDebugTaskItems (" SourceJars:", SourceJars); Log.LogDebugTaskItems (" ReferenceJars:", ReferenceJars); @@ -69,7 +68,7 @@ public override bool Execute () } // Ensure that the user has the platform they are targeting installed - var jarpath = Path.Combine (AndroidSdkDirectory, "platforms", "android-" + MonoAndroidHelper.GetPlatformApiLevelName (AndroidApiLevel), "android.jar"); + var jarpath = Path.Combine (AndroidSdk.GetPlatformDirectoryFromApiLevel (AndroidApiLevel, MonoAndroidHelper.SupportedVersions), "android.jar"); if (!File.Exists (jarpath)) { Log.LogError ("Could not find android.jar for API Level {0}. This means the Android SDK platform for API Level {0} is not installed. Either install it in the Android SDK Manager, or change your Android Bindings project to target an API version that is installed. ({1} missing.)", AndroidApiLevel, jarpath); @@ -128,7 +127,7 @@ protected override string GenerateCommandLineCommands () } // Arguments sent to jar2xml - var jarpath = Path.Combine (AndroidSdkDirectory, "platforms", "android-" + MonoAndroidHelper.GetPlatformApiLevelName (AndroidApiLevel), "android.jar"); + var jarpath = Path.Combine (AndroidSdk.GetPlatformDirectoryFromApiLevel (AndroidApiLevel, MonoAndroidHelper.SupportedVersions), "android.jar"); cmd.AppendSwitchIfNotNull ("--ref=", Path.GetFullPath (jarpath)); cmd.AppendSwitchIfNotNull ("--out=", Path.GetFullPath (OutputFile)); diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ReadResolvedSdksCache.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ReadResolvedSdksCache.cs index 718ac5453d8..f6485e88144 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ReadResolvedSdksCache.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ReadResolvedSdksCache.cs @@ -145,7 +145,7 @@ public bool RunTask () MonoAndroidHelper.TargetFrameworkDirectories = ReferenceAssemblyPaths; - MonoAndroidHelper.RefreshMonoDroidSdk (MonoAndroidToolsPath, MonoAndroidBinPath, ReferenceAssemblyPaths); + MonoAndroidHelper.RefreshSupportedVersions (ReferenceAssemblyPaths); MonoAndroidHelper.RefreshAndroidSdk (AndroidSdkPath, AndroidNdkPath, JavaSdkPath); return !Log.HasLoggedErrors; diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs index d41eb4d4daf..fb29d46ce12 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveSdksTask.cs @@ -148,7 +148,7 @@ public bool RunTask () } MonoAndroidBinPath = MonoAndroidHelper.GetOSBinPath () + Path.DirectorySeparatorChar; - MonoAndroidHelper.RefreshMonoDroidSdk (MonoAndroidToolsPath, null, ReferenceAssemblyPaths); + MonoAndroidHelper.RefreshSupportedVersions (ReferenceAssemblyPaths); MonoAndroidHelper.RefreshAndroidSdk (AndroidSdkPath, AndroidNdkPath, JavaSdkPath); this.AndroidNdkPath = AndroidSdk.AndroidNdkPath; @@ -237,8 +237,7 @@ public bool RunTask () if (!ValidateApiLevels ()) return false; - string frameworksPath = Path.GetDirectoryName (MonoDroidSdk.FrameworkPath); - if (!Directory.Exists (Path.Combine (frameworksPath, TargetFrameworkVersion))) { + if (!MonoAndroidHelper.SupportedVersions.FrameworkDirectories.Any (p => Directory.Exists (Path.Combine (p, TargetFrameworkVersion)))) { Log.LogError ( subcategory: string.Empty, errorCode: "XA0001", @@ -263,7 +262,7 @@ public bool RunTask () MonoAndroidHelper.TargetFrameworkDirectories = ReferenceAssemblyPaths; - AndroidApiLevelName = MonoAndroidHelper.GetPlatformApiLevelName (AndroidApiLevel); + AndroidApiLevelName = MonoAndroidHelper.SupportedVersions.GetIdFromApiLevel (AndroidApiLevel); Log.LogDebugMessage ("ResolveSdksTask Outputs:"); Log.LogDebugMessage (" AndroidApiLevel: {0}", AndroidApiLevel); @@ -317,7 +316,7 @@ public bool RunTask () Version GetJavaVersionForFramework (string targetFrameworkVersion) { - var apiLevel = AndroidVersion.TryOSVersionToApiLevel (targetFrameworkVersion); + var apiLevel = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (targetFrameworkVersion); if (apiLevel >= 24) return new Version (1, 8); else if (apiLevel == 23) @@ -418,7 +417,7 @@ bool ValidateApiLevels () if (!string.IsNullOrWhiteSpace (TargetFrameworkVersion)) { TargetFrameworkVersion = TargetFrameworkVersion.Trim (); - string apiLevel = MonoDroidSdk.GetApiLevelForFrameworkVersion (TargetFrameworkVersion); + string apiLevel = MonoAndroidHelper.SupportedVersions.GetIdFromFrameworkVersion (TargetFrameworkVersion); if (apiLevel == null) { Log.LogCodedError ("XA0000", "Could not determine API level for $(TargetFrameworkVersion) of '{0}'.", @@ -440,7 +439,7 @@ int GetMaxInstalledApiLevel () .Select (platformDir => Path.GetFileName (platformDir)) .Where (dir => dir.StartsWith ("android-", StringComparison.OrdinalIgnoreCase)) .Select (dir => dir.Substring ("android-".Length)) - .Select (apiName => MonoAndroidHelper.GetPlatformApiLevel (apiName)); + .Select (apiName => MonoAndroidHelper.SupportedVersions.GetIdFromApiLevel (apiName)); int maxApiLevel = int.MinValue; foreach (var level in apiLevels) { int v; @@ -465,7 +464,7 @@ string GetMaxSupportedApiLevel (string apiLevel) foreach (string versionedDir in ReferenceAssemblyPaths) { string parent = Path.GetDirectoryName (versionedDir.TrimEnd (Path.DirectorySeparatorChar)); for ( int l = level ; l > 0; l--) { - string tfv = MonoDroidSdk.GetFrameworkVersionForApiLevel (l.ToString ()); + string tfv = MonoAndroidHelper.SupportedVersions.GetFrameworkVersionFromApiLevel (l); if (tfv == null) continue; string dir = Path.Combine (parent, tfv); @@ -478,8 +477,8 @@ string GetMaxSupportedApiLevel (string apiLevel) string GetTargetFrameworkVersionFromApiLevel () { - string targetFramework = MonoDroidSdk.GetFrameworkVersionForApiLevel (SupportedApiLevel) ?? - MonoDroidSdk.GetFrameworkVersionForApiLevel (AndroidApiLevel); + string targetFramework = MonoAndroidHelper.SupportedVersions.GetFrameworkVersionFromId (SupportedApiLevel) ?? + MonoAndroidHelper.SupportedVersions.GetFrameworkVersionFromId (AndroidApiLevel); if (targetFramework != null) return targetFramework; Log.LogCodedError ("XA0000", diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs index b009cb91338..971a43f130f 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs @@ -128,7 +128,7 @@ public ManifestDocument (string templateFilename, TaskLoggingHelper log) : base } string SdkVersionName { - get { return MonoAndroidHelper.GetPlatformApiLevelName (SdkVersion); } + get { return MonoAndroidHelper.SupportedVersions.GetIdFromApiLevel (SdkVersion); } } string ToFullyQualifiedName (string typeName) @@ -265,9 +265,10 @@ public IList Merge (List subclasses, List select uses.AddBeforeSelf (new XComment ("suppress UsesMinSdkAttributes")); } - int targetSdkVersionValue; - if (!int.TryParse (MonoAndroidHelper.GetPlatformApiLevel (targetSdkVersion), out targetSdkVersionValue)) + int? tryTargetSdkVersion = MonoAndroidHelper.SupportedVersions.GetApiLevelFromId (targetSdkVersion); + if (!tryTargetSdkVersion.HasValue) throw new InvalidOperationException (string.Format ("The targetSdkVersion ({0}) is not a valid API level", targetSdkVersion)); + int targetSdkVersionValue = tryTargetSdkVersion.Value; foreach (var t in subclasses) { if (t.IsAbstract) diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs index 3793b77e161..73776cd7f53 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs @@ -26,6 +26,8 @@ public class MonoAndroidHelper // Set in ResolveSdks.Execute(); // Requires that ResolveSdks.Execute() run before anything else public static string[] TargetFrameworkDirectories; + public static AndroidVersions SupportedVersions; + readonly static byte[] Utf8Preamble = System.Text.Encoding.UTF8.GetPreamble (); public static int RunProcess (string name, string args, DataReceivedEventHandler onOutput, DataReceivedEventHandler onError) @@ -83,15 +85,9 @@ public static void RefreshAndroidSdk (string sdkPath, string ndkPath, string jav AndroidSdk.Refresh (sdkPath, ndkPath, javaPath); } - public static void RefreshMonoDroidSdk (string toolsPath, string binPath, string[] referenceAssemblyPaths) + public static void RefreshSupportedVersions (string[] referenceAssemblyPaths) { - MonoDroidSdk.Refresh (toolsPath, binPath, - (from refPath in referenceAssemblyPaths ?? new string [0] - where !string.IsNullOrEmpty (refPath) - let path = refPath.TrimEnd (Path.DirectorySeparatorChar) - where File.Exists (Path.Combine (path, "mscorlib.dll")) - select path) - .FirstOrDefault ()); + SupportedVersions = new AndroidVersions (referenceAssemblyPaths); } #endif // MSBUILD @@ -465,30 +461,6 @@ internal static IEnumerable GetFrameworkAssembliesToTreatAsUserAssemblie "Xamarin.Android.NUnitLite.dll", }; - // It used to replace "21" with "L" when it was preview, or "23" with "MNC" (ditto). - // We may have to use this in the future too. - public static string GetPlatformApiLevelName (string platformApiLevel) - { - switch (platformApiLevel.Trim ()) { - //case "26": - // return "O"; - default: - return platformApiLevel; - } - } - - // It used to replace "21" with "L" when it was preview, or "23" with "MNC" (ditto). - // We may have to use this in the future too. - public static string GetPlatformApiLevel (string platformApiLevelName) - { - switch (platformApiLevelName.Trim ()) { - //case "O": - // return "26"; - default: - return platformApiLevelName; - } - } - public static Dictionary LoadAcwMapFile (string acwPath) { var acw_map = new Dictionary (); diff --git a/src/Xamarin.Android.Build.Utilities/AndroidAppManifest.cs b/src/Xamarin.Android.Build.Utilities/AndroidAppManifest.cs index d7afc4cabe6..86be7c12634 100644 --- a/src/Xamarin.Android.Build.Utilities/AndroidAppManifest.cs +++ b/src/Xamarin.Android.Build.Utilities/AndroidAppManifest.cs @@ -11,14 +11,20 @@ namespace Xamarin.Android.Build.Utilities { public class AndroidAppManifest { + AndroidVersions versions; XDocument doc; XElement manifest, application, usesSdk; static readonly XNamespace aNS = "http://schemas.android.com/apk/res/android"; static readonly XName aName = aNS + "name"; - AndroidAppManifest (XDocument doc) + AndroidAppManifest (AndroidVersions versions, XDocument doc) { + if (versions == null) + throw new ArgumentNullException (nameof (versions)); + if (doc == null) + throw new ArgumentNullException (nameof (doc)); + this.versions = versions; this.doc = doc; manifest = doc.Root; if (manifest.Name != "manifest") @@ -51,9 +57,9 @@ public static string CanonicalizePackageName (string packageNameOrAssemblyName) : string.Join (".", packageParts); } - public static AndroidAppManifest Create (string packageName, string appLabel) + public static AndroidAppManifest Create (string packageName, string appLabel, AndroidVersions versions) { - return new AndroidAppManifest (XDocument.Parse ( + return new AndroidAppManifest (versions, XDocument.Parse ( @" @@ -65,14 +71,14 @@ public static AndroidAppManifest Create (string packageName, string appLabel) }; } - public static AndroidAppManifest Load (string filename) + public static AndroidAppManifest Load (string filename, AndroidVersions versions) { - return Load (XDocument.Load (filename)); + return Load (XDocument.Load (filename), versions); } - public static AndroidAppManifest Load (XDocument doc) + public static AndroidAppManifest Load (XDocument doc, AndroidVersions versions) { - return new AndroidAppManifest (doc); + return new AndroidAppManifest (versions, doc); } public void Write (XmlWriter writer) @@ -165,8 +171,12 @@ public int? TargetSdkVersion { if (string.IsNullOrEmpty (version)) return null; int vn; - if (!int.TryParse (version, out vn)) - vn = AndroidVersion.MaxApiLevel; + if (!int.TryParse (version, out vn)) { + int? apiLevel = versions.GetApiLevelFromId (version); + if (apiLevel.HasValue) + return apiLevel.Value; + return versions.MaxStableVersion.ApiLevel; + } return vn; } diff --git a/src/Xamarin.Android.Build.Utilities/AndroidSdk.cs b/src/Xamarin.Android.Build.Utilities/AndroidSdk.cs index 11b81559af5..22f8edc266d 100644 --- a/src/Xamarin.Android.Build.Utilities/AndroidSdk.cs +++ b/src/Xamarin.Android.Build.Utilities/AndroidSdk.cs @@ -20,13 +20,7 @@ public static void Refresh (string androidSdkPath = null, string androidNdkPath 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); + AndroidLogger.LogInfo (null, "Found Android SDK."); } else { AndroidLogger.LogInfo (null, "Did not find Android SDK"); } @@ -80,13 +74,6 @@ static Version TryParseVersion (string v) return null; } - // it was useful when android-21 was android-L, or android-23 was android-MNC. - // We will use this when similar preview release is out. - static string ToApiName (int apiLevel) - { - return apiLevel.ToString (); - } - static string ValidatePath (string path) { if (String.IsNullOrEmpty (path)) @@ -96,30 +83,33 @@ static string ValidatePath (string path) public static string GetPlatformDirectory (int apiLevel) { - return Path.Combine (AndroidSdkPath, "platforms", "android-" + ToApiName (apiLevel)); + return GetPlatformDirectoryFromId (apiLevel.ToString ()); } - public static string GetPlatformDirectory (string osVersion) + public static string GetPlatformDirectoryFromId (string id) { - var level = AndroidVersion.TryOSVersionToApiLevel (osVersion); - if (level == 0) - return null; - return GetPlatformDirectory (level); + return Path.Combine (AndroidSdkPath, "platforms", "android-" + id); } - public static bool IsPlatformInstalled (int apiLevel) + public static string GetPlatformDirectoryFromApiLevel (string apiLevel, AndroidVersions versions) { - return apiLevel != 0 && Directory.Exists (GetPlatformDirectory (apiLevel)); + var id = versions.GetIdFromApiLevel (apiLevel); + var dir = GetPlatformDirectoryFromId (id); + + if (Directory.Exists (dir)) + return dir; + + var level = versions.GetApiLevelFromId (id); + dir = level.HasValue ? GetPlatformDirectory (level.Value) : null; + if (dir != null && Directory.Exists (dir)) + return dir; + + return null; } - public static IEnumerable GetInstalledPlatformVersions () + public static bool IsPlatformInstalled (int apiLevel) { - var knownAndInstalledSdkLevels = AndroidVersion.KnownVersions.Where (v => IsPlatformInstalled (v.ApiLevel)); - - return knownAndInstalledSdkLevels.Where (version => { - var apiLevel = MonoDroidSdk.GetApiLevelForFrameworkVersion (version.OSVersion); - return MonoDroidSdk.IsSupportedFrameworkLevel (apiLevel); - }); + return apiLevel != 0 && Directory.Exists (GetPlatformDirectory (apiLevel)); } public static bool IsInstalled { diff --git a/src/Xamarin.Android.Build.Utilities/AndroidVersion.cs b/src/Xamarin.Android.Build.Utilities/AndroidVersion.cs index 99d000cd9f9..9efaaf8c0bc 100644 --- a/src/Xamarin.Android.Build.Utilities/AndroidVersion.cs +++ b/src/Xamarin.Android.Build.Utilities/AndroidVersion.cs @@ -4,107 +4,38 @@ namespace Xamarin.Android.Build.Utilities { public class AndroidVersion { - public static readonly int MaxApiLevel = 25; - public AndroidVersion (int apilevel, string osVersion) { this.ApiLevel = apilevel; this.OSVersion = osVersion; } - AndroidVersion (int apilevel, string osVersion, string codeName, Version version) + internal AndroidVersion (int apilevel, string osVersion, string codeName, Version version, string frameworkVersion = null, bool stable = true) { this.ApiLevel = apilevel; + this.Id = apilevel.ToString (); // TODO: remove osVersion from parameter list and generate from version this.OSVersion = osVersion; this.CodeName = codeName; this.Version = version; + this.FrameworkVersion = frameworkVersion; + this.Stable = stable; } public int ApiLevel { get; private set; } public string OSVersion { get; private set; } public string CodeName { get; private set; } public Version Version { get; private set; } + public string FrameworkVersion { get; private set; } + public string Id { get; internal set; } + public bool Stable { get; private set; } - public static int OSVersionToApiLevel (string osVersion) - { - int ret = TryOSVersionToApiLevel (osVersion); - if (ret == 0) - throw new ArgumentOutOfRangeException ("OS version not recognized: " + osVersion); - return ret; - } - - public static int TryOSVersionToApiLevel (string frameworkVersion) - { - // Use MonoDroidSdk.GetApiLevelForFrameworkVersion because that will translate XA versions >= 5.xx to the correct api level - var apiLevelText = MonoDroidSdk.GetApiLevelForFrameworkVersion (frameworkVersion); - int apiLevel; - int.TryParse (apiLevelText, out apiLevel); - return apiLevel; - } - - public static string ApiLevelToOSVersion (int apiLevel) - { - string ret = TryApiLevelToOSVersion (apiLevel); - if (ret == null) - throw new ArgumentOutOfRangeException ("API level not recognized: " + apiLevel); - return ret; - } - - public static string TryApiLevelToOSVersion (int apiLevel) - { - var osVersion = MonoDroidSdk.GetFrameworkVersionForApiLevel (apiLevel.ToString ()); - if (!string.IsNullOrEmpty (osVersion)) - return osVersion.TrimStart ('v'); - return null; - } + internal string[] AlternateIds { get; set; } - public static string TryOSVersionToCodeName (string frameworkVersion) + public override string ToString () { - // match on API level, the framework version might not match what we have here (>= XA 5.x uses a different version scheme) - var apiLevel = TryOSVersionToApiLevel (frameworkVersion); - - foreach (AndroidVersion version in KnownVersions) - if (version.ApiLevel == apiLevel) - return version.CodeName; - return null; + return $"(AndroidVersion: ApiLevel={ApiLevel} OSVersion={OSVersion} CodeName='{CodeName}' Version={Version} FrameworkVersion={FrameworkVersion} Id={Id} Stable={Stable})"; } - - public static string TryFrameworkVersionToOSVersion (string frameworkVersion) - { - // match on API level, the framework version might not match what we have here (>= XA 5.x uses a different version scheme) - var apiLevel = TryOSVersionToApiLevel (frameworkVersion); - - foreach (AndroidVersion version in KnownVersions) - if (version.ApiLevel == apiLevel) - return version.OSVersion; - return null; - } - - public static AndroidVersion[] KnownVersions = new[] { - new AndroidVersion (4, "1.6", "Donut", new Version (1, 6)), - new AndroidVersion (5, "2.0", "Eclair", new Version (2, 0)), - new AndroidVersion (6, "2.0.1", "Eclair", new Version (2, 0, 1)), - new AndroidVersion (7, "2.1", "Eclair", new Version (2, 1)), - new AndroidVersion (8, "2.2", "Froyo", new Version (2, 2)), - new AndroidVersion (10, "2.3", "Gingerbread", new Version (2, 3)), - new AndroidVersion (11, "3.0", "Honeycomb", new Version (3, 0)), - new AndroidVersion (12, "3.1", "Honeycomb", new Version (3, 1)), - new AndroidVersion (13, "3.2", "Honeycomb", new Version (3, 2)), - new AndroidVersion (14, "4.0", "Ice Cream Sandwich", new Version (4, 0)), - new AndroidVersion (15, "4.0.3", "Ice Cream Sandwich", new Version (4, 0, 3)), - new AndroidVersion (16, "4.1", "Jelly Bean", new Version (4, 1)), - new AndroidVersion (17, "4.2", "Jelly Bean", new Version (4, 2)), - new AndroidVersion (18, "4.3", "Jelly Bean", new Version (4, 3)), - new AndroidVersion (19, "4.4", "Kit Kat", new Version (4, 4)), - new AndroidVersion (20, "4.4.87", "Kit Kat + Wear support", new Version (4, 4, 87)), - new AndroidVersion (21, "5.0", "Lollipop", new Version (5, 0)), - new AndroidVersion (22, "5.1", "Lollipop", new Version (5, 1)), - new AndroidVersion (23, "6.0", "Marshmallow", new Version (6, 0)), - new AndroidVersion (24, "7.0", "Nougat", new Version (7, 0)), - new AndroidVersion (25, "7.1", "Nougat", new Version (7, 1)), - new AndroidVersion (26, "8.0", "Oreo", new Version (8, 0)) - }; } } diff --git a/src/Xamarin.Android.Build.Utilities/AndroidVersions.cs b/src/Xamarin.Android.Build.Utilities/AndroidVersions.cs new file mode 100644 index 00000000000..4d33a010028 --- /dev/null +++ b/src/Xamarin.Android.Build.Utilities/AndroidVersions.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Xml.Linq; + +namespace Xamarin.Android.Build.Utilities +{ + public class AndroidVersions + { + List installedVersions = new List (); + + public IReadOnlyList FrameworkDirectories { get; } + public AndroidVersion MaxStableVersion { get; private set; } + + public AndroidVersions (IEnumerable frameworkDirectories) + { + if (frameworkDirectories == null) + throw new ArgumentNullException (nameof (frameworkDirectories)); + + var dirs = new List (); + + foreach (var d in frameworkDirectories) { + if (!Directory.Exists (d)) + throw new ArgumentException ($"`{d}` must be a directory!", nameof (frameworkDirectories)); + + var dp = d.TrimEnd (Path.DirectorySeparatorChar); + var dn = Path.GetFileName (dp); + // In "normal" use, `dp` will contain e.g. `...\MonoAndroid\v1.0`. + // We want the `MonoAndroid` dir, not the versioned dir. + var p = dn.StartsWith ("v", StringComparison.Ordinal) ? Path.GetDirectoryName (dp) : dp; + dirs.Add (Path.GetFullPath (p)); + } + + dirs = dirs.Distinct (StringComparer.OrdinalIgnoreCase) + .ToList (); + + FrameworkDirectories = new ReadOnlyCollection (dirs); + + ReadAndroidVersions (); + + AndroidLogger.LogInfo (null, "Xamarin.Android Supported $(TargetFrameworkVersion)s: {0}", string.Join (", ", installedVersions)); + } + + void ReadAndroidVersions () + { + foreach (var frameworkDirectory in FrameworkDirectories) { + foreach (var file in Directory.EnumerateFiles (frameworkDirectory, "AndroidApiInfo.xml", SearchOption.AllDirectories)) { + try { + var v = ToAndroidVersion (file); + installedVersions.Add (v); + if (MaxStableVersion == null || (v.Stable && MaxStableVersion.Version < v.Version)) { + MaxStableVersion = v; + } + } + catch (Exception e) { + AndroidLogger.LogError (message: $"Could not create AndroidVersion information for `{file}`.", ex: e); + } + } + } + } + + AndroidVersion ToAndroidVersion (string file) + { + var info = XDocument.Load (file); + var id = (string) info.Root.Element ("Id"); + var level = (int) info.Root.Element ("Level"); + var name = (string) info.Root.Element ("Name"); + var version = (string) info.Root.Element ("Version"); + var stable = (bool) info.Root.Element ("Stable"); + var pver = version.TrimStart ('v'); + var v = new AndroidVersion (level, pver, name, Version.Parse (pver), version, stable) { + Id = id, + }; + return v; + } + + public int? GetApiLevelFromFrameworkVersion (string frameworkVersion) + { + return installedVersions.FirstOrDefault (v => v.FrameworkVersion == frameworkVersion)?.ApiLevel ?? + KnownVersions.FirstOrDefault (v => v.FrameworkVersion == frameworkVersion)?.ApiLevel; + } + + public int? GetApiLevelFromId (string id) + { + return installedVersions.FirstOrDefault (v => MatchesId (v, id))?.ApiLevel ?? + KnownVersions.FirstOrDefault (v => MatchesId (v, id))?.ApiLevel; + } + + static bool MatchesId (AndroidVersion version, string id) + { + return version.Id == id || + (version.AlternateIds?.Contains (id) ?? false) || + (version.ApiLevel.ToString () == id); + } + + public string GetIdFromApiLevel (int apiLevel) + { + return installedVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.Id ?? + KnownVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.Id; + } + + // Sometimes, e.g. when new API levels are introduced, the "API level" is a letter, not a number, + // e.g. 'API-H' for API-11, 'API-O' for API-26, etc. + public string GetIdFromApiLevel (string apiLevel) + { + if (int.TryParse (apiLevel, out var platform)) + return GetIdFromApiLevel (platform); + return installedVersions.FirstOrDefault (v => MatchesId (v, apiLevel))?.Id ?? + KnownVersions.FirstOrDefault (v => MatchesId (v, apiLevel))?.Id; + } + + public string GetIdFromFrameworkVersion (string frameworkVersion) + { + return installedVersions.FirstOrDefault (v => v.FrameworkVersion == frameworkVersion)?.Id ?? + KnownVersions.FirstOrDefault (v => v.FrameworkVersion == frameworkVersion)?.Id; + } + + public string GetFrameworkVersionFromApiLevel (int apiLevel) + { + return installedVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.FrameworkVersion ?? + KnownVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.FrameworkVersion; + } + + public string GetFrameworkVersionFromId (string id) + { + return installedVersions.FirstOrDefault (v => MatchesId (v, id))?.FrameworkVersion ?? + KnownVersions.FirstOrDefault (v => MatchesId (v, id))?.FrameworkVersion; + } + + static readonly AndroidVersion [] KnownVersions = new [] { + new AndroidVersion (4, "1.6", "Donut", new Version (1, 6)), + new AndroidVersion (5, "2.0", "Eclair", new Version (2, 0)), + new AndroidVersion (6, "2.0.1", "Eclair", new Version (2, 0, 1)), + new AndroidVersion (7, "2.1", "Eclair", new Version (2, 1)), + new AndroidVersion (8, "2.2", "Froyo", new Version (2, 2)), + new AndroidVersion (10, "2.3", "Gingerbread", new Version (2, 3)), + new AndroidVersion (11, "3.0", "Honeycomb", new Version (3, 0)) { + AlternateIds = new[]{ "H" }, + }, + new AndroidVersion (12, "3.1", "Honeycomb", new Version (3, 1)), + new AndroidVersion (13, "3.2", "Honeycomb", new Version (3, 2)), + new AndroidVersion (14, "4.0", "Ice Cream Sandwich", new Version (4, 0)), + new AndroidVersion (15, "4.0.3", "Ice Cream Sandwich", new Version (4, 0, 3)), + new AndroidVersion (16, "4.1", "Jelly Bean", new Version (4, 1)), + new AndroidVersion (17, "4.2", "Jelly Bean", new Version (4, 2)), + new AndroidVersion (18, "4.3", "Jelly Bean", new Version (4, 3)), + new AndroidVersion (19, "4.4", "Kit Kat", new Version (4, 4)), + new AndroidVersion (20, "4.4.87", "Kit Kat + Wear support", new Version (4, 4, 87)), + new AndroidVersion (21, "5.0", "Lollipop", new Version (5, 0)) { + AlternateIds = new[]{ "L" }, + }, + new AndroidVersion (22, "5.1", "Lollipop", new Version (5, 1)), + new AndroidVersion (23, "6.0", "Marshmallow", new Version (6, 0)) { + AlternateIds = new[]{ "M" }, + }, + new AndroidVersion (24, "7.0", "Nougat", new Version (7, 0)) { + AlternateIds = new[]{ "N" }, + }, + new AndroidVersion (25, "7.1", "Nougat", new Version (7, 1)), + new AndroidVersion (26, "8.0", "Oreo", new Version (8, 0)) { + AlternateIds = new[]{ "O" }, + }, + }; + } + + class EqualityComparer : IEqualityComparer + { + Func equals; + Func getHashCode; + + public EqualityComparer (Func equals, Func getHashCode = null) + { + this.equals = equals; + this.getHashCode = getHashCode ?? (v => v.GetHashCode ()); + } + + public bool Equals (T x, T y) + { + return equals (x, y); + } + + public int GetHashCode (T obj) + { + return getHashCode (obj); + } + } +} diff --git a/src/Xamarin.Android.Build.Utilities/MonoDroidSdk.cs b/src/Xamarin.Android.Build.Utilities/MonoDroidSdk.cs deleted file mode 100644 index 9ea105620dd..00000000000 --- a/src/Xamarin.Android.Build.Utilities/MonoDroidSdk.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.IO; - -namespace Xamarin.Android.Build.Utilities -{ - public static class MonoDroidSdk - { - static MonoDroidSdkBase sdk; - - public static string GetApiLevelForFrameworkVersion (string framework) - { - return GetSdk ().GetApiLevelForFrameworkVersion (framework); - } - - public static string GetFrameworkVersionForApiLevel (string apiLevel) - { - return GetSdk ().GetFrameworkVersionForApiLevel (apiLevel); - } - - public static bool IsSupportedFrameworkLevel (string apiLevel) - { - return GetSdk ().IsSupportedFrameworkLevel (apiLevel); - } - - public static void Refresh (string runtimePath = null, string binPath = null, string bclPath = null) - { - if (OS.IsWindows) { - sdk = new MonoDroidSdkWindows (); - } else { - sdk = new MonoDroidSdkUnix (); - } - - try { - sdk.Initialize (runtimePath, binPath, bclPath); - } catch (Exception ex) { - AndroidLogger.LogError ("Error finding Xamarin.Android SDK", ex); - } - } - - static MonoDroidSdkBase GetSdk () - { - if (sdk == null) { - Refresh (); - } - return sdk; - } - - public static string FrameworkPath { get { return GetSdk ().BclPath; } } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/MonoDroidSdkBase.cs b/src/Xamarin.Android.Build.Utilities/Sdks/MonoDroidSdkBase.cs deleted file mode 100644 index 5f21ebbbf4b..00000000000 --- a/src/Xamarin.Android.Build.Utilities/Sdks/MonoDroidSdkBase.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System; -using System.Linq; -using System.IO; -using System.Collections.Generic; -using System.Xml; - -namespace Xamarin.Android.Build.Utilities -{ - abstract class MonoDroidSdkBase - { - protected readonly static string ClassParseExe = "class-parse.exe"; - - // Root directory for XA libraries, contains designer dependencies - public string LibrariesPath { get; private set; } - - // Contains mscorlib.dll - public string BclPath { get; private set; } - - // expectedRuntimePath: contains class-parse.exe - // binPath: ignored; present for compatibility - // bclPath: contains mscorlib.dll - public void Initialize (string expectedRuntimePath = null, string binPath = null, string bclPath = null) - { - var runtimePath = GetValidPath ("MonoAndroidToolsPath", expectedRuntimePath, ValidateRuntime, () => FindRuntime ()) - ?? Path.GetFullPath (Path.GetDirectoryName (GetType ().Assembly.Location)); - bclPath = GetValidPath ("mscorlib.dll", bclPath, ValidateFramework, () => FindFramework (runtimePath)); - - if (runtimePath == null || bclPath == null) { - Reset (); - return; - } - - BclPath = bclPath; - LibrariesPath = FindLibraries (runtimePath); - - FindSupportedFrameworks (); - } - - static string GetValidPath (string description, string path, Func validator, Func defaultPath) - { - if (!string.IsNullOrEmpty (path)) { - if (Directory.Exists (path)) { - if (validator (path)) - return path; - AndroidLogger.LogWarning (null, "{0} path '{1}' is explicitly specified, but it was not valid; skipping.", description, path); - } else - AndroidLogger.LogWarning (null, "{0} path '{1}' is explicitly specified, but it was not found; skipping.", description, path); - } - path = defaultPath (); - if (path != null && validator (path)) - return path; - if (path != null) - AndroidLogger.LogWarning (null, "{0} path is defaulted to '{1}', but it was not valid; skipping", description, path); - else - AndroidLogger.LogWarning (null, "{0} path is not found and no default location is provided; skipping", description); - return null; - } - - public void Reset () - { - #pragma warning disable 0618 - BclPath = LibrariesPath = null; - #pragma warning restore 0618 - } - - protected virtual string FindRuntime () - { - string monoAndroidPath = Environment.GetEnvironmentVariable ("MONO_ANDROID_PATH"); - if (!string.IsNullOrEmpty (monoAndroidPath)) { - string msbuildDir = Path.Combine (monoAndroidPath, "lib", "xamarin.android", "xbuild", "Xamarin", "Android"); - if (Directory.Exists (msbuildDir)) { - if (ValidateRuntime (msbuildDir)) - return msbuildDir; - AndroidLogger.LogInfo (null, $"MONO_ANDROID_PATH points to {monoAndroidPath}, but `{msbuildDir}{Path.DirectorySeparatorChar}class-parse.exe` does not exist."); - } - else - AndroidLogger.LogInfo (null, $"MONO_ANDROID_PATH points to {monoAndroidPath}, but it does not exist."); - } - return null; - } - - protected abstract string FindFramework (string runtimePath); - - protected static bool ValidateRuntime (string loc) - { - return !string.IsNullOrWhiteSpace (loc) && - File.Exists (Path.Combine (loc, ClassParseExe)); - } - - protected static bool ValidateFramework (string loc) - { - return loc != null && File.Exists (Path.Combine (loc, "mscorlib.dll")); - } - - protected abstract string FindLibraries (string runtimePath); - - internal static Version ToVersion (string frameworkDir) - { - string version = Path.GetFileName (frameworkDir); - if (!version.StartsWith ("v", StringComparison.OrdinalIgnoreCase)) { - // wat? - return new Version (); - } - version = version.Substring (1); - Version v; - if (Version.TryParse (version, out v)) - return v; - return new Version (); - } - - void FindSupportedFrameworks () - { - string bclDir = MonoDroidSdk.FrameworkPath; - string frameworksDir = Path.GetDirectoryName (bclDir); - foreach (var framework in Directory.EnumerateDirectories (frameworksDir).Select (ToVersion)) { - if (framework.Major == 0) - continue; - string apiLevel; - if (FrameworkToApiLevels.TryGetValue (framework, out apiLevel)) - SupportedFrameworks.Add (framework, apiLevel); - } - } - - readonly Dictionary SupportedFrameworks = new Dictionary (); - - static readonly Dictionary FrameworkToApiLevels = new Dictionary (AndroidVersion.KnownVersions.ToDictionary (k => k.Version, v => v.ApiLevel.ToString ())); - static readonly Dictionary LegacyFrameworkToApiLevels = new Dictionary { - { new Version (4, 5), "21" } // L Preview - }; - - public IEnumerable GetSupportedApiLevels () - { - return SupportedFrameworks.Select (e => e.Value); - } - - public string GetApiLevelForFrameworkVersion (string framework) - { - Version v; - if (!Version.TryParse (framework.TrimStart ('v'), out v)) - return null; - string apiLevel; - if (SupportedFrameworks.TryGetValue (v, out apiLevel) - || FrameworkToApiLevels.TryGetValue (v, out apiLevel) - || LegacyFrameworkToApiLevels.TryGetValue (v, out apiLevel)) - return apiLevel; - return null; - } - - public string GetFrameworkVersionForApiLevel (string apiLevel) - { - // API level 9 was discontinued immediately for 10, in the rare case we get it just upgrade the number - if (apiLevel == "9") - apiLevel = "10"; - var maxFrameworkVersion = SupportedFrameworks.Concat (FrameworkToApiLevels) - .Where (e => e.Value == apiLevel) - .OrderByDescending (e => e.Key, Comparer.Default) - .Select (e => e.Key) - .FirstOrDefault (); - if (maxFrameworkVersion != null) - return "v" + maxFrameworkVersion; - return null; - } - - /// - /// Determines if the given apiLevel is supported by an installed Framework - /// - public bool IsSupportedFrameworkLevel (string apiLevel) - { - return SupportedFrameworks.Any ((sf => sf.Value == apiLevel)); - } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/MonoDroidSdkUnix.cs b/src/Xamarin.Android.Build.Utilities/Sdks/MonoDroidSdkUnix.cs deleted file mode 100644 index 46c6e48a3ba..00000000000 --- a/src/Xamarin.Android.Build.Utilities/Sdks/MonoDroidSdkUnix.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Collections.Generic; - -namespace Xamarin.Android.Build.Utilities -{ - class MonoDroidSdkUnix : MonoDroidSdkBase - { - readonly static string[] RuntimeToFrameworkPaths = new[]{ - // runtimePath=$prefix/lib/xamarin.android/xbuild/Xamarin/Android/ - Path.Combine ("..", "..", "..", "xbuild-frameworks", "MonoAndroid"), - Path.Combine ("..", "..", "..", ".xamarin.android", "lib", "xbuild-frameworks", "MonoAndroid"), - Path.Combine ("..", "xbuild-frameworks", "MonoAndroid"), - Path.Combine ("..", "mono", "2.1"), - }; - - readonly static string[] SearchPaths = { - "/Library/Frameworks/Xamarin.Android.framework/Versions/Current/lib/xamarin.android/xbuild/Xamarin/Android", - "/Library/Frameworks/Xamarin.Android.framework/Versions/Current/lib/mandroid", - "/Developer/MonoAndroid/usr/lib/mandroid", - "/app/lib/mandroid", - "/app/lib/xamarin.android/xbuild/Xamarin/Android", - "/opt/mono-android/lib/mandroid", - "/opt/mono-android/lib/xamarin.android/xbuild/Xamarin/Android", - }; - - protected override string FindRuntime () - { - string monoAndroidPath = Environment.GetEnvironmentVariable ("MONO_ANDROID_PATH"); - if (!string.IsNullOrEmpty (monoAndroidPath)) { - string msbuildDir = Path.Combine (monoAndroidPath, "lib", "xamarin.android", "xbuild", "Xamarin", "Android"); - if (Directory.Exists (msbuildDir)) { - if (ValidateRuntime (msbuildDir)) - return msbuildDir; - 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 [] { - Path.GetFullPath (Path.GetDirectoryName (GetType ().Assembly.Location)), - Path.Combine (personal, @".xamarin.android/lib/xamarin.android/xbuild/Xamarin/Android") - }; - - return additionalSearchPaths.Concat (SearchPaths).FirstOrDefault (ValidateRuntime); - } - - protected override string FindFramework (string runtimePath) - { - foreach (var relativePath in RuntimeToFrameworkPaths) { - var fullPath = Path.GetFullPath (Path.Combine (runtimePath, relativePath)); - if (Directory.Exists (fullPath)) { - if (ValidateFramework (fullPath)) - return fullPath; - - // check to see if full path is the folder that contains each framework version, eg contains folders of the form v1.0, v2.3 etc - var subdirs = Directory.GetDirectories (fullPath, "v*").OrderBy (x => x).ToArray (); - foreach (var subdir in subdirs) { - if (ValidateFramework (subdir)) - return subdir; - } - } - } - - return null; - } - - protected override string FindLibraries (string runtimePath) - { - return Path.GetFullPath (Path.Combine (runtimePath, "..")); - } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/Sdks/MonoDroidSdkWindows.cs b/src/Xamarin.Android.Build.Utilities/Sdks/MonoDroidSdkWindows.cs deleted file mode 100644 index 1e5b041a55c..00000000000 --- a/src/Xamarin.Android.Build.Utilities/Sdks/MonoDroidSdkWindows.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.IO; -using System.Collections.Generic; -using System.Linq; - -namespace Xamarin.Android.Build.Utilities -{ - class MonoDroidSdkWindows : MonoDroidSdkBase - { - protected override string FindRuntime () - { - var r = base.FindRuntime (); - if (r != null) - return r; - var paths = new []{ - Path.GetFullPath (Path.GetDirectoryName (GetType ().Assembly.Location)), - Path.Combine (OS.ProgramFilesX86, "MSBuild", "Xamarin", "Android"), - Path.Combine (OS.ProgramFilesX86, "MSBuild", "Novell"), - }; - return paths.FirstOrDefault (p => ValidateRuntime (p)); - } - - static readonly string[] RuntimeToFrameworkPaths = new []{ - // runtimePath=$prefix/lib/xamarin.android/xbuild/Xamarin/Android/ - Path.Combine ("..", "..", "..", "xbuild-frameworks", "MonoAndroid"), - Path.Combine ("..", "..", "..", "Common7", "IDE", "ReferenceAssemblies", "Microsoft", "Framework","MonoAndroid"), - Path.Combine ("..", "..", "..", "Reference Assemblies", "Microsoft", "Framework", "MonoAndroid"), - Path.Combine (OS.ProgramFilesX86, "Reference Assemblies", "Microsoft", "Framework", "MonoAndroid"), - }; - - protected override string FindFramework (string runtimePath) - { - foreach (var relativePath in RuntimeToFrameworkPaths) { - var fullPath = Path.GetFullPath (Path.Combine (runtimePath, relativePath)); - if (Directory.Exists (fullPath)) { - if (ValidateFramework (fullPath)) - return fullPath; - - // check to see if full path is the folder that contains each framework version, eg contains folders of the form v1.0, v2.3 etc - var subdirs = Directory.GetDirectories (fullPath, "v*").OrderBy (x => x).ToArray (); - foreach (var subdir in subdirs) { - if (ValidateFramework (subdir)) - return subdir; - } - } - } - - return null; - } - - protected override string FindLibraries (string runtimePath) - { - return Path.GetFullPath (runtimePath); - } - } -} - diff --git a/src/Xamarin.Android.Build.Utilities/Xamarin.Android.Build.Utilities.csproj b/src/Xamarin.Android.Build.Utilities/Xamarin.Android.Build.Utilities.csproj index 3702c29f718..795e72732f7 100644 --- a/src/Xamarin.Android.Build.Utilities/Xamarin.Android.Build.Utilities.csproj +++ b/src/Xamarin.Android.Build.Utilities/Xamarin.Android.Build.Utilities.csproj @@ -38,15 +38,12 @@ - + - - -