Skip to content

Commit

Permalink
[One .NET] Fix targeting API 33, build API 31 ref pack (#6896)
Browse files Browse the repository at this point in the history
Fixes: #6914

The Microsoft.Android `@(KnownFrameworkReference)` will now declare
targeting and runtime pack metadata that is based on the
`$(TargetPlatformVersion)` of the project file.  The only exception to
this rule is when '$(TargetPlatformVersion)' == '31.0'; in this case the
project will use an API 31 ref pack with API 32 runtime packs.  The
inline `Microsoft.Android.Sdk.BundledVersions.targets` file content
has been moved into a separate file to improve the readability of the
`@(KnownFrameworkReference)` element.

Breakdown of supported `$(TargetFramework)` -> ref/runtime pack used:

| `$(TargetFramework)` | Targeting Pack | Runtime Pack |
| -------------------- | -------------- | ------------ |
| net6.0-android     | Microsoft.Android.Ref.31 | Microsoft.Android.Runtime.32 |
| net6.0-android31.0 | Microsoft.Android.Ref.31 | Microsoft.Android.Runtime.32 |
| net6.0-android32.0 | Microsoft.Android.Ref.32 | Microsoft.Android.Runtime.32 |
| net6.0-android33.0 | Microsoft.Android.Ref.33 | Microsoft.Android.Runtime.33 |

Tests have been updated accordingly, and they will now use a dynamic
test case source that should make sure we don't miss any coverage when
making future updates to `$(AndroidDefaultTargetDotnetApiLevel)`,
`$(AndroidLatestStableApiLevel)`, and `$(AndroidLatestUnstableApiLevel)`.

If an unsupported `$(TargetFramework)` is used in a project file the
following errors will now be displayed:

    "test.csproj" (_GenerateRestoreGraphProjectEntry target) (1:5) ->
       (ProcessFrameworkReferences target) ->
         C:\Program Files\dotnet\sdk\6.0.300-preview.22211.2\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.FrameworkReferenceResolution.targets(90,5): error : NETSDKZZZZ: Error getting pack version: Pack 'Microsoft.Android.Ref.25' was not present in workload manifests.
         C:\Program Files\dotnet\sdk\6.0.300-preview.22211.2\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.FrameworkReferenceResolution.targets(90,5): error : NETSDKZZZZ: Error getting pack version: Pack 'Microsoft.Android.Runtime.25.android-arm' was not present in workload manifests.
         C:\Program Files\dotnet\sdk\6.0.300-preview.22211.2\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.FrameworkReferenceResolution.targets(90,5): error : NETSDKZZZZ: Error getting pack version: Pack 'Microsoft.Android.Runtime.25.android-arm64' was not present in workload manifests.
         C:\Program Files\dotnet\sdk\6.0.300-preview.22211.2\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.FrameworkReferenceResolution.targets(90,5): error : NETSDKZZZZ: Error getting pack version: Pack 'Microsoft.Android.Runtime.25.android-x86' was not present in workload manifests.
         C:\Program Files\dotnet\sdk\6.0.300-preview.22211.2\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.FrameworkReferenceResolution.targets(90,5): error : NETSDKZZZZ: Error getting pack version: Pack 'Microsoft.Android.Runtime.25.android-x64' was not present in workload manifests.

Additionally, the build has been updated to produce a reference pack for
the API level declared in `$(AndroidDefaultTargetDotnetApiLevel)`, if it
is not the same as `$(AndroidLatestStableApiLevel)`.  This will allow
the default `net6.0-android` target framework to use an up to date
Mono.Android.dll, instead of an older preview version from NuGet.org.
  • Loading branch information
pjcollins committed Apr 13, 2022
1 parent b5053d7 commit 0ab3db0
Show file tree
Hide file tree
Showing 13 changed files with 149 additions and 83 deletions.
Expand Up @@ -56,7 +56,7 @@ steps:

- template: run-xaprepare.yaml
parameters:
arguments: --s=AndroidTestDependencies --android-sdk-platforms="19,21,26,32"
arguments: --s=AndroidTestDependencies --android-sdk-platforms="19,21,26,32,Tiramisu"
xaSourcePath: ${{ parameters.xaSourcePath }}

- task: DotNetCoreCLI@2
Expand Down
22 changes: 16 additions & 6 deletions build-tools/create-packs/Directory.Build.targets
Expand Up @@ -56,6 +56,11 @@
<RemoveDir Directories="$(XamarinAndroidSourcePath)bin\Build$(Configuration)\nuget-unsigned" />
</Target>

<Target Name="_CreateDefaultRefPack"
Condition=" '$(AndroidLatestStableApiLevel)' != '$(AndroidDefaultTargetDotnetApiLevel)' and Exists('$(XAInstallPrefix)xbuild-frameworks\Microsoft.Android\net6.0-android$(AndroidDefaultTargetDotnetApiLevel)\Mono.Android.dll') ">
<Exec Command="dotnet pack @(_GlobalProperties, ' ') -p:AndroidApiLevel=$(AndroidDefaultTargetDotnetApiLevel) &quot;$(MSBuildThisFileDirectory)Microsoft.Android.Ref.proj&quot;" />
</Target>

<Target Name="_CreatePreviewPacks"
Condition=" '$(AndroidLatestStableApiLevel)' != '$(AndroidLatestUnstableApiLevel)' and Exists('$(XAInstallPrefix)xbuild-frameworks\Microsoft.Android\net6.0-android$(AndroidLatestUnstableApiLevel)\Mono.Android.dll') ">
<Exec Command="dotnet pack @(_GlobalProperties, ' ') -p:AndroidApiLevel=$(AndroidLatestUnstableApiLevel) -p:AndroidRID=android-arm -p:AndroidABI=armeabi-v7a-net6 &quot;$(MSBuildThisFileDirectory)Microsoft.Android.Runtime.proj&quot;" />
Expand All @@ -66,7 +71,7 @@
</Target>

<Target Name="CreateAllPacks"
DependsOnTargets="DeleteExtractedWorkloadPacks;_SetGlobalProperties;GetXAVersionInfo;_CleanNuGetDirectory;_CreatePreviewPacks">
DependsOnTargets="DeleteExtractedWorkloadPacks;_SetGlobalProperties;GetXAVersionInfo;_CleanNuGetDirectory;_CreatePreviewPacks;_CreateDefaultRefPack">
<Exec Command="dotnet pack @(_GlobalProperties, ' ') -p:AndroidRID=android-arm -p:AndroidABI=armeabi-v7a-net6 &quot;$(MSBuildThisFileDirectory)Microsoft.Android.Runtime.proj&quot;" />
<Exec Command="dotnet pack @(_GlobalProperties, ' ') -p:AndroidRID=android-arm64 -p:AndroidABI=arm64-v8a-net6 &quot;$(MSBuildThisFileDirectory)Microsoft.Android.Runtime.proj&quot;" />
<Exec Command="dotnet pack @(_GlobalProperties, ' ') -p:AndroidRID=android-x86 -p:AndroidABI=x86-net6 &quot;$(MSBuildThisFileDirectory)Microsoft.Android.Runtime.proj&quot;" />
Expand Down Expand Up @@ -136,15 +141,20 @@
</Target>

<Target Name="DeleteExtractedWorkloadPacks" >
<ItemGroup>
<_PackApiLevels Include="$(AndroidDefaultTargetDotnetApiLevel)" />
<_PackApiLevels Include="$(AndroidLatestStableApiLevel)" />
<_PackApiLevels Include="$(AndroidLatestUnstableApiLevel)" />
</ItemGroup>
<ItemGroup>
<_PackFoldersToDelete Include="$(DotNetPreviewPath)metadata" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)sdk-manifests\$(DotNetPreviewVersionBand)\microsoft.net.sdk.android" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)sdk-manifests\$(DotNetPreviewVersionBand)\microsoft.net.workload.android" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Ref" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Runtime.android-arm" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Runtime.android-arm64" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Runtime.android-x86" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Runtime.android-x64" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Ref.%(_PackApiLevels.Identity)" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Runtime.%(_PackApiLevels.Identity).android-arm" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Runtime.%(_PackApiLevels.Identity).android-arm64" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Runtime.%(_PackApiLevels.Identity).android-x86" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Runtime.%(_PackApiLevels.Identity).android-x64" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Sdk.Darwin" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Sdk.Linux" />
<_PackFoldersToDelete Include="$(DotNetPreviewPath)packs\Microsoft.Android.Sdk.Windows" />
Expand Down
56 changes: 5 additions & 51 deletions build-tools/create-packs/Microsoft.Android.Sdk.proj
Expand Up @@ -102,57 +102,11 @@ core workload SDK packs imported by WorkloadManifest.targets.
<BundledVersionsFileName>Microsoft.Android.Sdk.BundledVersions.targets</BundledVersionsFileName>
</PropertyGroup>

<ItemGroup>
<_AndroidNETAppRuntimePackRids Include="android-arm;android-arm64;android-x86;android-x64" />
</ItemGroup>

<PropertyGroup>
<BundledVersionsContent>
<![CDATA[
<!--
***********************************************************************************************
$(BundledVersionsFileName)
WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
created a backup copy. Incorrect changes to this file will make it
impossible to load or build your projects from the command-line or the IDE.
***********************************************************************************************
-->
<Project>
<PropertyGroup>
<AndroidNETSdkVersion>$(AndroidPackVersionLong)</AndroidNETSdkVersion>
<XamarinAndroidVersion>$(AndroidPackVersionLong)</XamarinAndroidVersion>
</PropertyGroup>
<PropertyGroup Condition=" '%24(TargetPlatformVersion)' == '31.0' ">
<_AndroidTargetingPackId>31</_AndroidTargetingPackId>
<_AndroidTargetingPackVersion>31.0.101-preview.11.117</_AndroidTargetingPackVersion>
</PropertyGroup>
<PropertyGroup>
<_AndroidTargetingPackId Condition=" '%24(_AndroidTargetingPackId)' == '' ">$(AndroidLatestStableApiLevel)</_AndroidTargetingPackId>
<_AndroidTargetingPackVersion Condition=" '%24(_AndroidTargetingPackVersion)' == '' ">**FromWorkload**</_AndroidTargetingPackVersion>
<_AndroidRuntimePackId Condition=" '%24(_AndroidRuntimePackId)' == '' ">$(AndroidLatestStableApiLevel)</_AndroidRuntimePackId>
<_AndroidRuntimePackVersion Condition=" '%24(_AndroidRuntimePackVersion)' == '' ">**FromWorkload**</_AndroidRuntimePackVersion>
</PropertyGroup>
<ItemGroup>
<KnownFrameworkReference
Include="Microsoft.Android"
TargetFramework="$(_AndroidNETAppTargetFramework)"
RuntimeFrameworkName="Microsoft.Android"
LatestRuntimeFrameworkVersion="%24(_AndroidRuntimePackVersion)"
TargetingPackName="Microsoft.Android.Ref.%24(_AndroidTargetingPackId)"
TargetingPackVersion="%24(_AndroidTargetingPackVersion)"
RuntimePackNamePatterns="Microsoft.Android.Runtime.%24(_AndroidRuntimePackId).**RID**"
RuntimePackRuntimeIdentifiers="@(_AndroidNETAppRuntimePackRids, '%3B')"
Profile="Android"
/>
</ItemGroup>
</Project>
]]>
</BundledVersionsContent>
</PropertyGroup>

<WriteLinesToFile File="$(XamarinAndroidSourcePath)src\Xamarin.Android.Build.Tasks\Microsoft.Android.Sdk\targets\$(BundledVersionsFileName)"
Lines="$(BundledVersionsContent)"
Overwrite="true" />
<ReplaceFileContents
SourceFile="$(XamarinAndroidSourcePath)src\Xamarin.Android.Build.Tasks\Microsoft.Android.Sdk\in\Microsoft.Android.Sdk.BundledVersions.in.targets"
DestinationFile="$(XamarinAndroidSourcePath)src\Xamarin.Android.Build.Tasks\Microsoft.Android.Sdk\targets\$(BundledVersionsFileName)"
Replacements="@ANDROID_PACK_VERSION_LONG@=$(AndroidPackVersionLong);@ANDROID_LATEST_STABLE_API_LEVEL@=$(AndroidLatestStableApiLevel)" >
</ReplaceFileContents>
</Target>

</Project>
23 changes: 10 additions & 13 deletions build-tools/scripts/DotNet.targets
Expand Up @@ -5,6 +5,16 @@
<Target Name="PackDotNet">
<MSBuild Projects="$(_Root)build-tools\xa-prep-tasks\xa-prep-tasks.csproj" />
<MSBuild Projects="$(_Root)Xamarin.Android.sln" Properties="DisableApiCompatibilityCheck=true" />
<MSBuild
Condition=" '$(AndroidDefaultTargetDotnetApiLevel)' != '$(AndroidLatestStableApiLevel)' "
Projects="$(_Root)src\Mono.Android\Mono.Android.csproj"
Properties="TargetFramework=net6.0;AndroidApiLevel=$(AndroidDefaultTargetDotnetApiLevel);AndroidPlatformId=$(AndroidDefaultTargetDotnetApiLevel);DisableApiCompatibilityCheck=true"
/>
<MSBuild
Condition=" '$(AndroidLatestUnstableApiLevel)' != '$(AndroidLatestStableApiLevel)' "
Projects="$(_Root)src\Mono.Android\Mono.Android.csproj"
Properties="TargetFramework=net6.0;AndroidApiLevel=$(AndroidLatestUnstableApiLevel);AndroidPlatformId=$(AndroidLatestUnstablePlatformId);DisableApiCompatibilityCheck=true"
/>
<MSBuild Projects="$(_Root)build-tools\create-packs\Microsoft.Android.Sdk.proj" Targets="CreateAllPacks" />
<MSBuild Projects="$(_Root)build-tools\create-packs\Microsoft.Android.Sdk.proj" Targets="ExtractWorkloadPacks" />
<!-- Clean up old, previously restored packages -->
Expand Down Expand Up @@ -47,17 +57,4 @@
/>
<RemoveDir Directories="$(_TempDirectory)" />
</Target>
<Target Name="BuildDotNetPreviewApiLevel">
<ItemGroup>
<_DotNetPreviewProperties Include="TargetFramework=net6.0" />
<_DotNetPreviewProperties Include="AndroidApiLevel=$(AndroidLatestUnstableApiLevel)" />
<_DotNetPreviewProperties Include="AndroidPlatformId=$(AndroidLatestUnstablePlatformId)" />
<_DotNetPreviewProperties Include="AndroidFrameworkVersion=$(AndroidLatestUnstableFrameworkVersion)" />
<_DotNetPreviewProperties Include="AndroidPreviousFrameworkVersion=$(AndroidLatestStableFrameworkVersion)" />
</ItemGroup>
<MSBuild
Projects="$(XamarinAndroidSourcePath)src\Mono.Android\Mono.Android.csproj"
Properties="@(_DotNetPreviewProperties)"
/>
</Target>
</Project>
1 change: 1 addition & 0 deletions build-tools/scripts/XABuildConfig.cs.in
Expand Up @@ -13,6 +13,7 @@ namespace Xamarin.Android.Tools
public const string XamarinAndroidBranch = "@XAMARIN_ANDROID_BRANCH@";
public const int NDKMinimumApiAvailable = @NDK_MINIMUM_API_AVAILABLE@;
public const int AndroidLatestStableApiLevel = @ANDROID_LATEST_STABLE_API_LEVEL@;
public const int AndroidLatestUnstableApiLevel = @ANDROID_LATEST_UNSTABLE_API_LEVEL@;
public const int AndroidDefaultTargetDotnetApiLevel = @ANDROID_DEFAULT_TARGET_DOTNET_API_LEVEL@;
public static readonly Version NDKVersion = new Version (@NDK_VERSION_MAJOR@, @NDK_VERSION_MINOR@, @NDK_VERSION_MICRO@);

Expand Down
Expand Up @@ -7,6 +7,7 @@ static class KnownProperties
public const string AndroidCmakeVersionPath = "AndroidCmakeVersionPath";
public const string AndroidDefaultTargetDotnetApiLevel = "AndroidDefaultTargetDotnetApiLevel";
public const string AndroidLatestStableApiLevel = "AndroidLatestStableApiLevel";
public const string AndroidLatestUnstableApiLevel = "AndroidLatestUnstableApiLevel";
public const string AndroidLatestStableFrameworkVersion = "AndroidLatestStableFrameworkVersion";
public const string AndroidMxeFullPath = "AndroidMxeFullPath";
public const string AndroidNdkDirectory = "AndroidNdkDirectory";
Expand Down
Expand Up @@ -11,6 +11,7 @@ namespace Xamarin.Android.Prepare
properties.Add (KnownProperties.AndroidCmakeVersionPath, StripQuotes (@"@AndroidCmakeVersionPath@"));
properties.Add (KnownProperties.AndroidDefaultTargetDotnetApiLevel, StripQuotes ("@AndroidDefaultTargetDotnetApiLevel@"));
properties.Add (KnownProperties.AndroidLatestStableApiLevel, StripQuotes ("@AndroidLatestStableApiLevel@"));
properties.Add (KnownProperties.AndroidLatestUnstableApiLevel, StripQuotes ("@AndroidLatestUnstableApiLevel@"));
properties.Add (KnownProperties.AndroidLatestStableFrameworkVersion, StripQuotes ("@AndroidLatestStableFrameworkVersion@"));
properties.Add (KnownProperties.AndroidMxeFullPath, StripQuotes (@"@AndroidMxeFullPath@"));
properties.Add (KnownProperties.AndroidNdkDirectory, StripQuotes (@"@AndroidNdkDirectory@"));
Expand Down
Expand Up @@ -168,6 +168,7 @@ GeneratedFile Get_XABuildConfig_cs (Context context)
{ "@XA_SUPPORTED_ABIS@", context.Properties.GetRequiredValue (KnownProperties.AndroidSupportedTargetJitAbis).Replace (':', ';') },
{ "@ANDROID_DEFAULT_TARGET_DOTNET_API_LEVEL@", context.Properties.GetRequiredValue (KnownProperties.AndroidDefaultTargetDotnetApiLevel) },
{ "@ANDROID_LATEST_STABLE_API_LEVEL@", context.Properties.GetRequiredValue (KnownProperties.AndroidLatestStableApiLevel) },
{ "@ANDROID_LATEST_UNSTABLE_API_LEVEL@", context.Properties.GetRequiredValue (KnownProperties.AndroidLatestUnstableApiLevel) },
{ "@XAMARIN_ANDROID_VERSION@", context.Properties.GetRequiredValue (KnownProperties.ProductVersion) },
{ "@XAMARIN_ANDROID_COMMIT_HASH@", context.BuildInfo.XACommitHash },
{ "@XAMARIN_ANDROID_BRANCH@", context.BuildInfo.XABranch },
Expand Down
1 change: 1 addition & 0 deletions build-tools/xaprepare/xaprepare/xaprepare.targets
Expand Up @@ -45,6 +45,7 @@
<Replacement Include="@AndroidCmakeVersionPath@=$(AndroidCmakeVersionPath)" />
<Replacement Include="@AndroidDefaultTargetDotnetApiLevel@=$(AndroidDefaultTargetDotnetApiLevel)" />
<Replacement Include="@AndroidLatestStableApiLevel@=$(AndroidLatestStableApiLevel)" />
<Replacement Include="@AndroidLatestUnstableApiLevel@=$(AndroidLatestUnstableApiLevel)" />
<Replacement Include="@AndroidMxeFullPath@=$(AndroidMxeFullPath)" />
<Replacement Include="@AndroidNdkDirectory@=$(AndroidNdkDirectory)" />
<Replacement Include="@AndroidNdkVersion@=$(AndroidNdkVersion)" />
Expand Down
4 changes: 2 additions & 2 deletions src/Mono.Android/Mono.Android.csproj
Expand Up @@ -386,8 +386,8 @@
<Target Name="GetTargetPath" />

<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<!-- Only build the 'net6.0' version of 'Mono.Android.dll' for the latest stable Android version or higher. -->
<PropertyGroup Condition=" '$(TargetFramework)' != 'monoandroid10' And '$(AndroidApiLevel)' &lt; '$(AndroidLatestStableApiLevel)' ">
<!-- Only build the 'net6.0' version of 'Mono.Android.dll' for the default API level that is supported or higher. -->
<PropertyGroup Condition=" '$(TargetFramework)' != 'monoandroid10' And '$(AndroidApiLevel)' &lt; '$(AndroidDefaultTargetDotnetApiLevel)' ">
<BuildDependsOn></BuildDependsOn>
</PropertyGroup>

Expand Down
@@ -0,0 +1,32 @@
<!--
***********************************************************************************************
Microsoft.Android.Sdk.BundledVersions.targets
WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
created a backup copy. Incorrect changes to this file will make it
impossible to load or build your projects from the command-line or the IDE.
***********************************************************************************************
-->
<Project>
<PropertyGroup>
<AndroidNETSdkVersion>@ANDROID_PACK_VERSION_LONG@</AndroidNETSdkVersion>
<XamarinAndroidVersion>@ANDROID_PACK_VERSION_LONG@</XamarinAndroidVersion>
</PropertyGroup>
<PropertyGroup>
<_AndroidTargetingPackId>$(TargetPlatformVersion.TrimEnd('.0'))</_AndroidTargetingPackId>
<_AndroidRuntimePackId Condition=" '$(_AndroidTargetingPackId)' &lt; '@ANDROID_LATEST_STABLE_API_LEVEL@' ">@ANDROID_LATEST_STABLE_API_LEVEL@</_AndroidRuntimePackId>
<_AndroidRuntimePackId Condition=" '$(_AndroidRuntimePackId)' == '' ">$(_AndroidTargetingPackId)</_AndroidRuntimePackId>
</PropertyGroup>
<ItemGroup>
<KnownFrameworkReference
Include="Microsoft.Android"
TargetFramework="net6.0"
RuntimeFrameworkName="Microsoft.Android"
LatestRuntimeFrameworkVersion="**FromWorkload**"
TargetingPackName="Microsoft.Android.Ref.$(_AndroidTargetingPackId)"
TargetingPackVersion="**FromWorkload**"
RuntimePackNamePatterns="Microsoft.Android.Runtime.$(_AndroidRuntimePackId).**RID**"
RuntimePackRuntimeIdentifiers="android-arm;android-arm64;android-x86;android-x64"
Profile="Android"
/>
</ItemGroup>
</Project>
Expand Up @@ -43,7 +43,7 @@
},
"Microsoft.Android.Ref.31": {
"kind": "framework",
"version": "31.0.101-preview.11.117"
"version": "@WORKLOAD_VERSION@"
},
"Microsoft.Android.Ref.32": {
"kind": "framework",
Expand Down

0 comments on commit 0ab3db0

Please sign in to comment.