Skip to content

Commit a698a33

Browse files
authored
Merge pull request #227 from xamarin/dev/jestedfa/uses-sdk
Only conditionally include <uses-sdk /> in the AndroidManifest.xml wh…
2 parents ed102fc + 8b13954 commit a698a33

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Linq;
33
using System.Xml;
44
using System.Collections.Generic;
@@ -45,7 +45,7 @@ public class AndroidAppManifest
4545
if (manifest.Element ("uses-sdk") is XElement uses)
4646
usesSdk = uses;
4747
else
48-
manifest.Add (usesSdk = new XElement ("uses-sdk"));
48+
usesSdk = new XElement ("uses-sdk");
4949
}
5050

5151
public static string CanonicalizePackageName (string packageNameOrAssemblyName)
@@ -71,7 +71,6 @@ public static AndroidAppManifest Create (string packageName, string appLabel, An
7171
return new AndroidAppManifest (versions, XDocument.Parse (
7272
@"<?xml version=""1.0"" encoding=""utf-8""?>
7373
<manifest xmlns:android=""http://schemas.android.com/apk/res/android"" android:versionCode=""1"" android:versionName=""1.0"">
74-
<uses-sdk />
7574
<application android:label="""">
7675
</application>
7776
</manifest>")) {
@@ -102,6 +101,14 @@ public static AndroidAppManifest Load (XDocument doc, AndroidVersions versions)
102101

103102
public void Write (XmlWriter writer)
104103
{
104+
// Make sure that if the <uses-sdk /> XML element does not have any attributes (i.e. minSdkVersion
105+
// and targetSdkVersion), do NOT write it into the output. This is to avoid issues like
106+
// https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1874249/
107+
if (usesSdk.HasAttributes && usesSdk.Parent == null)
108+
manifest.Add (usesSdk);
109+
else if (!usesSdk.HasAttributes && usesSdk.Parent != null)
110+
usesSdk.Remove ();
111+
105112
doc.Save (writer);
106113
}
107114

tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.IO;
@@ -172,5 +172,45 @@ public void CanGetAppTheme ()
172172

173173
Assert.AreEqual ("@android:style/Theme.Material.Light", manifest.ApplicationTheme);
174174
}
175+
176+
[Test]
177+
public void CanAddAndRemoveUsesSdk ()
178+
{
179+
XNamespace aNS = "http://schemas.android.com/apk/res/android";
180+
var versions = new AndroidVersions (new AndroidVersion [0]);
181+
var doc = XDocument.Parse (@"
182+
<manifest xmlns:android=""http://schemas.android.com/apk/res/android"" android:versionCode=""1"" android:versionName=""1.0"" package=""com.xamarin.Foo"">
183+
<uses-sdk android:minSdkVersion=""8"" android:targetSdkVersion=""12"" />
184+
<application android:label=""Foo"" android:icon=""@drawable/ic_icon"" android:theme=""@android:style/Theme.Material.Light"">
185+
</application>
186+
</manifest>");
187+
var manifest = AndroidAppManifest.Load (doc, versions);
188+
189+
manifest.MinSdkVersion = null;
190+
manifest.TargetSdkVersion = null;
191+
192+
var sb = new StringBuilder ();
193+
using (var writer = XmlWriter.Create (sb)) {
194+
manifest.Write (writer);
195+
}
196+
197+
var newDoc = XDocument.Parse (sb.ToString ());
198+
var usesSdk = newDoc.Element ("manifest").Element ("uses-sdk");
199+
Assert.IsNull (usesSdk, "uses-sdk should not exist");
200+
201+
manifest.MinSdkVersion = 8;
202+
manifest.TargetSdkVersion = 12;
203+
204+
sb = new StringBuilder ();
205+
using (var writer = XmlWriter.Create (sb)) {
206+
manifest.Write (writer);
207+
}
208+
209+
newDoc = XDocument.Parse (sb.ToString ());
210+
usesSdk = newDoc.Element ("manifest").Element ("uses-sdk");
211+
Assert.IsNotNull (usesSdk, "uses-sdk should exist");
212+
Assert.AreEqual ("8", usesSdk.Attribute (aNS + "minSdkVersion").Value);
213+
Assert.AreEqual ("12", usesSdk.Attribute (aNS + "targetSdkVersion").Value);
214+
}
175215
}
176216
}

0 commit comments

Comments
 (0)