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 882b4d3f1c9..30fcc1ca399 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
@@ -486,6 +486,8 @@ public void MergeLibraryManifest ()
android:authorities='${applicationId}.FacebookInitProvider'
android:name='.internal.FacebookInitProvider'
android:exported='false' />
+
+
", encoding: System.Text.Encoding.UTF8);
@@ -522,6 +524,8 @@ public void MergeLibraryManifest ()
"${applicationId}.FacebookInitProvider was not replaced with com.xamarin.manifest.FacebookInitProvider");
Assert.IsTrue (manifest.Contains ("com.xamarin.test.internal.FacebookInitProvider"),
".internal.FacebookInitProvider was not replaced with com.xamarin.test.internal.FacebookInitProvider");
+ Assert.AreEqual (manifest.IndexOf ("meta-data", StringComparison.OrdinalIgnoreCase),
+ manifest.LastIndexOf ("meta-data", StringComparison.OrdinalIgnoreCase), "There should be only one meta-data element");
}
}
}
diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs
index 971a43f130f..a251207f38e 100644
--- a/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs
+++ b/src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs
@@ -402,6 +402,16 @@ void MergeLibraryManifest (string mergedManifest)
}
}
+ void RemoveDuplicateElements ()
+ {
+ var duplicates = doc.Descendants ()
+ .GroupBy (x => x.ToFullString ())
+ .SelectMany (x => x.Skip (1));
+ foreach (var duplicate in duplicates)
+ duplicate.Remove ();
+
+ }
+
IEnumerable FixupNameElements(string packageName, IEnumerable nodes)
{
foreach (var element in nodes.Select ( x => x as XElement).Where (x => x != null && ManifestAttributeFixups.ContainsKey (x.Name.LocalName))) {
@@ -839,6 +849,7 @@ public void Save (string filename)
public void Save (System.IO.TextWriter stream)
{
+ RemoveDuplicateElements ();
var ms = new MemoryStream ();
doc.Save (ms);
ms.Flush ();
diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/XDocumentExtensions.cs b/src/Xamarin.Android.Build.Tasks/Utilities/XDocumentExtensions.cs
index d05efb5ab68..5bac4ba45a3 100644
--- a/src/Xamarin.Android.Build.Tasks/Utilities/XDocumentExtensions.cs
+++ b/src/Xamarin.Android.Build.Tasks/Utilities/XDocumentExtensions.cs
@@ -22,6 +22,11 @@ public static string[] GetPaths (this XDocument doc, params string[] paths)
e = e.Elements (p);
return e.Select (p => p.Value).ToArray ();
}
+
+ public static string ToFullString (this XElement element)
+ {
+ return element.ToString (SaveOptions.DisableFormatting);
+ }
}
}