From d95458806860053a7192abadb9bfc5ce9caeeba7 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Thu, 8 Aug 2024 16:24:34 +0100 Subject: [PATCH 1/8] Fix an issue with incremental builds. We have been getting on and off reports of the following errors in Android for quite a while now. ``` Resources/values/styles.xml(2): error APT2260: resource attr/colorPrimary (aka Microsoft.Maui:attr/colorPrimary) not found. ``` It was always very confusing as to why this was happening. No one ever seemed to be able to figure out why these files were deleted. Well it turns out they were not deleted, just not included. While building maui I came across this issue and managed to capture a `.binlog`. It turns out that the `_CleanMonoAndroidIntermediateDir` target was running. And it was deleting certain files. This target was running because `_CleanIntermediateIfNeeded` was running. That was running because the `build.props` file had changed... That was because the NuGet `project.assets.json` file had a new timestamp! On an incremental build.... So it looks like NuGet sometimes touches the `project.assets.json` file even if it does not change. We can't blame them for that as we do similar things. The next confusing thing and the principal cause is that the `libraryprojectimports.cache` was being deleted, probably buy the call to `_CleanMonoAndroidIntermediateDir`. However the `_ResolveLibraryProjectImports.stamp` file was left in place. This means the `_ResolveLibraryProjectImports` does NOT run. So we end up NOT including ANY of the resource `res.zip` files when calling `aapt2`. The `_ResolveLibraryProjectImports` target did not include `libraryprojectimports.cache` in its `Outputs`. So if the file did not exist, but the stamp file did the target would not run. It is confusing because in the `_CleanMonoAndroidIntermediateDir` we delete the `libraryprojectimports.cache` and the entire `$(IntermediateOutputPath)stamp` directory.. So lets include `libraryprojectimports.cache` in the outputs for starters. Then update the `_CreatePropertiesCache` target to use a hash of the `project.assets.json` file rather than a timestamp. This way we really only run the build if something actually changes. --- .../IncrementalBuildTest.cs | 22 +++++++++++++++++++ .../Xamarin.Android.Common.targets | 11 +++++++--- .../Xamarin.Android.EmbeddedResource.targets | 2 +- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs index 55c05640ea6..8bf4c6e422f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs @@ -105,6 +105,11 @@ public void CheckNothingIsDeletedByIncrementalClean ([Values (true, false)] bool File.SetLastWriteTimeUtc (file, DateTime.UtcNow); } Assert.IsTrue (b.Build (proj, doNotCleanupOnUpdate: true, saveProject: false), "Second should have succeeded"); + b.Output.AssertTargetIsNotSkipped ("_CleanMonoAndroidIntermediateDir"); + var stampFiles = Path.Combine (intermediate, "stamp", "_ResolveLibraryProjectImports.stamp"); + FileAssert.Exists (stampFiles, $"{stampFiles} should exists!"); + var libraryProjectImports = Path.Combine (intermediate, "libraryprojectimports.cache"); + FileAssert.Exists (libraryProjectImports, $"{libraryProjectImports} should exists!"); //No changes Assert.IsTrue (b.Build (proj, doNotCleanupOnUpdate: true, saveProject: false), "Third should have succeeded"); @@ -827,6 +832,7 @@ public void ResolveLibraryProjectImports () b.BuildLogFile = "build2.log"; Assert.IsTrue (b.Build (proj), "second build should have succeeded."); + b.Output.AssertTargetIsNotSkipped ("_ResolveLibraryProjectImports"); FileAssert.Exists (cacheFile); var actual = ReadCache (cacheFile); CollectionAssert.AreEqual (actual.Jars.Select (j => j.ItemSpec).OrderBy (j => j), @@ -867,6 +873,22 @@ public void ResolveLibraryProjectImports () foreach (var targetName in targets) { Assert.IsTrue (b.Output.IsTargetSkipped (targetName), $"`{targetName}` should be skipped!"); } + + var filesToTouch = new [] { + Path.Combine (intermediate, "build.props"), + Path.Combine (intermediate, $"{proj.ProjectName}.pdb"), + }; + foreach (var file in filesToTouch) { + FileAssert.Exists (file); + File.SetLastWriteTimeUtc (file, DateTime.UtcNow); + } + + b.BuildLogFile = "build5.log"; + Assert.IsTrue (b.Build (proj), "fifth build should have succeeded."); + b.Output.AssertTargetIsNotSkipped ("_CleanMonoAndroidIntermediateDir"); + b.Output.AssertTargetIsNotSkipped ("_ResolveLibraryProjectImports"); + FileAssert.Exists (cacheFile); + FileAssert.Exists (stamp); } } diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index df1bf28d741..f896c51896f 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -910,13 +910,18 @@ because xbuild doesn't support framework reference assemblies. False <_AndroidBuildPropertiesCacheExists Condition=" Exists('$(_AndroidBuildPropertiesCache)') ">True <_NuGetAssetsFile Condition=" Exists('$(ProjectAssetsFile)') ">$(ProjectAssetsFile) - <_NuGetAssetsFile Condition=" Exists('$(ProjectLockFile)') ">$(ProjectLockFile) + <_NuGetAssetsFile Condition=" '$(_NuGetAssetsFile)' == '' and Exists('$(ProjectLockFile)') ">$(ProjectLockFile) <_NuGetAssetsFile Condition=" '$(_NuGetAssetsFile)' == '' and Exists('packages.config') ">packages.config - <_NuGetAssetsTimestamp Condition=" '$(_NuGetAssetsFile)' != '' ">$([System.IO.File]::GetLastWriteTime('$(_NuGetAssetsFile)').Ticks) <_TypeMapKind Condition=" '$(AndroidIncludeDebugSymbols)' != 'True' ">mvid <_TypeMapKind Condition=" '$(AndroidIncludeDebugSymbols)' == 'True' And '$(_InstantRunEnabled)' == 'True' ">strings-files <_TypeMapKind Condition=" '$(AndroidIncludeDebugSymbols)' == 'True' And '$(_InstantRunEnabled)' != 'True' ">strings-asm + + + <_PropertyCacheItems Include="AotAssemblies=$(AotAssemblies)" /> @@ -945,7 +950,7 @@ because xbuild doesn't support framework reference assemblies. <_PropertyCacheItems Include="OS=$(OS)" /> <_PropertyCacheItems Include="AndroidIncludeDebugSymbols=$(AndroidIncludeDebugSymbols)" /> <_PropertyCacheItems Include="AndroidPackageNamingPolicy=$(AndroidPackageNamingPolicy)" /> - <_PropertyCacheItems Include="_NuGetAssetsTimestamp=$(_NuGetAssetsTimestamp)" /> + <_PropertyCacheItems Include="_NuGetAssetsFileHash=%(_NuGetAssetsFileHash.FileHash)" /> <_PropertyCacheItems Include="TypeMapKind=$(_TypeMapKind)" /> <_PropertyCacheItems Include="AndroidManifestPlaceholders=$(AndroidManifestPlaceholders)" /> <_PropertyCacheItems Include="ProjectFullPath=$(MSBuildProjectFullPath)" /> diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.EmbeddedResource.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.EmbeddedResource.targets index 1b629e13c06..8746474604e 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.EmbeddedResource.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.EmbeddedResource.targets @@ -35,7 +35,7 @@ This file is used by all project types, including binding projects. + Outputs="$(_AndroidStampDirectory)_ResolveLibraryProjectImports.stamp;$(_AndroidLibraryProjectImportsCache)"> Date: Fri, 9 Aug 2024 16:05:56 +0100 Subject: [PATCH 2/8] try this --- .../Xamarin.Android.EmbeddedResource.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.EmbeddedResource.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.EmbeddedResource.targets index 8746474604e..1b629e13c06 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.EmbeddedResource.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.EmbeddedResource.targets @@ -35,7 +35,7 @@ This file is used by all project types, including binding projects. + Outputs="$(_AndroidStampDirectory)_ResolveLibraryProjectImports.stamp"> Date: Tue, 13 Aug 2024 13:35:12 +0100 Subject: [PATCH 3/8] try to give dtb their own stamps directory --- .../IncrementalBuildTest.cs | 5 ++++- .../Xamarin.Android.DesignTime.targets | 22 +++++++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs index 8bf4c6e422f..eba5ef7313b 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs @@ -1179,13 +1179,16 @@ public void DesignTimeBuild () var proj = new XamarinAndroidApplicationProject (); using (var b = CreateApkBuilder (Path.Combine ("temp", $"{nameof (IncrementalBuildTest)}{TestName}"))) { Assert.IsTrue (b.DesignTimeBuild (proj), "first dtb should have succeeded."); + var target = "_ResolveLibraryProjectImports"; + Assert.IsFalse (b.Output.IsTargetSkipped (target), $"`{target}` should not have been skipped."); // DesignTimeBuild=true lowercased var parameters = new [] { "DesignTimeBuild=true" }; Assert.IsTrue (b.RunTarget (proj, "Compile", doNotCleanupOnUpdate: true, parameters: parameters), "second dtb should have succeeded."); - var target = "_ResolveLibraryProjectImports"; Assert.IsTrue (b.Output.IsTargetSkipped (target), $"`{target}` should have been skipped."); Assert.IsTrue (b.RunTarget (proj, "UpdateGeneratedFiles", doNotCleanupOnUpdate: true, parameters: parameters), "UpdateGeneratedFiles should have succeeded."); Assert.IsTrue (b.Output.IsTargetSkipped (target), $"`{target}` should have been skipped."); + Assert.IsTrue (b.Build (proj, doNotCleanupOnUpdate: true, saveProject: false), "full build should have succeeded."); + Assert.IsFalse (b.Output.IsTargetSkipped (target), $"`{target}` should not have been skipped."); } } diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets index 00f3f2cfdd5..b0c0e6b2917 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets @@ -13,45 +13,49 @@ This file is used by all project types, including binding projects. <_AndroidIntermediateDesignTimeBuildDirectory>$(IntermediateOutputPath)designtime\ + <_AndroidIntermediateDesignTimeStampDirectory>$(_AndroidIntermediateDesignTimeBuildDirectory)stamp\ <_AndroidDesignTimeBuildPropertiesCache>$(_AndroidIntermediateDesignTimeBuildDirectory)build.props <_AndroidLibraryImportsDesignTimeCache>$(_AndroidIntermediateDesignTimeBuildDirectory)libraryimports.cache <_AndroidLibraryProjectImportsDesignTimeCache>$(_AndroidIntermediateDesignTimeBuildDirectory)libraryprojectimports.cache <_AndroidManagedResourceDesignerFile>$(_AndroidIntermediateDesignTimeBuildDirectory)$(_AndroidResourceDesigner) - - - - <_AndroidMSBuildAllProjects Include="$(MSBuildAllProjects)" Exclude="$(MSBuildProjectFullPath).user" /> - + false + - + true true True False + <_AndroidStampDirectory Condition=" '$(DesignTimeBuild)' == 'true' ">$(_AndroidIntermediateDesignTimeStampDirectory) <_AndroidLibraryImportsCache Condition=" '$(DesignTimeBuild)' == 'true' And !Exists ('$(_AndroidLibraryImportsCache)') ">$(_AndroidLibraryImportsDesignTimeCache) <_AndroidLibraryProjectImportsCache Condition=" '$(DesignTimeBuild)' == 'true' And !Exists ('$(_AndroidLibraryProjectImportsCache)') ">$(_AndroidLibraryProjectImportsDesignTimeCache) <_AndroidBuildPropertiesCache Condition=" '$(DesignTimeBuild)' == 'true' ">$(_AndroidDesignTimeBuildPropertiesCache) + <_GeneratorStampFile Condition=" '$(DesignTimeBuild)' == 'true' ">$(_AndroidIntermediateDesignTimeStampDirectory)generator.stamp + From 47e7625d4c864143887bcada404e4a8ebaccd8ee Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Tue, 13 Aug 2024 14:42:30 +0100 Subject: [PATCH 4/8] Add clean up for design time builds --- src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index f896c51896f..3cccd86e1a9 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -2508,7 +2508,7 @@ because xbuild doesn't support framework reference assemblies. - + From bd521d141f1e679cb11045e5c663cc96d10418cf Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Wed, 14 Aug 2024 08:24:09 +0100 Subject: [PATCH 5/8] Try to fix the tests --- .../Tests/Xamarin.Android.Build.Tests/DesignerTests.cs | 6 +++--- .../Xamarin.Android.Common.targets | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs index c8288443d5a..1b467a7565c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs @@ -93,7 +93,7 @@ public CustomTextView(Context context, IAttributeSet attributes) : base(context, libb.Save (lib); appb.BuildLogFile = "build1.log"; appb.Target = target; - Assert.IsTrue (appb.Build (proj, parameters: DesignerParameters), $"build should have succeeded for target `{target}`"); + Assert.IsTrue (appb.DesignTimeBuild (proj), $"build should have succeeded for target `{target}`"); Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_UpdateAndroidResgen"), "_UpdateAndroidResgen should have run completely."); Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_Foo"), "_Foo should have run completely"); var customViewPath = Path.Combine (Root, appb.ProjectDirectory, proj.IntermediateOutputPath, "res", "layout", "custom_text.xml"); @@ -107,7 +107,7 @@ public CustomTextView(Context context, IAttributeSet attributes) : base(context, Assert.IsTrue (libb.Build (lib, doNotCleanupOnUpdate: true), "library build should have succeeded."); appb.Target = "Build"; appb.BuildLogFile = "build2.log"; - Assert.IsTrue (appb.Build (proj, doNotCleanupOnUpdate: true), "app build should have succeeded."); + Assert.IsTrue (appb.Build (proj, doNotCleanupOnUpdate: true, saveProject:false), "app build should have succeeded."); Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_UpdateAndroidResgen"), "_UpdateAndroidResgen should have run completely."); Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_Foo"), "_Foo should have run completely"); doc = XDocument.Load (customViewPath); @@ -117,7 +117,7 @@ public CustomTextView(Context context, IAttributeSet attributes) : base(context, "unnamedproject.CustomTextView should have been replaced with a $(Hash).CustomTextView"); appb.Target = target; appb.BuildLogFile = "build3.log"; - Assert.IsTrue (appb.Build (proj, parameters: DesignerParameters, doNotCleanupOnUpdate: true), $"build should have succeeded for target `{target}`"); + Assert.IsTrue (appb.DesignTimeBuild (proj, doNotCleanupOnUpdate: true), $"build should have succeeded for target `{target}`"); Assert.IsTrue (appb.Output.AreTargetsAllSkipped ("_UpdateAndroidResgen"), "_UpdateAndroidResgen should have been skipped."); Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_Foo"), "_Foo should have run completely"); doc = XDocument.Load (customViewPath); diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 3cccd86e1a9..f896c51896f 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -2508,7 +2508,7 @@ because xbuild doesn't support framework reference assemblies. - + From 709246f1445775fc9a2eaf396beb9894f6bba3a7 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Thu, 15 Aug 2024 10:23:22 +0100 Subject: [PATCH 6/8] Fix CustomDesignerTargetSetupDependenciesForDesigner Test --- .../DesignerTests.cs | 20 ++++++++++++++----- .../Xamarin.Android.DesignTime.targets | 1 + 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs index 1b467a7565c..ec42201ab0c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs @@ -90,10 +90,11 @@ public CustomTextView(Context context, IAttributeSet attributes) : base(context, using (var libb = CreateDllBuilder (Path.Combine (path, lib.ProjectName), false, false)) using (var appb = CreateApkBuilder (Path.Combine (path, proj.ProjectName), false, false)) { // Save the library project, but don't build it yet - libb.Save (lib); + libb.Save (lib, saveProject: true); + FileAssert.Exists (Path.Combine(Root, path, lib.ProjectName, lib.ProjectFilePath)); appb.BuildLogFile = "build1.log"; appb.Target = target; - Assert.IsTrue (appb.DesignTimeBuild (proj), $"build should have succeeded for target `{target}`"); + Assert.IsTrue (appb.Build (proj, parameters: DesignerParameters), $"build should have succeeded for target `{target}`"); Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_UpdateAndroidResgen"), "_UpdateAndroidResgen should have run completely."); Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_Foo"), "_Foo should have run completely"); var customViewPath = Path.Combine (Root, appb.ProjectDirectory, proj.IntermediateOutputPath, "res", "layout", "custom_text.xml"); @@ -104,10 +105,10 @@ public CustomTextView(Context context, IAttributeSet attributes) : base(context, Assert.IsNotNull (doc.Element ("LinearLayout").Element ("unnamedproject.CustomTextView"), "unnamedproject.CustomTextView should have not been replaced with a $(Hash).CustomTextView"); // Build the library project now - Assert.IsTrue (libb.Build (lib, doNotCleanupOnUpdate: true), "library build should have succeeded."); + Assert.IsTrue (libb.Build (lib, doNotCleanupOnUpdate: true, saveProject: true), "library build should have succeeded."); appb.Target = "Build"; appb.BuildLogFile = "build2.log"; - Assert.IsTrue (appb.Build (proj, doNotCleanupOnUpdate: true, saveProject:false), "app build should have succeeded."); + Assert.IsTrue (appb.Build (proj, doNotCleanupOnUpdate: true, saveProject: false), "app build should have succeeded."); Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_UpdateAndroidResgen"), "_UpdateAndroidResgen should have run completely."); Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_Foo"), "_Foo should have run completely"); doc = XDocument.Load (customViewPath); @@ -117,7 +118,16 @@ public CustomTextView(Context context, IAttributeSet attributes) : base(context, "unnamedproject.CustomTextView should have been replaced with a $(Hash).CustomTextView"); appb.Target = target; appb.BuildLogFile = "build3.log"; - Assert.IsTrue (appb.DesignTimeBuild (proj, doNotCleanupOnUpdate: true), $"build should have succeeded for target `{target}`"); + Assert.IsTrue (appb.DesignTimeBuild (proj, parameters: DesignerParameters, doNotCleanupOnUpdate: true), $"build should have succeeded for target `{target}`"); + Assert.IsFalse (appb.Output.AreTargetsAllSkipped ("_UpdateAndroidResgen"), "_UpdateAndroidResgen should not have been skipped."); + Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_Foo"), "_Foo should have run completely"); + doc = XDocument.Load (customViewPath); + Assert.IsNull (doc.Element ("LinearLayout").Element ("UnnamedProject.CustomTextView"), + "UnnamedProject.CustomTextView should have been replaced with a $(Hash).CustomTextView"); + Assert.IsNull (doc.Element ("LinearLayout").Element ("unnamedproject.CustomTextView"), + "unnamedproject.CustomTextView should have been replaced with a $(Hash).CustomTextView"); + appb.BuildLogFile = "build4.log"; + Assert.IsTrue (appb.DesignTimeBuild (proj, parameters: DesignerParameters, doNotCleanupOnUpdate: true), $"build should have succeeded for target `{target}`"); Assert.IsTrue (appb.Output.AreTargetsAllSkipped ("_UpdateAndroidResgen"), "_UpdateAndroidResgen should have been skipped."); Assert.IsTrue (appb.Output.AreTargetsAllBuilt ("_Foo"), "_Foo should have run completely"); doc = XDocument.Load (customViewPath); diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets index b0c0e6b2917..1808bda30c1 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets @@ -47,6 +47,7 @@ This file is used by all project types, including binding projects. <_AndroidLibraryProjectImportsCache Condition=" '$(DesignTimeBuild)' == 'true' And !Exists ('$(_AndroidLibraryProjectImportsCache)') ">$(_AndroidLibraryProjectImportsDesignTimeCache) <_AndroidBuildPropertiesCache Condition=" '$(DesignTimeBuild)' == 'true' ">$(_AndroidDesignTimeBuildPropertiesCache) <_GeneratorStampFile Condition=" '$(DesignTimeBuild)' == 'true' ">$(_AndroidIntermediateDesignTimeStampDirectory)generator.stamp + <_AndroidResgenFlagFile Condition=" '$(DesignTimeBuild)' == 'true' ">$(_AndroidIntermediateDesignTimeBuildDirectory)R.cs.flag Date: Thu, 15 Aug 2024 16:26:57 +0100 Subject: [PATCH 7/8] Fix another test --- tests/MSBuildDeviceIntegration/Tests/InstantRunTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/MSBuildDeviceIntegration/Tests/InstantRunTest.cs b/tests/MSBuildDeviceIntegration/Tests/InstantRunTest.cs index b40cef56c6c..577c09a94ed 100644 --- a/tests/MSBuildDeviceIntegration/Tests/InstantRunTest.cs +++ b/tests/MSBuildDeviceIntegration/Tests/InstantRunTest.cs @@ -103,7 +103,7 @@ public void TargetsSkipped ([Values(false, true)] bool useManagedResourceGenerat // CoreCompile should be built. Assert.IsTrue (b.Output.IsTargetSkipped ("CoreCompile"), "5 CoreCompile was not skipped"); } else { - Assert.IsTrue (b.Output.IsTargetSkipped ("_UpdateAndroidResgen"), "5 second _UpdateAndroidResgen was not skipped"); + Assert.IsTrue (!b.Output.IsTargetSkipped ("_UpdateAndroidResgen"), "5 second _UpdateAndroidResgen was skipped"); // CoreCompile should not be built. Assert.IsTrue (b.Output.IsTargetSkipped ("CoreCompile"), "5 CoreCompile was not skipped"); } From 596916c446574d1db792c9e4295df9c3540476a9 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Fri, 16 Aug 2024 10:00:45 +0100 Subject: [PATCH 8/8] rework the change --- .../Xamarin.Android.DesignTime.targets | 4 ++-- tests/MSBuildDeviceIntegration/Tests/InstantRunTest.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets index 1808bda30c1..4569f574869 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.DesignTime.targets @@ -46,8 +46,8 @@ This file is used by all project types, including binding projects. <_AndroidLibraryImportsCache Condition=" '$(DesignTimeBuild)' == 'true' And !Exists ('$(_AndroidLibraryImportsCache)') ">$(_AndroidLibraryImportsDesignTimeCache) <_AndroidLibraryProjectImportsCache Condition=" '$(DesignTimeBuild)' == 'true' And !Exists ('$(_AndroidLibraryProjectImportsCache)') ">$(_AndroidLibraryProjectImportsDesignTimeCache) <_AndroidBuildPropertiesCache Condition=" '$(DesignTimeBuild)' == 'true' ">$(_AndroidDesignTimeBuildPropertiesCache) - <_GeneratorStampFile Condition=" '$(DesignTimeBuild)' == 'true' ">$(_AndroidIntermediateDesignTimeStampDirectory)generator.stamp - <_AndroidResgenFlagFile Condition=" '$(DesignTimeBuild)' == 'true' ">$(_AndroidIntermediateDesignTimeBuildDirectory)R.cs.flag + <_GeneratorStampFile Condition=" '$(DesignTimeBuild)' == 'true' And !Exists('$(_GeneratorStampFile)') ">$(_AndroidIntermediateDesignTimeStampDirectory)generator.stamp + <_AndroidResgenFlagFile Condition=" '$(DesignTimeBuild)' == 'true' And !Exists('$(_AndroidResgenFlagFile)') ">$(_AndroidIntermediateDesignTimeBuildDirectory)R.cs.flag