Skip to content

Commit

Permalink
[Xamarin.Android.Build.Tasks] Support VS "Build Acceleration" (#9042)
Browse files Browse the repository at this point in the history
Fixes: #8581
Fixes: https://dev.azure.com/devdiv/DevDiv/_workitems/edit/2051915

Context: https://github.com/dotnet/project-system/blob/9c9efad1d986e38232cbd74bec9dbd794883a91c/docs/build-acceleration.md 
Context: https://github.com/dotnet/project-system/blob/dd9431b535a6158060d7ab64597276eb2c354aab/docs/design-time-builds.md#targets-that-run-during-design-time-builds
Context: https://github.com/dotnet/project-system/blob/dd9431b535a6158060d7ab64597276eb2c354aab/docs/up-to-date-check.md#default-inputs-and-outputs
Context: https://github.com/dotnet/project-system/blob/dd9431b535a6158060d7ab64597276eb2c354aab/src/Microsoft.VisualStudio.ProjectSystem.Managed/ProjectSystem/DesignTimeTargets/Microsoft.Managed.DesignTime.targets#L448-L449
Context: dc3ccf2

The Visual Studio Fast Up-to-Date Check (FUTDC) flags
`_Microsoft.Android.Resource.Designer.dll` (dc3ccf2) as newer than
the output assembly (which it is).  But this flagging also causes it
to incorrectly think the build is out of date.

	WARNING: Potential build performance issue in 'Foo.csproj'.
	The project does not appear up-to-date after a successful build:
	Input ResolvedCompilationReference item 'obj\Debug\net8.0-android\_Microsoft.Android.Resource.Designer.dll' (2023-12-11 11:34:12.546) has been modified since the last successful build started.

Fix this by removing `_Microsoft.Android.Resource.Designer.dll` from
the list of files checked.  To do so, we *must* remove the item from
the `@(ReferencePathWithRefAssemblies)` item group *before* the
[`CollectResolvedCompilationReferencesDesignTime`][0] target runs.
This is because that Target uses the [`Returns` attribute][1]; it
turns out you cannot modify the ItemGroup that is being returned
via the `Returns` attribute on a target.

Unfortunately there isn't a way to unit test this since the Fast Update
check *only* runs in Visual Studio.  The targets do not even exist on
the command line.

[0]: https://github.com/dotnet/project-system/blob/dd9431b535a6158060d7ab64597276eb2c354aab/src/Microsoft.VisualStudio.ProjectSystem.Managed/ProjectSystem/DesignTimeTargets/Microsoft.Managed.DesignTime.targets#L448-L449
[1]: https://learn.microsoft.com/visualstudio/msbuild/target-element-msbuild?view=vs-2022
  • Loading branch information
dellis1972 authored and jonathanpeppers committed Jul 1, 2024
1 parent b1c6040 commit 4b1ec57
Showing 1 changed file with 22 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,28 @@ Copyright (C) 2016 Xamarin. All rights reserved.
</ItemGroup>
</Target>

<!--
The Visual Studio FastUpdate check flags the Resource Designer assembly as
newer than the output assembly (which it is). But it causes it to incorrectly
think the build is out of date.
So lets remove it. We MUST remove the item from the @ReferencePathWithRefAssemblies
ItemGroup BEFORE the CollectResolvedCompilationReferencesDesignTime target runs.
This is because that target uses the Returns functionality. It turns out you cannot
modify the ItemGroup that is being returned via a Returns on a target.
-->
<Target Name="_RemoveResourceDesignerFromResolvedComilationReferences"
BeforeTargets="CollectResolvedCompilationReferencesDesignTime"
Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'"
>
<ItemGroup>
<_ResourceDesignerFiles Include="%(ReferencePathWithRefAssemblies.Identity)"
Condition="'%(ReferencePathWithRefAssemblies.OriginalPath)' == '$(_GenerateResourceDesignerAssemblyOutput)'"
/>
<ReferencePathWithRefAssemblies Remove="@(_ResourceDesignerFiles)" />
</ItemGroup>
</Target>

<Target Name="_BuildResourceDesigner"
Condition=" '$(AndroidUseDesignerAssembly)' == 'True' "
DependsOnTargets="$(_BuildResourceDesignerDependsOn)" />
Expand Down

0 comments on commit 4b1ec57

Please sign in to comment.