Skip to content

Commit 3a4e712

Browse files
[Xamarin.Android.Build.Tasks] remove TFI == MonoAndroid checks
In preparation for .NET 5, we think the `$(TargetFrameworkMoniker)` *might* be: .NETCoreApp,Version=5.0,Profile=Xamarin.Android It might also be `Profile=Android`, we don't know for sure yet. The TFM currently is: MonoAndroid,Version=v10.0 I think we can (and should) remove any code during the build that looks at `$(TargetFrameworkIdentifier)`. The places we are currently doing this are for performance: * The `_ResolveLibraryProjectImports` or `_GenerateJavaStubs` targets do not need to run against .NET standard assemblies. We can rely on a reference to `Mono.Android.dll` instead. We are already using System.Reflection.Metadata to see if the assembly actually has this reference. So an example of the condition: Condition="'%(ResolvedUserAssemblies.TargetFrameworkIdentifier)' == 'MonoAndroid' Or '%(ResolvedUserAssemblies.HasMonoAndroidReference)' == 'True'" Can just be: Condition="'%(ResolvedUserAssemblies.HasMonoAndroidReference)' == 'True'" I also took the opportunity for a small perf improvement: * `<FilterAssemblies/>` only needs to look for obsolete attributes in assemblies that reference `Mono.Android.dll`. ~~ Results ~~ Testing a build with no changes for the SmartHotel360 app: Before: 60 ms FilterAssemblies 2 calls After: 49 ms FilterAssemblies 2 calls I would think there is a small ~11ms performance improvement to all builds of this app.
1 parent 476921a commit 3a4e712

File tree

5 files changed

+14
-54
lines changed

5 files changed

+14
-54
lines changed

src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Android/Xamarin.Android.Designer.targets

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ Copyright (C) 2016 Xamarin. All rights reserved.
5757
/>
5858
<_ResolvedUserMonoAndroidAssembliesForDesigner
5959
Include="@(ResolvedUserAssemblies)"
60-
Condition="'%(ResolvedUserAssemblies.TargetFrameworkIdentifier)' == 'MonoAndroid' Or '%(ResolvedUserAssemblies.HasMonoAndroidReference)' == 'True'"
60+
Condition="'%(ResolvedUserAssemblies.HasMonoAndroidReference)' == 'True'"
6161
/>
6262
</ItemGroup>
6363
</Target>

src/Xamarin.Android.Build.Tasks/Tasks/FilterAssemblies.cs

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ public class FilterAssemblies : AndroidTask
1919
{
2020
public override string TaskPrefix => "FLT";
2121

22-
const string TargetFrameworkIdentifier = "MonoAndroid";
2322
const string MonoAndroidReference = "Mono.Android";
2423

2524
public bool DesignTimeBuild { get; set; }
@@ -42,19 +41,9 @@ public override bool RunTask ()
4241
}
4342
using (var pe = new PEReader (File.OpenRead (assemblyItem.ItemSpec))) {
4443
var reader = pe.GetMetadataReader ();
45-
var assemblyDefinition = reader.GetAssemblyDefinition ();
46-
var targetFrameworkIdentifier = GetTargetFrameworkIdentifier (assemblyDefinition, reader);
47-
if (string.Compare (targetFrameworkIdentifier, TargetFrameworkIdentifier, StringComparison.OrdinalIgnoreCase) == 0) {
48-
output.Add (assemblyItem);
49-
continue;
50-
}
51-
52-
// In the rare case, [assembly: TargetFramework("MonoAndroid,Version=v9.0")] may not match
53-
Log.LogDebugMessage ($"{nameof (TargetFrameworkIdentifier)} did not match: {assemblyItem.ItemSpec}");
54-
55-
// Fallback to looking for a Mono.Android reference
44+
// By default look for a reference to Mono.Android.dll
5645
if (HasReference (reader)) {
57-
Log.LogDebugMessage ($"{MonoAndroidReference} reference found: {assemblyItem.ItemSpec}");
46+
CheckAssemblyAttributes (reader);
5847
output.Add (assemblyItem);
5948
continue;
6049
}
@@ -71,27 +60,13 @@ public override bool RunTask ()
7160
return !Log.HasLoggedErrors;
7261
}
7362

74-
string GetTargetFrameworkIdentifier (AssemblyDefinition assembly, MetadataReader reader)
63+
void CheckAssemblyAttributes (MetadataReader reader)
7564
{
76-
string targetFrameworkIdentifier = null;
65+
var assembly = reader.GetAssemblyDefinition ();
7766
foreach (var handle in assembly.GetCustomAttributes ()) {
7867
var attribute = reader.GetCustomAttribute (handle);
7968
var name = reader.GetCustomAttributeFullName (attribute);
8069
switch (name) {
81-
case "System.Runtime.Versioning.TargetFrameworkAttribute":
82-
var arguments = attribute.GetCustomAttributeArguments ();
83-
foreach (var p in arguments.FixedArguments) {
84-
// Of the form "MonoAndroid,Version=v8.1"
85-
var value = p.Value?.ToString ();
86-
if (!string.IsNullOrEmpty (value)) {
87-
int commaIndex = value.IndexOf (",", StringComparison.Ordinal);
88-
if (commaIndex != -1) {
89-
targetFrameworkIdentifier = value.Substring (0, commaIndex);
90-
break;
91-
}
92-
}
93-
}
94-
break;
9570
case "Android.IncludeAndroidResourcesFromAttribute":
9671
case "Android.NativeLibraryReferenceAttribute":
9772
case "Java.Interop.JavaLibraryReferenceAttribute":
@@ -102,7 +77,6 @@ string GetTargetFrameworkIdentifier (AssemblyDefinition assembly, MetadataReader
10277
break;
10378
}
10479
}
105-
return targetFrameworkIdentifier;
10680
}
10781

10882
bool HasReference (MetadataReader reader)

src/Xamarin.Android.Build.Tasks/Tasks/ResolveAssemblies.cs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -214,23 +214,16 @@ void AddAssemblyReferences (MetadataResolver resolver, Dictionary<string, ITaskI
214214
if (resolutionPath == null)
215215
resolutionPath = new List<string>();
216216

217-
CheckAssemblyAttributes (assembly, reader, out string targetFrameworkIdentifier);
217+
CheckAssemblyAttributes (assembly, reader);
218218

219219
LogMessage ("{0}Adding assembly reference for {1}, recursively...", new string (' ', indent), assemblyName);
220220
resolutionPath.Add (assemblyName);
221221
indent += 2;
222222

223223
// Add this assembly
224-
ITaskItem assemblyItem = null;
225-
if (topLevel) {
226-
if (assemblies.TryGetValue (assemblyName, out assemblyItem)) {
227-
if (!string.IsNullOrEmpty (targetFrameworkIdentifier) && string.IsNullOrEmpty (assemblyItem.GetMetadata ("TargetFrameworkIdentifier"))) {
228-
assemblyItem.SetMetadata ("TargetFrameworkIdentifier", targetFrameworkIdentifier);
229-
}
230-
}
231-
} else {
224+
if (!assemblies.TryGetValue (assemblyName, out ITaskItem assemblyItem) && !topLevel) {
232225
assemblies [assemblyName] =
233-
assemblyItem = CreateAssemblyTaskItem (assemblyPath, targetFrameworkIdentifier);
226+
assemblyItem = CreateAssemblyTaskItem (assemblyPath);
234227
}
235228

236229
// Recurse into each referenced assembly
@@ -272,10 +265,8 @@ void AddAssemblyReferences (MetadataResolver resolver, Dictionary<string, ITaskI
272265
resolutionPath.RemoveAt (resolutionPath.Count - 1);
273266
}
274267

275-
void CheckAssemblyAttributes (AssemblyDefinition assembly, MetadataReader reader, out string targetFrameworkIdentifier)
268+
void CheckAssemblyAttributes (AssemblyDefinition assembly, MetadataReader reader)
276269
{
277-
targetFrameworkIdentifier = null;
278-
279270
foreach (var handle in assembly.GetCustomAttributes ()) {
280271
var attribute = reader.GetCustomAttribute (handle);
281272
switch (reader.GetCustomAttributeFullName (attribute)) {
@@ -293,11 +284,12 @@ void CheckAssemblyAttributes (AssemblyDefinition assembly, MetadataReader reader
293284
var arguments = attribute.GetCustomAttributeArguments ();
294285
foreach (var p in arguments.FixedArguments) {
295286
// Of the form "MonoAndroid,Version=v8.1"
287+
// If this is a .NET 5 TFM, we won't emit these warnings
296288
var value = p.Value?.ToString ();
297289
if (!string.IsNullOrEmpty (value)) {
298290
int commaIndex = value.IndexOf (",", StringComparison.Ordinal);
299291
if (commaIndex != -1) {
300-
targetFrameworkIdentifier = value.Substring (0, commaIndex);
292+
string targetFrameworkIdentifier = value.Substring (0, commaIndex);
301293
if (targetFrameworkIdentifier == "MonoAndroid") {
302294
const string match = "Version=";
303295
var versionIndex = value.IndexOf (match, commaIndex, StringComparison.Ordinal);
@@ -368,14 +360,12 @@ void ResolveI18nAssembly (MetadataResolver resolver, string name, Dictionary<str
368360
assemblies [name] = CreateAssemblyTaskItem (assembly);
369361
}
370362

371-
static ITaskItem CreateAssemblyTaskItem (string assembly, string targetFrameworkIdentifier = null)
363+
static ITaskItem CreateAssemblyTaskItem (string assembly)
372364
{
373365
var assemblyFullPath = Path.GetFullPath (assembly);
374-
var dictionary = new Dictionary<string, string> (2) {
366+
var dictionary = new Dictionary<string, string> (1) {
375367
{ "ReferenceAssembly", assemblyFullPath },
376368
};
377-
if (!string.IsNullOrEmpty (targetFrameworkIdentifier))
378-
dictionary.Add ("TargetFrameworkIdentifier", targetFrameworkIdentifier);
379369
return new TaskItem (assemblyFullPath, dictionary);
380370
}
381371
}

src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,6 @@ public static string GetNativeLibraryAbi (ITaskItem lib)
290290

291291
public static bool IsMonoAndroidAssembly (ITaskItem assembly)
292292
{
293-
var tfi = assembly.GetMetadata ("TargetFrameworkIdentifier");
294-
if (string.Compare (tfi, "MonoAndroid", StringComparison.OrdinalIgnoreCase) == 0)
295-
return true;
296-
297293
var hasReference = assembly.GetMetadata ("HasMonoAndroidReference");
298294
return bool.TryParse (hasReference, out bool value) && value;
299295
}

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2032,7 +2032,7 @@ because xbuild doesn't support framework reference assemblies.
20322032
<ItemGroup>
20332033
<_ResolvedUserMonoAndroidAssemblies
20342034
Include="@(_ResolvedUserAssemblies)"
2035-
Condition=" '%(_ResolvedUserAssemblies.TargetFrameworkIdentifier)' == 'MonoAndroid' Or '%(_ResolvedUserAssemblies.HasMonoAndroidReference)' == 'True' "
2035+
Condition=" '%(_ResolvedUserAssemblies.HasMonoAndroidReference)' == 'True' "
20362036
/>
20372037
</ItemGroup>
20382038
</Target>

0 commit comments

Comments
 (0)