From 81106952a1983a4609dcdf40a758b6acf9c190a8 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Mon, 8 Jun 2026 09:17:36 -0500 Subject: [PATCH 1/2] [build] Check in Mono.Android.Apis.projitems, remove generator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `Mono.Android.Apis.projitems` was previously generated at prepare time by `GeneratedMonoAndroidProjitemsFile` (in xaprepare) from the `BuildAndroidPlatforms.AllPlatforms` list. Both had exactly one consumer (each other), so check in the projitems as a source file and drop the generator plumbing. Changes: * Add `src/Mono.Android/Mono.Android.Apis.projitems` — content matches the generator's output byte-for-byte; only the header comment now points at `Documentation/workflow/HowToAddNewApiLevel.md` instead of declaring "GENERATED FILE". * Repoint the 4 importers (`Mono.Android.targets` x2, `create-installers.targets`, `create-android-api.csproj`, `Xamarin.Android.Build.Tasks.targets`) at the new path and drop the `Condition="Exists(...)"` guards — the file is always present now. * Delete `GeneratedMonoAndroidProjitemsFile.cs` and `AndroidPlatform.cs` (whole files — `AndroidPlatform` class and `AndroidPlatformExtensions` both become unused). * Drop the `new GeneratedMonoAndroidProjitemsFile()` registration in `Step_GenerateFiles.cs`. * Remove `BuildAndroidPlatforms.AllPlatforms` and the now-unused `using System.Collections.Generic;`. Keep the NDK constants (`AndroidNdkVersion`, `AndroidNdkPkgRevision`, `NdkMinimumAPI`, `NdkMinimumAPILegacy32`) — they still have consumers. * Update `Documentation/workflow/HowToAddNewApiLevel.md` with the XML-based instructions for adding a new API level. * Narrow the `build-tools/xaprepare/README.md` blurb for `BuildAndroidPlatforms.cs` to NDK metadata. * Fix stale doc comment in `GenerateSupportedPlatforms.cs` pointing at the old generated path. Continues the xaprepare cleanup started in PRs #11568 and #11580. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Documentation/workflow/HowToAddNewApiLevel.md | 23 +- .../GenerateSupportedPlatforms.cs | 2 +- .../create-android-api.csproj | 2 +- .../installers/create-installers.targets | 2 +- build-tools/xaprepare/README.md | 5 +- .../xaprepare/Application/AndroidPlatform.cs | 53 ---- .../GeneratedMonoAndroidProjitemsFile.cs | 59 ----- .../ConfigAndData/BuildAndroidPlatforms.cs | 43 --- .../xaprepare/Steps/Step_GenerateFiles.cs | 4 +- src/Mono.Android/Mono.Android.Apis.projitems | 244 ++++++++++++++++++ src/Mono.Android/Mono.Android.targets | 4 +- .../Xamarin.Android.Build.Tasks.targets | 2 +- 12 files changed, 269 insertions(+), 174 deletions(-) delete mode 100644 build-tools/xaprepare/xaprepare/Application/AndroidPlatform.cs delete mode 100644 build-tools/xaprepare/xaprepare/Application/GeneratedMonoAndroidProjitemsFile.cs create mode 100644 src/Mono.Android/Mono.Android.Apis.projitems diff --git a/Documentation/workflow/HowToAddNewApiLevel.md b/Documentation/workflow/HowToAddNewApiLevel.md index 72764ffba8f..6fa3f84c321 100644 --- a/Documentation/workflow/HowToAddNewApiLevel.md +++ b/Documentation/workflow/HowToAddNewApiLevel.md @@ -111,17 +111,26 @@ For the new API level, you need: Then update the following files: - - Add new `AndroidPlatform` value to - [`/build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs`](../../build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs): - - ```csharp - new AndroidPlatform (apiName: "CANARY", apiLevel: new Version (36, 1), platformID: "CANARY", include: "v16.0", framework: "v16.1", stable: false), + - Add a new `` entry to + [`/src/Mono.Android/Mono.Android.Apis.projitems`](../../src/Mono.Android/Mono.Android.Apis.projitems): + ```xml + + CANARY + 36 + 36.1 + 36.1 + True + ``` - TODO: what should be done for the "mid-year" updates, as is the case for API-CANARY? + `Include` is the binding framework version (e.g. `v16.1`). `Level` is the + integer API level (`Major` of `VersionCodeFull`). `Id` is the platform ID + used to locate `android-$(Id)` directories under the Android SDK. `Stable` + should be `True` for shipping platforms and `False` for unsupported preview + API levels. - What are `include` and `framework` used for? + TODO: what should be done for the "mid-year" updates, as is the case for API-CANARY? - Add new level to [`/build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs`](../../build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs): diff --git a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs index 80947479a24..72ec0abe662 100644 --- a/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs +++ b/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/GenerateSupportedPlatforms.cs @@ -17,7 +17,7 @@ namespace Xamarin.Android.Tools.BootstrapTasks public class GenerateSupportedPlatforms : Task { /// - /// @(AndroidApiInfo) from .\bin\Build$(Configuration)\Mono.Android.Apis.projitems + /// @(AndroidApiInfo) from src\Mono.Android\Mono.Android.Apis.projitems /// [Required] public ITaskItem [] AndroidApiInfo { get; set; } = []; diff --git a/build-tools/create-android-api/create-android-api.csproj b/build-tools/create-android-api/create-android-api.csproj index abdc341b18d..de85695be10 100644 --- a/build-tools/create-android-api/create-android-api.csproj +++ b/build-tools/create-android-api/create-android-api.csproj @@ -6,7 +6,7 @@ - + diff --git a/build-tools/installers/create-installers.targets b/build-tools/installers/create-installers.targets index 44504f25ef4..79ad2b47289 100644 --- a/build-tools/installers/create-installers.targets +++ b/build-tools/installers/create-installers.targets @@ -3,7 +3,7 @@ - + $(XAInstallPrefix)xbuild-frameworks\MonoAndroid\ diff --git a/build-tools/xaprepare/README.md b/build-tools/xaprepare/README.md index c34a67425bc..1e792f7ab88 100644 --- a/build-tools/xaprepare/README.md +++ b/build-tools/xaprepare/README.md @@ -101,9 +101,8 @@ The files mentioned above are found in the [ConfigAndData](xaprepare/ConfigAndDa helper methods used throughout the preparation utility code. **Be very careful** when modifying the names there as it may break the build! - [BuildAndroidPlatforms.cs](xaprepare/ConfigAndData/BuildAndroidPlatforms.cs) - Modified whenever a new Android platform is added, this file names all of the Android API levels along with platform/API - identifiers and .NET for Android framework names corresponding to specific API levels. The file also contains specification - of minimum NDK API levels used for all the Android device targets. + Contains the NDK release/revision constants and the minimum NDK API levels used for all the Android device targets. + The Android API level list itself lives in [`/src/Mono.Android/Mono.Android.Apis.projitems`](../../src/Mono.Android/Mono.Android.Apis.projitems). - [CommonLicenses.cs](xaprepare/ConfigAndData/CommonLicenses.cs) A file with constants containing paths to licenses commonly used by software .NET for Android uses. The licenses are used when generating Third Party Notices. diff --git a/build-tools/xaprepare/xaprepare/Application/AndroidPlatform.cs b/build-tools/xaprepare/xaprepare/Application/AndroidPlatform.cs deleted file mode 100644 index 6d395c53c16..00000000000 --- a/build-tools/xaprepare/xaprepare/Application/AndroidPlatform.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Xamarin.Android.Prepare -{ - class AndroidPlatform - { - public string? ApiName { get; } - public Version ApiLevel { get; } - public string PlatformID { get; } - public string Framework { get; } - public bool Stable { get; } - public bool Supported { get; } - public string? Include { get; } - - public AndroidPlatform (uint apiLevel, string platformID, string? framework = null, bool stable = true, string? apiName = null, string? include = null) - : this (new Version (checked ((int) apiLevel), 0), platformID, framework, stable, apiName, include) - { - - } - - public AndroidPlatform (Version apiLevel, string platformID, string? framework = null, bool stable = true, string? apiName = null, string? include = null) - { - if (String.IsNullOrEmpty (platformID)) - throw new ArgumentException ("must not be null or empty", nameof (platformID)); - - ApiName = apiName; - ApiLevel = apiLevel; - PlatformID = platformID; - Framework = framework ?? String.Empty; - Stable = stable; - Supported = !String.IsNullOrEmpty (framework); - Include = include; - } - } - - static class AndroidPlatformExtensions - { - public static void Add (this List list, uint apiLevel, string platformID, string framework, bool stable, string? apiName = null, string? include = null) - { - Add (list, new Version (checked ((int) apiLevel), 0), platformID, framework, stable, apiName, include); - } - - public static void Add (this List list, Version apiLevel, string platformID, string framework, bool stable, string? apiName = null, string? include = null) - { - if (list.Any (p => p.ApiLevel == apiLevel)) - throw new InvalidOperationException ($"Duplicate Android platform, API level {apiLevel}"); - - list.Add (new AndroidPlatform (apiLevel, platformID, framework, stable, apiName, include)); - } - } -} diff --git a/build-tools/xaprepare/xaprepare/Application/GeneratedMonoAndroidProjitemsFile.cs b/build-tools/xaprepare/xaprepare/Application/GeneratedMonoAndroidProjitemsFile.cs deleted file mode 100644 index 31ea06a420c..00000000000 --- a/build-tools/xaprepare/xaprepare/Application/GeneratedMonoAndroidProjitemsFile.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace Xamarin.Android.Prepare -{ - class GeneratedMonoAndroidProjitemsFile : GeneratedFile - { - const string FileTop = @" - - - -"; - - const string OutputFileName = "Mono.Android.Apis.projitems"; - - const string FileBottom = @""; - - public GeneratedMonoAndroidProjitemsFile () - : base (Path.Combine (Configurables.Paths.BuildBinDir, OutputFileName)) - {} - - public override void Generate (Context context) - { - using (var fs = File.Open (OutputPath, FileMode.Create)) { - using (var sw = new StreamWriter (fs)) { - GenerateFile (sw); - } - } - } - - void GenerateFile (StreamWriter sw) - { - sw.Write (FileTop); - - sw.WriteLine (" "); - BuildAndroidPlatforms.AllPlatforms.ForEach (androidPlatform => WriteGroupApiInfo (sw, androidPlatform)); - sw.WriteLine (" "); - - sw.Write (FileBottom); - } - - void WriteGroupApiInfo (StreamWriter sw, AndroidPlatform androidPlatform) - { - if (string.IsNullOrWhiteSpace (androidPlatform.ApiName)) { - return; - } - - sw.WriteLine ($" "); - sw.WriteLine ($" {androidPlatform.ApiName}"); - sw.WriteLine ($" {androidPlatform.ApiLevel.Major}"); - sw.WriteLine ($" {androidPlatform.ApiLevel}"); - sw.WriteLine ($" {androidPlatform.PlatformID}"); - sw.WriteLine ($" {androidPlatform.Stable}"); - sw.WriteLine ($" "); - } - } -} \ No newline at end of file diff --git a/build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs b/build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs index d2dd2054524..7ead038f419 100644 --- a/build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs +++ b/build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace Xamarin.Android.Prepare { @@ -10,47 +9,5 @@ class BuildAndroidPlatforms public static string NdkMinimumAPI => Context.Instance.Properties.GetRequiredValue (KnownProperties.AndroidMinimumDotNetApiLevel); public static string NdkMinimumAPILegacy32 => NdkMinimumAPI; - - public static readonly List AllPlatforms = new List { - new AndroidPlatform (apiName: "", apiLevel: 1, platformID: "1"), - new AndroidPlatform (apiName: "", apiLevel: 2, platformID: "2"), - new AndroidPlatform (apiName: "", apiLevel: 3, platformID: "3"), - new AndroidPlatform (apiName: "Donut", apiLevel: 4, platformID: "4", include: "v1.6"), - new AndroidPlatform (apiName: "Eclair", apiLevel: 5, platformID: "5", include: "v2.0"), - new AndroidPlatform (apiName: "Eclair", apiLevel: 6, platformID: "6", include: "v2.0.1"), - new AndroidPlatform (apiName: "Eclair", apiLevel: 7, platformID: "7", include: "v2.1"), - new AndroidPlatform (apiName: "Froyo", apiLevel: 8, platformID: "8", include: "v2.2"), - new AndroidPlatform (apiName: "", apiLevel: 9, platformID: "9"), - new AndroidPlatform (apiName: "Gingerbread", apiLevel: 10, platformID: "10", include: "v2.3"), - new AndroidPlatform (apiName: "Honeycomb", apiLevel: 11, platformID: "11", include: "v3.0"), - new AndroidPlatform (apiName: "Honeycomb", apiLevel: 12, platformID: "12", include: "v3.1"), - new AndroidPlatform (apiName: "Honeycomb", apiLevel: 13, platformID: "13", include: "v3.2"), - new AndroidPlatform (apiName: "Ice Cream Sandwich", apiLevel: 14, platformID: "14", include: "v4.0"), - new AndroidPlatform (apiName: "Ice Cream Sandwich", apiLevel: 15, platformID: "15", include: "v4.0.3"), - new AndroidPlatform (apiName: "Jelly Bean", apiLevel: 16, platformID: "16", include: "v4.1"), - new AndroidPlatform (apiName: "Jelly Bean", apiLevel: 17, platformID: "17", include: "v4.2"), - new AndroidPlatform (apiName: "Jelly Bean", apiLevel: 18, platformID: "18", include: "v4.3"), - new AndroidPlatform (apiName: "Kit Kat", apiLevel: 19, platformID: "19", include: "v4.4"), - new AndroidPlatform (apiName: "Kit Kat + Wear support", apiLevel: 20, platformID: "20", include: "v4.4.87"), - new AndroidPlatform (apiName: "Lollipop", apiLevel: 21, platformID: "21", include: "v5.0"), - new AndroidPlatform (apiName: "Lollipop", apiLevel: 22, platformID: "22", include: "v5.1"), - new AndroidPlatform (apiName: "Marshmallow", apiLevel: 23, platformID: "23", include: "v6.0"), - new AndroidPlatform (apiName: "Nougat", apiLevel: 24, platformID: "24", include: "v7.0"), - new AndroidPlatform (apiName: "Nougat", apiLevel: 25, platformID: "25", include: "v7.1"), - new AndroidPlatform (apiName: "Oreo", apiLevel: 26, platformID: "26", include: "v8.0"), - new AndroidPlatform (apiName: "Oreo", apiLevel: 27, platformID: "27", include: "v8.1"), - new AndroidPlatform (apiName: "Pie", apiLevel: 28, platformID: "28", include: "v9.0"), - new AndroidPlatform (apiName: "Q", apiLevel: 29, platformID: "29", include: "v10.0"), - new AndroidPlatform (apiName: "R", apiLevel: 30, platformID: "30", include: "v11.0"), - new AndroidPlatform (apiName: "S", apiLevel: 31, platformID: "31", include: "v12.0"), - new AndroidPlatform (apiName: "Sv2", apiLevel: 32, platformID: "32", include: "v12.1"), - new AndroidPlatform (apiName: "Tiramisu", apiLevel: 33, platformID: "33", include: "v13.0", framework: "v13.0"), - new AndroidPlatform (apiName: "UpsideDownCake", apiLevel: 34, platformID: "34", include: "v14.0", framework: "v14.0"), - new AndroidPlatform (apiName: "VanillaIceCream", apiLevel: 35, platformID: "35", include: "v15.0", framework: "v15.0"), - new AndroidPlatform (apiName: "Baklava", apiLevel: 36, platformID: "36", include: "v16.0", framework: "v16.0"), - new AndroidPlatform (apiName: "CANARY", apiLevel: new Version (36, 1), platformID: "36.1", include: "v16.1", framework: "v16.1", stable: true), - new AndroidPlatform (apiName: "CinnamonBun", apiLevel: new Version (37, 0), platformID: "37.0", include: "v17.0", framework: "v17.0", stable: true), - }; - } } diff --git a/build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs b/build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs index 255c181ee75..d3671362bc3 100644 --- a/build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs +++ b/build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs @@ -76,9 +76,7 @@ protected override async Task Execute (Context context) if (onlyRequired) return null; - var steps = new List { - new GeneratedMonoAndroidProjitemsFile (), - }; + var steps = new List (); AddOSSpecificSteps (context, steps); diff --git a/src/Mono.Android/Mono.Android.Apis.projitems b/src/Mono.Android/Mono.Android.Apis.projitems new file mode 100644 index 00000000000..140c84d053d --- /dev/null +++ b/src/Mono.Android/Mono.Android.Apis.projitems @@ -0,0 +1,244 @@ + + + + + + Donut + 4 + 4.0 + 4 + True + + + Eclair + 5 + 5.0 + 5 + True + + + Eclair + 6 + 6.0 + 6 + True + + + Eclair + 7 + 7.0 + 7 + True + + + Froyo + 8 + 8.0 + 8 + True + + + Gingerbread + 10 + 10.0 + 10 + True + + + Honeycomb + 11 + 11.0 + 11 + True + + + Honeycomb + 12 + 12.0 + 12 + True + + + Honeycomb + 13 + 13.0 + 13 + True + + + Ice Cream Sandwich + 14 + 14.0 + 14 + True + + + Ice Cream Sandwich + 15 + 15.0 + 15 + True + + + Jelly Bean + 16 + 16.0 + 16 + True + + + Jelly Bean + 17 + 17.0 + 17 + True + + + Jelly Bean + 18 + 18.0 + 18 + True + + + Kit Kat + 19 + 19.0 + 19 + True + + + Kit Kat + Wear support + 20 + 20.0 + 20 + True + + + Lollipop + 21 + 21.0 + 21 + True + + + Lollipop + 22 + 22.0 + 22 + True + + + Marshmallow + 23 + 23.0 + 23 + True + + + Nougat + 24 + 24.0 + 24 + True + + + Nougat + 25 + 25.0 + 25 + True + + + Oreo + 26 + 26.0 + 26 + True + + + Oreo + 27 + 27.0 + 27 + True + + + Pie + 28 + 28.0 + 28 + True + + + Q + 29 + 29.0 + 29 + True + + + R + 30 + 30.0 + 30 + True + + + S + 31 + 31.0 + 31 + True + + + Sv2 + 32 + 32.0 + 32 + True + + + Tiramisu + 33 + 33.0 + 33 + True + + + UpsideDownCake + 34 + 34.0 + 34 + True + + + VanillaIceCream + 35 + 35.0 + 35 + True + + + Baklava + 36 + 36.0 + 36 + True + + + CANARY + 36 + 36.1 + 36.1 + True + + + CinnamonBun + 37 + 37.0 + 37.0 + True + + + \ No newline at end of file diff --git a/src/Mono.Android/Mono.Android.targets b/src/Mono.Android/Mono.Android.targets index 6f2fab65325..5839eb08327 100644 --- a/src/Mono.Android/Mono.Android.targets +++ b/src/Mono.Android/Mono.Android.targets @@ -4,7 +4,7 @@ - + @@ -169,7 +169,7 @@ diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.targets index 2b15917423a..b2547a30810 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.targets @@ -163,7 +163,7 @@ Date: Mon, 8 Jun 2026 09:28:41 -0500 Subject: [PATCH 2/2] [docs] Fix Stable=True/False contradiction in HowToAddNewApiLevel The added prose said Stable should be False for preview API levels, but the example (CANARY) sets True, and every entry in Mono.Android.Apis.projitems is True. Rewrite the prose to match the data and briefly explain what setting Stable=False would actually do (excludes entry from default stable framework selection). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Documentation/workflow/HowToAddNewApiLevel.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Documentation/workflow/HowToAddNewApiLevel.md b/Documentation/workflow/HowToAddNewApiLevel.md index 6fa3f84c321..679120aed2c 100644 --- a/Documentation/workflow/HowToAddNewApiLevel.md +++ b/Documentation/workflow/HowToAddNewApiLevel.md @@ -127,8 +127,10 @@ Then update the following files: `Include` is the binding framework version (e.g. `v16.1`). `Level` is the integer API level (`Major` of `VersionCodeFull`). `Id` is the platform ID used to locate `android-$(Id)` directories under the Android SDK. `Stable` - should be `True` for shipping platforms and `False` for unsupported preview - API levels. + should be `True`; every entry currently in the projitems uses `True`, + including preview codenames like CANARY. (Setting it to `False` would + exclude the entry from being picked as the default stable framework + version by some build-time selection logic.) TODO: what should be done for the "mid-year" updates, as is the case for API-CANARY?