Skip to content

Commit 23a5281

Browse files
[Xamarin.Android.Build.Tasks] fix <uses-sdk/> & use Xamarin.Forms 4.7
Context: dotnet/maui-samples@571e1c0 Xamarin.Forms 4.7.x is required to solve a crash on startup in .NET 5+. We should bump to Xamarin.Forms 4.7 in our MSBuild tests. This requires some additional AndroidX packages to be bumped. However, after doing this I got build warnings such as: warning XA1006: Android API level 30 is higher than the targetSdkVersion (28). Please increase the `android:targetSdkVersion` in the `AndroidManifest.xml` so that the API levels match. The project has a `AndroidManifest.xml` with an empty `<uses-sdk/>` element, but `obj\Debug\android\AndroidManifest.xml` has 28 listed. The projects that the MSBuild tests generate have an empty `<uses-sdk/>` by default. So where does `targetSdkVersion="28"` come from? The `Xamarin.AndroidX.Media` NuGet package brings in: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="androidx.media" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="28" /> ... This is coming directly from the `.aar` file via: https://maven.google.com/androidx/media/media/1.1.0/media-1.1.0.aar Reviewing the code in `ManifestDocument`, it seems like we should be replacing the `targetSdkVersion` for empty `<uses-sdk/>` elements? After cleaning up the code a bit, it now will properly subsitute `targetSdkVersion="30"` in .NET 5 projects. The impacted MSBuild tests will now pass under a `dotnet` context.
1 parent eb89395 commit 23a5281

File tree

7 files changed

+41
-20
lines changed

7 files changed

+41
-20
lines changed

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1908,14 +1908,14 @@ public void CheckLintConfigMerging ()
19081908
}
19091909

19101910
[Test]
1911+
[Category ("dotnet")]
19111912
/// <summary>
19121913
/// Reference https://bugzilla.xamarin.com/show_bug.cgi?id=29568
19131914
/// </summary>
19141915
public void BuildLibraryWhichUsesResources ([Values (false, true)] bool isRelease)
19151916
{
1916-
var proj = new XamarinAndroidLibraryProject () { IsRelease = isRelease };
1917-
proj.PackageReferences.Add (KnownPackages.AndroidSupportV4_27_0_2_1);
1918-
proj.PackageReferences.Add (KnownPackages.SupportV7AppCompat_27_0_2_1);
1917+
var proj = new XamarinAndroidLibraryProject { IsRelease = isRelease };
1918+
proj.PackageReferences.Add (KnownPackages.AndroidXAppCompat);
19191919
proj.AndroidResources.Add (new AndroidItem.AndroidResource ("Resources\\values\\Styles.xml") {
19201920
TextContent = () => @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
19211921
<resources>
@@ -4112,6 +4112,7 @@ public void AbiDelimiters ([Values ("armeabi-v7a%3bx86", "armeabi-v7a,x86")] str
41124112
}
41134113

41144114
[Test]
4115+
[Category ("dotnet")]
41154116
public void WorkManager ()
41164117
{
41174118
var proj = new XamarinFormsAndroidApplicationProject ();
@@ -4129,7 +4130,8 @@ public MyWorker (Context c, WorkerParameters p) : base (c, p) { }
41294130
}
41304131
"
41314132
});
4132-
proj.PackageReferences.Add (KnownPackages.Android_Arch_Work_Runtime);
4133+
proj.PackageReferences.Add (
4134+
Builder.UseDotNet ? KnownPackages.AndroidXWorkRuntime : KnownPackages.Android_Arch_Work_Runtime);
41334135
using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) {
41344136
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");
41354137
}

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,7 @@ public void AndroidAssetMissing ()
11311131
}
11321132

11331133
[Test]
1134+
[Category ("dotnet")]
11341135
[NonParallelizable]
11351136
public void AndroidXMigrationBug ()
11361137
{

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownPackages.cs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -222,9 +222,14 @@ public static void AddDotNetCompatPackages (this IShortFormProject project)
222222
},
223223
}
224224
};
225-
public static Package XamarinForms_4_5_0_617 = new Package {
225+
public static Package XamarinForms_4_7_0_1142 = new Package {
226226
Id = "Xamarin.Forms",
227-
Version = "4.5.0.617",
227+
Version = "4.7.0.1142",
228+
TargetFramework = "MonoAndroid10.0",
229+
};
230+
public static Package XamarinFormsMaps_4_7_0_1142 = new Package {
231+
Id = "Xamarin.Forms.Maps",
232+
Version = "4.7.0.1142",
228233
TargetFramework = "MonoAndroid10.0",
229234
};
230235
/* additional packages for XForms 4.5 on NET5 */
@@ -301,12 +306,12 @@ public static void AddDotNetCompatPackages (this IShortFormProject project)
301306
};
302307
public static Package AndroidXAppCompat = new Package {
303308
Id = "Xamarin.AndroidX.AppCompat",
304-
Version = "1.1.0",
309+
Version = "1.1.0.1",
305310
TargetFramework = "MonoAndroid10",
306311
};
307312
public static Package AndroidXBrowser = new Package {
308313
Id = "Xamarin.AndroidX.Browser",
309-
Version = "1.0.0",
314+
Version = "1.2.0.1",
310315
TargetFramework = "MonoAndroid90",
311316
References = {
312317
new BuildItem.Reference ("Xamarin.AndroidX.Browser") {
@@ -316,7 +321,7 @@ public static void AddDotNetCompatPackages (this IShortFormProject project)
316321
};
317322
public static Package AndroidXMediaRouter = new Package {
318323
Id = "Xamarin.AndroidX.MediaRouter",
319-
Version = "1.1.0",
324+
Version = "1.1.0.1",
320325
TargetFramework = "MonoAndroid90",
321326
References = {
322327
new BuildItem.Reference ("Xamarin.AndroidX.MediaRouter") {
@@ -326,7 +331,7 @@ public static void AddDotNetCompatPackages (this IShortFormProject project)
326331
};
327332
public static Package AndroidXLegacySupportV4 = new Package {
328333
Id = "Xamarin.AndroidX.Legacy.Support.V4",
329-
Version = "1.0.0",
334+
Version = "1.0.0.1",
330335
TargetFramework = "MonoAndroid90",
331336
References = {
332337
new BuildItem.Reference ("Xamarin.AndroidX.Legacy.Support.V4") {
@@ -336,7 +341,7 @@ public static void AddDotNetCompatPackages (this IShortFormProject project)
336341
};
337342
public static Package AndroidXLifecycleLiveData = new Package {
338343
Id = "Xamarin.AndroidX.Lifecycle.LiveData",
339-
Version = "2.1.0",
344+
Version = "2.2.0.1",
340345
TargetFramework = "MonoAndroid90",
341346
References = {
342347
new BuildItem.Reference ("Xamarin.AndroidX.Lifecycle.LiveData") {
@@ -354,9 +359,19 @@ public static void AddDotNetCompatPackages (this IShortFormProject project)
354359
},
355360
}
356361
};
362+
public static Package AndroidXWorkRuntime = new Package {
363+
Id = "Xamarin.AndroidX.Work.Runtime",
364+
Version = "2.3.4.3",
365+
TargetFramework = "MonoAndroid90",
366+
References = {
367+
new BuildItem.Reference("Xamarin.AndroidX.Work.Runtime") {
368+
MetadataValues = "HintPath=..\\packages\\Xamarin.AndroidX.Work.Runtime.2.3.4.3\\lib\\MonoAndroid90\\Xamarin.AndroidX.Work.Runtime.dll"
369+
}
370+
}
371+
};
357372
public static Package XamarinGoogleAndroidMaterial = new Package {
358373
Id = "Xamarin.Google.Android.Material",
359-
Version = "1.0.0",
374+
Version = "1.0.0.1",
360375
TargetFramework = "MonoAndroid90",
361376
References = {
362377
new BuildItem.Reference ("Xamarin.Google.Android.Material") {

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinFormsAndroidApplicationProject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public XamarinFormsAndroidApplicationProject (string debugConfigurationName = "D
4141
: base (debugConfigurationName, releaseConfigurationName)
4242
{
4343
if (Builder.UseDotNet) {
44-
PackageReferences.Add (KnownPackages.XamarinForms_4_5_0_617);
44+
PackageReferences.Add (KnownPackages.XamarinForms_4_7_0_1142);
4545
this.AddDotNetCompatPackages ();
4646
} else {
4747
PackageReferences.Add (KnownPackages.XamarinForms_4_0_0_425677);

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinFormsMapsApplicationProject.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ static XamarinFormsMapsApplicationProject ()
1515

1616
public XamarinFormsMapsApplicationProject ()
1717
{
18-
PackageReferences.Add (KnownPackages.XamarinFormsMaps_4_0_0_425677);
18+
if (Builder.UseDotNet) {
19+
PackageReferences.Add (KnownPackages.XamarinFormsMaps_4_7_0_1142);
20+
} else {
21+
PackageReferences.Add (KnownPackages.XamarinFormsMaps_4_0_0_425677);
22+
}
1923
MainActivity = MainActivity.Replace ("//${AFTER_FORMS_INIT}", "Xamarin.FormsMaps.Init (this, savedInstanceState);");
2024
//NOTE: API_KEY metadata just has to *exist*
2125
AndroidManifest = AndroidManifest.Replace ("</application>", "<meta-data android:name=\"com.google.android.maps.v2.API_KEY\" android:value=\"\" /></application>");

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinFormsXASdkProject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ static XamarinFormsXASdkProject ()
4343
public XamarinFormsXASdkProject (string outputType = "Exe")
4444
: base (outputType)
4545
{
46-
PackageReferences.Add (KnownPackages.XamarinForms_4_5_0_617);
46+
PackageReferences.Add (KnownPackages.XamarinForms_4_7_0_1142);
4747
this.AddDotNetCompatPackages ();
4848

4949
// Workaround for AndroidX, see: https://github.com/xamarin/AndroidSupportComponents/pull/239

src/Xamarin.Android.Build.Tasks/Utilities/ManifestDocument.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,16 +259,15 @@ public IList<string> Merge (TaskLoggingHelper log, TypeDefinitionCache cache, Li
259259

260260
// If no <uses-sdk> is specified, add it with both minSdkVersion and
261261
// targetSdkVersion set to TargetFrameworkVersion
262-
if (!manifest.Elements ("uses-sdk").Any ()) {
262+
var uses = manifest.Element ("uses-sdk");
263+
if (uses == null) {
263264
manifest.AddFirst (
264-
new XElement ("uses-sdk",
265+
uses = new XElement ("uses-sdk",
265266
new XAttribute (androidNs + "minSdkVersion", SdkVersionName),
266267
new XAttribute (androidNs + "targetSdkVersion", SdkVersionName)));
267268
}
268269

269270
// If no minSdkVersion is specified, set it to TargetFrameworkVersion
270-
var uses = manifest.Element ("uses-sdk");
271-
272271
if (uses.Attribute (androidNs + "minSdkVersion") == null) {
273272
int minSdkVersion;
274273
if (!int.TryParse (SdkVersionName, out minSdkVersion))
@@ -282,7 +281,7 @@ public IList<string> Merge (TaskLoggingHelper log, TypeDefinitionCache cache, Li
282281
if (tsv != null)
283282
targetSdkVersion = tsv.Value;
284283
else {
285-
targetSdkVersion = SdkVersionName;
284+
uses.SetAttributeValue (androidNs + "targetSdkVersion", targetSdkVersion = SdkVersionName);
286285
uses.AddBeforeSelf (new XComment ("suppress UsesMinSdkAttributes"));
287286
}
288287

0 commit comments

Comments
 (0)