diff --git a/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs b/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs
index 7ba12c9a..5955292b 100644
--- a/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs
+++ b/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Linq;
using System.Xml;
using System.Collections.Generic;
@@ -45,7 +45,7 @@ public class AndroidAppManifest
if (manifest.Element ("uses-sdk") is XElement uses)
usesSdk = uses;
else
- manifest.Add (usesSdk = new XElement ("uses-sdk"));
+ usesSdk = new XElement ("uses-sdk");
}
public static string CanonicalizePackageName (string packageNameOrAssemblyName)
@@ -71,7 +71,6 @@ public static AndroidAppManifest Create (string packageName, string appLabel, An
return new AndroidAppManifest (versions, XDocument.Parse (
@"
-
")) {
@@ -102,6 +101,14 @@ public static AndroidAppManifest Load (XDocument doc, AndroidVersions versions)
public void Write (XmlWriter writer)
{
+ // Make sure that if the XML element does not have any attributes (i.e. minSdkVersion
+ // and targetSdkVersion), do NOT write it into the output. This is to avoid issues like
+ // https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1874249/
+ if (usesSdk.HasAttributes && usesSdk.Parent == null)
+ manifest.Add (usesSdk);
+ else if (!usesSdk.HasAttributes && usesSdk.Parent != null)
+ usesSdk.Remove ();
+
doc.Save (writer);
}
diff --git a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs
index 243224d5..5c58199a 100644
--- a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs
+++ b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
@@ -172,5 +172,45 @@ public void CanGetAppTheme ()
Assert.AreEqual ("@android:style/Theme.Material.Light", manifest.ApplicationTheme);
}
+
+ [Test]
+ public void CanAddAndRemoveUsesSdk ()
+ {
+ XNamespace aNS = "http://schemas.android.com/apk/res/android";
+ var versions = new AndroidVersions (new AndroidVersion [0]);
+ var doc = XDocument.Parse (@"
+
+
+
+
+ ");
+ var manifest = AndroidAppManifest.Load (doc, versions);
+
+ manifest.MinSdkVersion = null;
+ manifest.TargetSdkVersion = null;
+
+ var sb = new StringBuilder ();
+ using (var writer = XmlWriter.Create (sb)) {
+ manifest.Write (writer);
+ }
+
+ var newDoc = XDocument.Parse (sb.ToString ());
+ var usesSdk = newDoc.Element ("manifest").Element ("uses-sdk");
+ Assert.IsNull (usesSdk, "uses-sdk should not exist");
+
+ manifest.MinSdkVersion = 8;
+ manifest.TargetSdkVersion = 12;
+
+ sb = new StringBuilder ();
+ using (var writer = XmlWriter.Create (sb)) {
+ manifest.Write (writer);
+ }
+
+ newDoc = XDocument.Parse (sb.ToString ());
+ usesSdk = newDoc.Element ("manifest").Element ("uses-sdk");
+ Assert.IsNotNull (usesSdk, "uses-sdk should exist");
+ Assert.AreEqual ("8", usesSdk.Attribute (aNS + "minSdkVersion").Value);
+ Assert.AreEqual ("12", usesSdk.Attribute (aNS + "targetSdkVersion").Value);
+ }
}
}