diff --git a/src/SingleProject/Resizetizer/src/nuget/buildTransitive/Microsoft.Maui.Resizetizer.After.targets b/src/SingleProject/Resizetizer/src/nuget/buildTransitive/Microsoft.Maui.Resizetizer.After.targets
index 414905d8decd..d3fd5474e8bb 100644
--- a/src/SingleProject/Resizetizer/src/nuget/buildTransitive/Microsoft.Maui.Resizetizer.After.targets
+++ b/src/SingleProject/Resizetizer/src/nuget/buildTransitive/Microsoft.Maui.Resizetizer.After.targets
@@ -341,7 +341,7 @@
diff --git a/src/TestUtils/src/Microsoft.Maui.IntegrationTests/ResizetizerTests.cs b/src/TestUtils/src/Microsoft.Maui.IntegrationTests/ResizetizerTests.cs
index f853b5aee2e5..f608baae7bd2 100644
--- a/src/TestUtils/src/Microsoft.Maui.IntegrationTests/ResizetizerTests.cs
+++ b/src/TestUtils/src/Microsoft.Maui.IntegrationTests/ResizetizerTests.cs
@@ -101,6 +101,73 @@ public void CollectsAssets(string id, string libid, bool unpackaged)
"Windows was missing the image file.");
}
+ [Fact]
+ public void ChangingExternalBackendPlatformTypeInvalidatesImages()
+ {
+ SetTestIdentifier("external-backend-platform-invalidation");
+ var projectDir = TestDirectory;
+ var projectFile = Path.Combine(projectDir, "ExternalBackend.csproj");
+ var imageFile = Path.Combine(projectDir, "image.svg");
+
+ File.WriteAllText(imageFile, BlankSvgContents);
+ File.WriteAllText(projectFile,
+ $$"""
+
+
+ {{DotNetCurrent}}
+ generic
+
+
+
+
+
+
+ """);
+
+ Assert.True(DotnetInternal.Build(projectFile, "Debug", target: "ResizetizeImages", properties: BuildProps, output: _output),
+ "External backend project failed to process generic images. Check test output for errors.");
+
+ var intermediateDir = Path.Combine(projectDir, "obj", "Debug", DotNetCurrent);
+ var outputsFile = Path.Combine(intermediateDir, "mauiimage.outputs");
+ var stampFile = Path.Combine(intermediateDir, "mauiimage.stamp");
+ Assert.True(File.Exists(outputsFile), $"Resizetizer output list does not exist: {outputsFile}");
+ Assert.True(File.Exists(stampFile), $"Resizetizer stamp does not exist: {stampFile}");
+
+ var genericImages = File.ReadAllLines(outputsFile);
+ Assert.Equal(2, genericImages.Length);
+ Assert.Contains(genericImages, path => path.EndsWith("image.png", StringComparison.OrdinalIgnoreCase));
+ Assert.Contains(genericImages, path => path.EndsWith("image@2x.png", StringComparison.OrdinalIgnoreCase));
+
+ File.WriteAllText(
+ projectFile,
+ File.ReadAllText(projectFile).Replace(
+ "generic",
+ "android",
+ StringComparison.Ordinal));
+ File.SetLastWriteTimeUtc(stampFile, DateTime.UtcNow.AddHours(1));
+ var invalidationSentinel = File.GetLastWriteTimeUtc(stampFile);
+
+ Assert.True(DotnetInternal.Build(projectFile, "Debug", target: "ResizetizeImages", properties: BuildProps, output: _output),
+ "External backend project failed after changing its platform type to android.");
+ Assert.True(File.GetLastWriteTimeUtc(stampFile) < invalidationSentinel,
+ "ResizetizeImages should rerun when only ResizetizerPlatformType changes.");
+
+ var androidImages = File.ReadAllLines(outputsFile);
+ Assert.Equal(5, androidImages.Length);
+ Assert.All(androidImages, path =>
+ {
+ Assert.StartsWith("drawable-", Path.GetFileName(Path.GetDirectoryName(path)), StringComparison.OrdinalIgnoreCase);
+ Assert.True(File.Exists(path), $"Processed Android image does not exist: {path}");
+ });
+ Assert.All(genericImages, path => Assert.False(File.Exists(path), $"Stale generic image still exists: {path}"));
+
+ File.SetLastWriteTimeUtc(stampFile, DateTime.UtcNow.AddMinutes(1));
+ var noOpSentinel = File.GetLastWriteTimeUtc(stampFile);
+ Assert.True(DotnetInternal.Build(projectFile, "Debug", target: "ResizetizeImages", properties: BuildProps, output: _output),
+ "External backend project failed on an unchanged rebuild.");
+ Assert.Equal(noOpSentinel, File.GetLastWriteTimeUtc(stampFile));
+ }
+
[Fact]
public void CustomBackendProcessesImagesWithoutBuiltInOutputInjection()
{