Skip to content

Commit 1abd430

Browse files
[.NET 5] fix XA1008 warning when $(TargetFrameworkVersion)=v5.0 (#4598)
Context: https://github.com/dotnet/designs/blob/master/accepted/2020/net5/net5.md Historically, Xamarin.Android has used `$(TargetFrameworkVersion)` to control the `Mono.Android.dll` binding which is used in apps, and was treated as the Android version number, e.g. `$(TargetFrameworkVersion)`=v5.0 caused Xamarin.Android pull in the `Mono.Android.dll` with bindings for *Android* 5.0 (API-21). With .NET 5, `$(TargetFrameworkVersion)` *instead* is the version of .NET, i.e. .NET 5 will have `$(TargetFrameworkVersion)`=v5.0. The (new?) `$(TargetPlatformVersion)` MSBuild property will now control which `Mono.Android.dll` binding version should be used. Unfortunately, not everything within the Xamarin.Android build system is cognizant of this change. Consequently, when building within a .NET 5 environment, *all* builds will emit this XA1008 warning: warning XA1008: The TargetFrameworkVersion (Android API level 21) is lower than the targetSdkVersion (29). Please increase the `$(TargetFrameworkVersion)` or decrease the `android:targetSdkVersion` in the `AndroidManifest.xml` so that the API levels match. The XA1008 warning is emitted because Google Play requires a minimum version of API-29 (Android v10.0), and `$(TargetFrameworkVersion)` was previously used to infer a minimum API level, and Android v5.0/API-21 is less than the required API-29. To fix this, I modified the `<CheckGoogleSdkRequirements/>` MSBuild task so that: 1. `CheckGoogleSdkRequirements.TargetFrameworkVersion` is optional. 2. A new `CheckGoogleSdkRequirements.ApiLevel` property is available, and allows explicitly providing the API level. In .NET 5 builds, `CheckGoogleSdkRequirements.TargetFrameworkVersion` won't be set; `CheckGoogleSdkRequirements.ApiLevel` will instead be set based on `$(_AndroidApiLevel)`. This way we will still get some important warnings for .NET 5 such as `targetSdkVersion` or `minSdkVersion` that need to be changed in the `AndroidManifest.xml` file. I also fixed up `LastBuildOutput`, we needed the value for .NET 5 MSBuild tests and I removed unnecessary usage of `yield return`.
1 parent 3c94f6f commit 1abd430

File tree

7 files changed

+46
-19
lines changed

7 files changed

+46
-19
lines changed

src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.Tooling.targets

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ called for "legacy" projects in Xamarin.Android.Legacy.targets.
1111

1212
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
1313

14-
<UsingTask TaskName="Xamarin.Android.Tasks.ValidateJavaVersion" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
15-
<UsingTask TaskName="Xamarin.Android.Tasks.ResolveAndroidTooling" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
16-
<UsingTask TaskName="Xamarin.Android.Tasks.RuntimeIdentifierToAbi" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
14+
<UsingTask TaskName="Xamarin.Android.Tasks.CheckGoogleSdkRequirements" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
15+
<UsingTask TaskName="Xamarin.Android.Tasks.ResolveAndroidTooling" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
16+
<UsingTask TaskName="Xamarin.Android.Tasks.RuntimeIdentifierToAbi" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
17+
<UsingTask TaskName="Xamarin.Android.Tasks.ValidateJavaVersion" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
1718

1819
<Target Name="_ResolveAndroidTooling">
1920
<ValidateJavaVersion
@@ -61,4 +62,12 @@ called for "legacy" projects in Xamarin.Android.Legacy.targets.
6162
</RuntimeIdentifierToAbi>
6263
</Target>
6364

65+
<Target Name="_CheckGoogleSdkRequirements"
66+
Condition="Exists('$(IntermediateOutputPath)android\AndroidManifest.xml') And '$(AndroidEnableGooglePlayStoreChecks)' == 'true' ">
67+
<CheckGoogleSdkRequirements
68+
ApiLevel="$(_AndroidApiLevel)"
69+
ManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml"
70+
/>
71+
</Target>
72+
6473
</Project>

src/Xamarin.Android.Build.Tasks/Tasks/CheckGoogleSdkRequirements.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,26 @@ public class CheckGoogleSdkRequirements : AndroidTask
1414
{
1515
public override string TaskPrefix => "CGS";
1616

17-
[Required]
17+
/// <summary>
18+
/// This will be blank for .NET 5 builds
19+
/// </summary>
1820
public string TargetFrameworkVersion { get; set; }
1921

22+
/// <summary>
23+
/// This is used instead of TargetFrameworkVersion for .NET 5 builds
24+
/// </summary>
25+
public int ApiLevel { get; set; }
26+
2027
[Required]
2128
public string ManifestFile { get; set; }
2229

2330
public override bool RunTask ()
2431
{
2532
ManifestDocument manifest = new ManifestDocument (ManifestFile);
2633

27-
var compileSdk = MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (TargetFrameworkVersion);
34+
var compileSdk = string.IsNullOrEmpty (TargetFrameworkVersion) ?
35+
ApiLevel :
36+
MonoAndroidHelper.SupportedVersions.GetApiLevelFromFrameworkVersion (TargetFrameworkVersion);
2837

2938
if (!int.TryParse (manifest.GetMinimumSdk (), out int minSdk)) {
3039
minSdk = 1;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public void DotNetPublish (string runtimeIdentifier, bool isRelease)
6969

7070
var dotnet = CreateDotNetBuilder (proj);
7171
Assert.IsTrue (dotnet.Publish (), "`dotnet publish` should succeed");
72+
Assert.IsTrue (StringAssertEx.ContainsText (dotnet.LastBuildOutput, " 0 Warning(s)"), "Should have no MSBuild warnings.");
7273

7374
var apk = Path.Combine (Root, dotnet.ProjectDirectory, proj.OutputPath,
7475
runtimeIdentifier, "UnnamedProject.UnnamedProject.apk");

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,9 @@ public class Builder : IDisposable
3030
public IEnumerable<string> LastBuildOutput {
3131
get {
3232
if (!string.IsNullOrEmpty (buildLogFullPath) && File.Exists (buildLogFullPath)) {
33-
foreach (var line in File.ReadLines (buildLogFullPath, Encoding.UTF8)) {
34-
yield return line;
35-
}
33+
return File.ReadLines (buildLogFullPath, Encoding.UTF8);
3634
}
37-
yield return String.Empty;
35+
return Enumerable.Empty<string> ();
3836
}
3937
}
4038
public TimeSpan LastBuildTime { get; protected set; }

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetCLI.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.IO;
5+
using System.Linq;
56
using System.Text;
67

78
namespace Xamarin.ProjectTools
@@ -84,6 +85,15 @@ public bool Publish (string target = null)
8485
return Execute (arguments.ToArray ());
8586
}
8687

88+
public IEnumerable<string> LastBuildOutput {
89+
get {
90+
if (!string.IsNullOrEmpty (BuildLogFile) && File.Exists (BuildLogFile)) {
91+
return File.ReadLines (BuildLogFile, Encoding.UTF8);
92+
}
93+
return Enumerable.Empty<string> ();
94+
}
95+
}
96+
8797
List<string> GetDefaultCommandLineArgs (string verb, string target = null)
8898
{
8999
string testDir = Path.GetDirectoryName (projectOrSolution);

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved.
4040
<UsingTask TaskName="Xamarin.Android.Tasks.CalculateAdditionalResourceCacheDirectories" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
4141
<UsingTask TaskName="Xamarin.Android.Tasks.CalculateLayoutCodeBehind" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
4242
<UsingTask TaskName="Xamarin.Android.Tasks.CalculateProjectDependencies" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
43-
<UsingTask TaskName="Xamarin.Android.Tasks.CheckGoogleSdkRequirements" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
4443
<UsingTask TaskName="Xamarin.Android.Tasks.CheckForRemovedItems" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
4544
<UsingTask TaskName="Xamarin.Android.Tasks.CheckForInvalidResourceFileNames" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
4645
<UsingTask TaskName="Xamarin.Android.Tasks.CompileToDalvik" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
@@ -550,14 +549,6 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved.
550549
/>
551550
</Target>
552551

553-
<Target Name="_CheckGoogleSdkRequirements"
554-
Condition="Exists('$(IntermediateOutputPath)android\AndroidManifest.xml') And '$(AndroidEnableGooglePlayStoreChecks)' == 'true' ">
555-
<CheckGoogleSdkRequirements
556-
TargetFrameworkVersion="$(TargetFrameworkVersion)"
557-
ManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml"
558-
/>
559-
</Target>
560-
561552
<!--
562553
*******************************************
563554
Application Build

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Legacy.targets

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ projects. .NET 5 projects will not import this file.
143143
</CleanDependsOn>
144144
</PropertyGroup>
145145

146-
<UsingTask TaskName="Xamarin.Android.Tasks.Legacy.ValidateJavaVersion" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
146+
<UsingTask TaskName="Xamarin.Android.Tasks.CheckGoogleSdkRequirements" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
147+
<UsingTask TaskName="Xamarin.Android.Tasks.Legacy.ValidateJavaVersion" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
147148
<UsingTask TaskName="Xamarin.Android.Tasks.Legacy.ResolveAndroidTooling" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
148149

149150
<Target Name="_GetReferenceAssemblyPaths">
@@ -245,4 +246,12 @@ projects. .NET 5 projects will not import this file.
245246
</ItemGroup>
246247
</Target>
247248

249+
<Target Name="_CheckGoogleSdkRequirements"
250+
Condition="Exists('$(IntermediateOutputPath)android\AndroidManifest.xml') And '$(AndroidEnableGooglePlayStoreChecks)' == 'true' ">
251+
<CheckGoogleSdkRequirements
252+
TargetFrameworkVersion="$(TargetFrameworkVersion)"
253+
ManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml"
254+
/>
255+
</Target>
256+
248257
</Project>

0 commit comments

Comments
 (0)