diff --git a/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Designer.targets b/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Designer.targets index 3f4ce816da6..a6745d6f08b 100644 --- a/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Designer.targets +++ b/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Designer.targets @@ -57,7 +57,7 @@ Copyright (C) 2016 Xamarin. All rights reserved. /> <_ResolvedUserMonoAndroidAssembliesForDesigner Include="@(ResolvedUserAssemblies)" - Condition="'%(ResolvedUserAssemblies.TargetFrameworkIdentifier)' == 'MonoAndroid' Or '%(ResolvedUserAssemblies.HasMonoAndroidReference)' == 'True'" + Condition="'%(ResolvedUserAssemblies.HasMonoAndroidReference)' == 'True'" /> diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/FilterAssemblies.cs b/src/Xamarin.Android.Build.Tasks/Tasks/FilterAssemblies.cs index c163a95ff7c..f657d23a147 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/FilterAssemblies.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/FilterAssemblies.cs @@ -19,7 +19,6 @@ public class FilterAssemblies : AndroidTask { public override string TaskPrefix => "FLT"; - const string TargetFrameworkIdentifier = "MonoAndroid"; const string MonoAndroidReference = "Mono.Android"; public bool DesignTimeBuild { get; set; } @@ -42,19 +41,9 @@ public override bool RunTask () } using (var pe = new PEReader (File.OpenRead (assemblyItem.ItemSpec))) { var reader = pe.GetMetadataReader (); - var assemblyDefinition = reader.GetAssemblyDefinition (); - var targetFrameworkIdentifier = GetTargetFrameworkIdentifier (assemblyDefinition, reader); - if (string.Compare (targetFrameworkIdentifier, TargetFrameworkIdentifier, StringComparison.OrdinalIgnoreCase) == 0) { - output.Add (assemblyItem); - continue; - } - - // In the rare case, [assembly: TargetFramework("MonoAndroid,Version=v9.0")] may not match - Log.LogDebugMessage ($"{nameof (TargetFrameworkIdentifier)} did not match: {assemblyItem.ItemSpec}"); - - // Fallback to looking for a Mono.Android reference + // By default look for a reference to Mono.Android.dll if (HasReference (reader)) { - Log.LogDebugMessage ($"{MonoAndroidReference} reference found: {assemblyItem.ItemSpec}"); + CheckAssemblyAttributes (reader); output.Add (assemblyItem); continue; } @@ -71,27 +60,13 @@ public override bool RunTask () return !Log.HasLoggedErrors; } - string GetTargetFrameworkIdentifier (AssemblyDefinition assembly, MetadataReader reader) + void CheckAssemblyAttributes (MetadataReader reader) { - string targetFrameworkIdentifier = null; + var assembly = reader.GetAssemblyDefinition (); foreach (var handle in assembly.GetCustomAttributes ()) { var attribute = reader.GetCustomAttribute (handle); var name = reader.GetCustomAttributeFullName (attribute); switch (name) { - case "System.Runtime.Versioning.TargetFrameworkAttribute": - var arguments = attribute.GetCustomAttributeArguments (); - foreach (var p in arguments.FixedArguments) { - // Of the form "MonoAndroid,Version=v8.1" - var value = p.Value?.ToString (); - if (!string.IsNullOrEmpty (value)) { - int commaIndex = value.IndexOf (",", StringComparison.Ordinal); - if (commaIndex != -1) { - targetFrameworkIdentifier = value.Substring (0, commaIndex); - break; - } - } - } - break; case "Android.IncludeAndroidResourcesFromAttribute": case "Android.NativeLibraryReferenceAttribute": case "Java.Interop.JavaLibraryReferenceAttribute": @@ -102,7 +77,6 @@ string GetTargetFrameworkIdentifier (AssemblyDefinition assembly, MetadataReader break; } } - return targetFrameworkIdentifier; } bool HasReference (MetadataReader reader) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveAssemblies.cs b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveAssemblies.cs index caf44bb52ac..112bb80e7af 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/ResolveAssemblies.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/ResolveAssemblies.cs @@ -81,6 +81,8 @@ void Execute (MetadataResolver resolver) lockFile = LockFileUtilities.GetLockFile (ProjectAssetFile, logger); } + mainApiLevel = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (TargetFrameworkVersion); + try { foreach (var assembly in Assemblies) { // Add each user assembly and all referenced assemblies (recursive) @@ -123,14 +125,6 @@ void Execute (MetadataResolver resolver) // Add I18N assemblies if needed AddI18nAssemblies (resolver, assemblies); - var mainapiLevel = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (TargetFrameworkVersion); - foreach (var item in api_levels.Where (x => mainapiLevel < x.Value)) { - var itemOSVersion = MonoAndroidHelper.SupportedVersions.GetFrameworkVersionFromApiLevel (item.Value); - LogCodedWarning ("XA0105", ProjectFile, 0, - "The $(TargetFrameworkVersion) for {0} ({1}) is greater than the $(TargetFrameworkVersion) for your project ({2}). " + - "You need to increase the $(TargetFrameworkVersion) for your project.", Path.GetFileName (item.Key), itemOSVersion, TargetFrameworkVersion); - } - var resolvedAssemblies = new List (assemblies.Count); var resolvedSymbols = new List (assemblies.Count); var resolvedFrameworkAssemblies = new List (assemblies.Count); @@ -157,7 +151,7 @@ void Execute (MetadataResolver resolver) } readonly List do_not_package_atts = new List (); - readonly Dictionary api_levels = new Dictionary (); + int? mainApiLevel; int indent = 2; string ResolveRuntimeAssemblyForReferenceAssembly (LockFile lockFile, string assemblyPath) @@ -214,23 +208,16 @@ void AddAssemblyReferences (MetadataResolver resolver, Dictionary(); - CheckAssemblyAttributes (assembly, reader, out string targetFrameworkIdentifier); + CheckAssemblyAttributes (assembly, reader); LogMessage ("{0}Adding assembly reference for {1}, recursively...", new string (' ', indent), assemblyName); resolutionPath.Add (assemblyName); indent += 2; // Add this assembly - ITaskItem assemblyItem = null; - if (topLevel) { - if (assemblies.TryGetValue (assemblyName, out assemblyItem)) { - if (!string.IsNullOrEmpty (targetFrameworkIdentifier) && string.IsNullOrEmpty (assemblyItem.GetMetadata ("TargetFrameworkIdentifier"))) { - assemblyItem.SetMetadata ("TargetFrameworkIdentifier", targetFrameworkIdentifier); - } - } - } else { + if (!assemblies.TryGetValue (assemblyName, out ITaskItem assemblyItem) && !topLevel) { assemblies [assemblyName] = - assemblyItem = CreateAssemblyTaskItem (assemblyPath, targetFrameworkIdentifier); + assemblyItem = CreateAssemblyTaskItem (assemblyPath); } // Recurse into each referenced assembly @@ -272,10 +259,8 @@ void AddAssemblyReferences (MetadataResolver resolver, Dictionary mainApiLevel) { var assemblyName = reader.GetString (assembly.Name); - LogDebugMessage ("{0}={1}", assemblyName, apiLevel); - api_levels [assemblyName] = apiLevel.Value; + LogCodedWarning ("XA0105", ProjectFile, 0, + "The $(TargetFrameworkVersion) for {0} ({1}) is greater than the $(TargetFrameworkVersion) for your project ({2}). " + + "You need to increase the $(TargetFrameworkVersion) for your project.", assemblyName, version, TargetFrameworkVersion); } } } @@ -368,14 +355,12 @@ void ResolveI18nAssembly (MetadataResolver resolver, string name, Dictionary (2) { + var dictionary = new Dictionary (1) { { "ReferenceAssembly", assemblyFullPath }, }; - if (!string.IsNullOrEmpty (targetFrameworkIdentifier)) - dictionary.Add ("TargetFrameworkIdentifier", targetFrameworkIdentifier); return new TaskItem (assemblyFullPath, dictionary); } } diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs index a5f778d5af4..74853befa44 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs @@ -290,10 +290,6 @@ public static string GetNativeLibraryAbi (ITaskItem lib) public static bool IsMonoAndroidAssembly (ITaskItem assembly) { - var tfi = assembly.GetMetadata ("TargetFrameworkIdentifier"); - if (string.Compare (tfi, "MonoAndroid", StringComparison.OrdinalIgnoreCase) == 0) - return true; - var hasReference = assembly.GetMetadata ("HasMonoAndroidReference"); return bool.TryParse (hasReference, out bool value) && value; } diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index f8f2c88398f..26b06810019 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -2032,7 +2032,7 @@ because xbuild doesn't support framework reference assemblies. <_ResolvedUserMonoAndroidAssemblies Include="@(_ResolvedUserAssemblies)" - Condition=" '%(_ResolvedUserAssemblies.TargetFrameworkIdentifier)' == 'MonoAndroid' Or '%(_ResolvedUserAssemblies.HasMonoAndroidReference)' == 'True' " + Condition=" '%(_ResolvedUserAssemblies.HasMonoAndroidReference)' == 'True' " />