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 @@
-
+
-
-
-