Skip to content

Commit 8c24b8f

Browse files
[Xamarin.Android.Build.Tasks] skip XA1034 logic in some cases (dotnet#7680)
After profiling a build for a `dotnet new maui` app, I noticed: 193.41ms xamarin.android.build.tasks!Xamarin.Android.Tasks.MonoAndroidHelper.HasResourceDesignerAssemblyReference() Which equates to: Top 10 most expensive tasks ... AppendCustomMetadataToItemGroup = 204 ms In dc3ccf2, we added this check to emit `XA1034` when `$(AndroidUseDesignerAssembly)` is false. And so we don't actually need to validate this value when it is `true` (the default). I moved the logic from the `<AppendCustomMetadataToItemGroup/>` MSBuild task to a new `<CheckForInvalidDesignerConfig/>` task. In most projects, it will be completely skipped: Target "_CheckForInvalidDesignerConfig" skipped, due to false condition; ( '$(AndroidUseDesignerAssembly)' != 'True' ) was evaluated as ( 'true' != 'True' ). After these changes, I get a much better number in projects with default settings: AppendCustomMetadataToItemGroup = 2 ms Just by moving the task around, it is faster in general: CheckForInvalidDesignerConfig = 11 ms This is due to less assemblies passed in than before: Assemblies="@(_MonoAndroidReferencePath);@(_MonoAndroidReferenceDependencyPaths)" While previously, we were checking *all* assemblies.
1 parent c92ae5e commit 8c24b8f

File tree

4 files changed

+58
-36
lines changed

4 files changed

+58
-36
lines changed

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

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Copyright (C) 2016 Xamarin. All rights reserved.
2020
<UsingTask TaskName="Xamarin.Android.Tasks.GenerateResourceDesignerAssembly" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
2121
<UsingTask TaskName="Xamarin.Android.Tasks.GenerateResourceCaseMap" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
2222
<UsingTask TaskName="Xamarin.Android.Tasks.GenerateRtxt" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
23+
<UsingTask TaskName="Xamarin.Android.Tasks.CheckForInvalidDesignerConfig" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
2324

2425
<PropertyGroup>
2526
<AndroidUseDesignerAssembly Condition=" '$(AndroidUseDesignerAssembly)' == '' ">False</AndroidUseDesignerAssembly>
@@ -142,15 +143,7 @@ Copyright (C) 2016 Xamarin. All rights reserved.
142143
<Target Name="_CheckForInvalidDesignerConfig"
143144
Condition=" '$(AndroidUseDesignerAssembly)' != 'True' "
144145
DependsOnTargets="_AddAndroidCustomMetaData">
145-
<ItemGroup>
146-
<_ErrorItems Include="@(_MonoAndroidReferencePath)" Condition=" '%(_MonoAndroidReferencePath.HasResourceDesignerAssemblyReference)' == 'True' "/>
147-
<_ErrorItems Include="@(_MonoAndroidReferenceDependencyPaths)" Condition=" '%(_MonoAndroidReferenceDependencyPaths.HasResourceDesignerAssemblyReference)' == 'True' "/>
148-
</ItemGroup>
149-
<AndroidError Code="XA1034"
150-
ResourceName="XA1034"
151-
FormatArguments="%(_ErrorItems.FullPath)"
152-
Condition=" '@(_ErrorItems->Count())' != '0' "
153-
/>
146+
<CheckForInvalidDesignerConfig Assemblies="@(_MonoAndroidReferencePath);@(_MonoAndroidReferenceDependencyPaths)" />
154147
</Target>
155148

156149
<PropertyGroup>

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,6 @@ public override bool RunTask ()
3535
foreach (var item in Inputs) {
3636
var fn = Path.GetFileNameWithoutExtension (item.ItemSpec);
3737
output.Add (item);
38-
var md = item.GetMetadata ("HasResourceDesignerAssemblyReference");
39-
if (string.IsNullOrEmpty (md)) {
40-
var b = MonoAndroidHelper.HasResourceDesignerAssemblyReference (item);
41-
item.SetMetadata ("HasResourceDesignerAssemblyReference", MonoAndroidHelper.HasResourceDesignerAssemblyReference (item).ToString ());
42-
}
4338
List<ITaskItem> metaDataList;
4439
if (!metaData.TryGetValue (fn, out metaDataList))
4540
continue;
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using Microsoft.Android.Build.Tasks;
2+
using Microsoft.Build.Framework;
3+
using Microsoft.Build.Utilities;
4+
using System.Reflection.Metadata;
5+
using System.Reflection.PortableExecutable;
6+
using System.IO;
7+
8+
namespace Xamarin.Android.Tasks
9+
{
10+
/// <summary>
11+
/// Emits XA1034 is an assembly has a reference to _Microsoft.Android.Resource.Designer.dll
12+
/// * NOTE: only called when $(AndroidUseDesignerAssembly) is false
13+
/// </summary>
14+
public class CheckForInvalidDesignerConfig : AndroidTask
15+
{
16+
public override string TaskPrefix => "CIRF";
17+
18+
public ITaskItem[] Assemblies { get; set; }
19+
20+
public override bool RunTask ()
21+
{
22+
if (Assemblies == null)
23+
return true;
24+
25+
foreach (var assembly in Assemblies) {
26+
if (HasResourceDesignerAssemblyReference (assembly)) {
27+
Log.LogCodedError ("XA1034", Properties.Resources.XA1034, assembly);
28+
}
29+
}
30+
31+
return !Log.HasLoggedErrors;
32+
}
33+
34+
static bool HasResourceDesignerAssemblyReference (ITaskItem assembly)
35+
{
36+
if (!File.Exists (assembly.ItemSpec)) {
37+
return false;
38+
}
39+
using var pe = new PEReader (File.OpenRead (assembly.ItemSpec));
40+
var reader = pe.GetMetadataReader ();
41+
return HasResourceDesignerAssemblyReference (reader);
42+
}
43+
44+
static bool HasResourceDesignerAssemblyReference (MetadataReader reader)
45+
{
46+
foreach (var handle in reader.AssemblyReferences) {
47+
var reference = reader.GetAssemblyReference (handle);
48+
var name = reader.GetString (reference.Name);
49+
if (string.CompareOrdinal (name, "_Microsoft.Android.Resource.Designer") == 0) {
50+
return true;
51+
}
52+
}
53+
return false;
54+
}
55+
}
56+
}

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

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -325,28 +325,6 @@ public static bool HasMonoAndroidReference (MetadataReader reader)
325325
return false;
326326
}
327327

328-
public static bool HasResourceDesignerAssemblyReference (ITaskItem assembly)
329-
{
330-
if (!File.Exists (assembly.ItemSpec)) {
331-
return false;
332-
}
333-
using var pe = new PEReader (File.OpenRead (assembly.ItemSpec));
334-
var reader = pe.GetMetadataReader ();
335-
return HasResourceDesignerAssemblyReference (reader);
336-
}
337-
338-
public static bool HasResourceDesignerAssemblyReference (MetadataReader reader)
339-
{
340-
foreach (var handle in reader.AssemblyReferences) {
341-
var reference = reader.GetAssemblyReference (handle);
342-
var name = reader.GetString (reference.Name);
343-
if (string.CompareOrdinal (name, "_Microsoft.Android.Resource.Designer") == 0) {
344-
return true;
345-
}
346-
}
347-
return false;
348-
}
349-
350328
public static bool IsReferenceAssembly (string assembly)
351329
{
352330
using (var stream = File.OpenRead (assembly))

0 commit comments

Comments
 (0)