diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs index d54902cb4ca..4e3a93f3b2f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ManifestTest.cs @@ -213,6 +213,56 @@ public void OverlayManifestTest ([Values] AndroidRuntime runtime) } } + [Test] + public void OverlayManifestIncrementalBuildTest ([Values] AndroidRuntime runtime) + { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + var proj = new XamarinAndroidApplicationProject () { + IsRelease = isRelease, + ManifestMerger = "manifestmerger.jar", + }; + proj.SetRuntime (runtime); + proj.AndroidManifest = @" + + + +"; + var overlay = new BuildItem ("AndroidManifestOverlay", "ManifestOverlay.xml") { + TextContent = () => @" + + + +" + }; + proj.OtherBuildItems.Add (overlay); + using (var b = CreateApkBuilder (cleanupAfterSuccessfulBuild: false, cleanupOnDispose: false)) { + Assert.IsTrue (b.Build (proj), "First build should have succeeded."); + var text = b.Output.GetIntermediaryAsText ("android/AndroidManifest.xml"); + StringAssert.Contains ("android.permission.CAMERA", text, "Merged manifest should contain the initial overlay permission."); + StringAssert.DoesNotContain ("android.permission.RECORD_AUDIO", text, "Merged manifest should not contain the updated overlay permission yet."); + + Assert.IsTrue (b.Build (proj, doNotCleanupOnUpdate: true, saveProject: false), "Second build should have succeeded."); + b.Output.AssertTargetIsSkipped ("_ManifestMerger"); + + overlay.TextContent = () => @" + + + + +"; + proj.Touch ("ManifestOverlay.xml"); + + Assert.IsTrue (b.Build (proj, doNotCleanupOnUpdate: true, saveProject: false), "Third build should have succeeded."); + b.Output.AssertTargetIsNotSkipped ("_ManifestMerger"); + + text = b.Output.GetIntermediaryAsText ("android/AndroidManifest.xml"); + StringAssert.Contains ("android.permission.RECORD_AUDIO", text, "Merged manifest should include permissions from the updated overlay."); + } + } + [Test] public void RemovePermissionTest ([Values] AndroidRuntime runtime) { diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 84e1a46857c..c2527d1954e 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -1495,7 +1495,7 @@ because xbuild doesn't support framework reference assemblies.