Skip to content

Commit d5152b6

Browse files
authored
[Mono.Android] Bind and enumify API-36 (#9814)
Context: https://developer.android.com/about/versions/16 Context: https://android-developers.googleblog.com/2025/03/the-third-beta-of-android-16.html Android 16 Beta 3 has been released. * [API-36 Beta 3 vs. API-35][0] * [API-36 Beta 3 vs. API-Baklava Beta 2][1] The Android 16 Preview Program Overview [Timeline and updates][2] section suggests the following timeline: * Nov/Dec: Developer Previews * Jan/Feb: Unstable Betas * Mar/Apr: Stable Betas * ???: Final Additionally, enumify and mark API-36 as "stable", which changes `net10.0-android` to default to `net10.0-android36.0`. We still need to decide on our strategy for backporting this to .NET 9 service releases. ## Notes APICompat: - There are several `Android.Runtime.RequiresPermissionAttribute` fields that have been removed. As we do not consume this attribute, it does not cause any API breakage. - Several `[ObsoletedOSPlatformAttribute]` attributes are missing. These have all been documented as "undeprecated" in Android's change list: https://developer.android.com/sdk/api_diff/36/changes PublicAPI: - Nullable reference type attribute changes (`T?` -> `T!`) - Method parameter name changes. This is technically a source breaking change, but something we've never tracked or fixed before. - Some consts changed "values" in `PublicAPI*.txt` like from `MediaCodecProfileType.Av1profilemain10hdr10` to `MediaCodecProfileType.Apvprofile42210hdr10`: - const Android.Media.MediaCodecInfo.CodecProfileLevel.AV1ProfileMain10HDR10 = Android.Media.MediaCodecProfileType.Av1profilemain10hdr10 -> Android.Media.MediaCodecProfileType + const Android.Media.MediaCodecInfo.CodecProfileLevel.AV1ProfileMain10HDR10 = Android.Media.MediaCodecProfileType.Apvprofile42210hdr10 -> Android.Media.MediaCodecProfileType This is a weird enum that has lots of members with the same values, and the PublicAPI tooling likely chooses the first alphabetically. The const *value* did not actually change, just the way it is listed in `PublicAPI*.txt`: public enum Android.Media.MediaCodecProfileType { [global::System.Runtime.Versioning.SupportedOSPlatformAttribute ("android36.0")] Apvprofile42210hdr10 = 4096, [global::System.Runtime.Versioning.SupportedOSPlatformAttribute ("android29.0")] Av1profilemain10hdr10 = 4096, // … } MAUI Integration Tests: - It looks like the MAUI Integration tests are broken because they [explicitly target net10.0-android35.0][3] instead of `net10.0-android`. The MAUI team will need to update this when our changes flow to them. [0]: https://developer.android.com/sdk/api_diff/36/changes [1]: https://developer.android.com/sdk/api_diff/36-incr/changes [2]: https://developer.android.com/about/versions/16/overview [3]: https://github.com/dotnet/maui/blob/c451130571777aef5d9fa2737789dd987430e6dc/Directory.Build.props#L158
1 parent 224ad26 commit d5152b6

File tree

22 files changed

+5385
-207197
lines changed

22 files changed

+5385
-207197
lines changed

Configuration.props

+5-5
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@
2525
<!-- The min API level supported by Microsoft.Android.Sdk -->
2626
<AndroidMinimumDotNetApiLevel Condition="'$(AndroidMinimumDotNetApiLevel)' == ''">21</AndroidMinimumDotNetApiLevel>
2727
<!-- *Latest* *stable* API level binding that we support; used when building src/Xamarin.Android.Build.Tasks -->
28-
<AndroidLatestStableApiLevel Condition="'$(AndroidLatestStableApiLevel)' == ''">35</AndroidLatestStableApiLevel>
28+
<AndroidLatestStableApiLevel Condition="'$(AndroidLatestStableApiLevel)' == ''">36</AndroidLatestStableApiLevel>
2929
<AndroidLatestStablePlatformId Condition="'$(AndroidLatestStablePlatformId)' == ''">$(AndroidLatestStableApiLevel)</AndroidLatestStablePlatformId>
30-
<AndroidLatestStableFrameworkVersion Condition="'$(AndroidLatestStableFrameworkVersion)'==''">v15.0</AndroidLatestStableFrameworkVersion>
30+
<AndroidLatestStableFrameworkVersion Condition="'$(AndroidLatestStableFrameworkVersion)'==''">v16.0</AndroidLatestStableFrameworkVersion>
3131
<!-- *Latest* *unstable* API level binding that we support; this can be the same as *stable* -->
32-
<AndroidLatestUnstableApiLevel Condition="'$(AndroidLatestUnstableApiLevel)' == ''">36</AndroidLatestUnstableApiLevel>
33-
<AndroidLatestUnstablePlatformId Condition="'$(AndroidLatestUnstablePlatformId)' == ''">Baklava</AndroidLatestUnstablePlatformId>
34-
<AndroidLatestUnstableFrameworkVersion Condition="'$(AndroidLatestUnstableFrameworkVersion)'==''">v15.0.99</AndroidLatestUnstableFrameworkVersion>
32+
<AndroidLatestUnstableApiLevel Condition="'$(AndroidLatestUnstableApiLevel)' == ''">$(AndroidLatestStableApiLevel)</AndroidLatestUnstableApiLevel>
33+
<AndroidLatestUnstablePlatformId Condition="'$(AndroidLatestUnstablePlatformId)' == ''">$(AndroidLatestStablePlatformId)</AndroidLatestUnstablePlatformId>
34+
<AndroidLatestUnstableFrameworkVersion Condition="'$(AndroidLatestUnstableFrameworkVersion)'==''">$(AndroidLatestStableFrameworkVersion)</AndroidLatestUnstableFrameworkVersion>
3535
<!-- The default API level used for $(TargetPlatformVersion) -->
3636
<AndroidDefaultTargetDotnetApiLevel Condition=" '$(AndroidDefaultTargetDotnetApiLevel)' == '' ">$(AndroidLatestStableApiLevel)</AndroidDefaultTargetDotnetApiLevel>
3737
<!-- The API level and TargetFrameworkVersion for the default Mono.Android.dll build -->

Directory.Build.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
* Major/Minor match Android stable API level, such as 30.0 for API 30.
3636
* Bump first digit of the patch version for feature releases (and reset the first two digits to 0)
3737
-->
38-
<AndroidPackVersion>35.99.0</AndroidPackVersion>
38+
<AndroidPackVersion>36.0.0</AndroidPackVersion>
3939
<AndroidPackVersionSuffix>preview.3</AndroidPackVersionSuffix>
4040
<!-- Final value set by GetXAVersionInfo target -->
4141
<IsStableBuild>false</IsStableBuild>

build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks/CheckApiCompatibility.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public sealed class CheckApiCompatibility : Task
3333
{ "v13.0", "v12.1" },
3434
{ "v14.0", "v13.0" },
3535
{ "v15.0", "v14.0" },
36-
{ "v15.0.99", "v15.0" },
36+
{ "v16.0", "v15.0" },
3737
};
3838

3939
static readonly string assemblyToValidate = "Mono.Android.dll";

build-tools/api-merge/merge-configuration.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
<File Path="api-33.xml.in" Level="33" />
2525
<File Path="api-34.xml.in" Level="34" />
2626
<File Path="api-35.xml.in" Level="35" />
27-
<File Path="api-Baklava.xml.in" Level="36" />
27+
<File Path="api-36.xml.in" Level="36" />
2828
</Inputs>
2929
<Outputs>
30-
<File Path="api-Baklava.xml" LastLevel="36" />
30+
<File Path="api-36.xml" LastLevel="36" />
3131
</Outputs>
3232
</Configuration>

build-tools/automation/yaml-templates/variables.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ variables:
5959
- name: IsRelOrTargetingRel
6060
value: $[or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), startsWith(variables['System.PullRequest.TargetBranch'], 'release/'))]
6161
- name: DefaultTestSdkPlatforms # Comma-separated SDK Platform(s) to install on test agents (no spaces)
62-
value: 35,Baklava
62+
value: 36
6363
- name: DefaultJavaSdkMajorVersion
6464
value: 17
6565
- name: LatestJavaSdkMajorVersion

build-tools/manifest-attribute-codegen/manifest-definition.xml

+14
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@
9696
<a name='knownActivityEmbeddingCerts' api-level='33' />
9797
<a name='enableOnBackInvokedCallback' format='boolean' api-level='33' />
9898
<a name='allowCrossUidActivitySwitchFromBelow' format='boolean' api-level='35' />
99+
<a name='pageSizeCompat' api-level='36' />
100+
<a name='intentMatchingFlags' api-level='36' />
101+
<a name='alternateLauncherIcons' format='reference' api-level='36' />
102+
<a name='alternateLauncherLabels' format='reference' api-level='36' />
99103
</e>
100104
<e name='permission' api-level='10'>
101105
<parent>manifest</parent>
@@ -168,6 +172,7 @@
168172
<a name='minSdkVersion' format='integer|string' />
169173
<a name='targetSdkVersion' format='integer|string' />
170174
<a name='maxSdkVersion' format='integer' />
175+
<a name='minSdkVersionFull' format='string' api-level='36' />
171176
</e>
172177
<e name='uses-library' api-level='10'>
173178
<parent>application</parent>
@@ -221,6 +226,7 @@
221226
<a name='forceUriPermissions' api-level='29' />
222227
<a name='attributionTags' api-level='31' />
223228
<a name='systemUserOnly' format='boolean' api-level='35' />
229+
<a name='intentMatchingFlags' api-level='36' />
224230
</e>
225231
<e name='grant-uri-permission' api-level='10'>
226232
<parent>provider</parent>
@@ -266,6 +272,7 @@
266272
<a name='attributionTags' api-level='31' />
267273
<a name='allowSharedIsolatedProcess' format='boolean' api-level='34' />
268274
<a name='systemUserOnly' format='boolean' api-level='35' />
275+
<a name='intentMatchingFlags' api-level='36' />
269276
</e>
270277
<e name='receiver' api-level='10'>
271278
<parent>application</parent>
@@ -283,6 +290,7 @@
283290
<a name='directBootAware' api-level='24' />
284291
<a name='roundIcon' api-level='25' />
285292
<a name='attributionTags' api-level='31' />
293+
<a name='intentMatchingFlags' api-level='36' />
286294
</e>
287295
<e name='activity' api-level='10'>
288296
<parent>application</parent>
@@ -354,6 +362,7 @@
354362
<a name='requiredDisplayCategory' format='string' api-level='34' />
355363
<a name='enableOnBackInvokedCallback' format='boolean' api-level='34' />
356364
<a name='requireContentUriPermissionFromCaller' format='string' api-level='35' />
365+
<a name='intentMatchingFlags' api-level='36' />
357366
</e>
358367
<e name='activity-alias' api-level='10'>
359368
<parent>application</parent>
@@ -372,6 +381,7 @@
372381
<a name='attributionTags' api-level='31' />
373382
<a name='allowUntrustedActivityEmbedding' api-level='33' />
374383
<a name='knownActivityEmbeddingCerts' api-level='33' />
384+
<a name='intentMatchingFlags' api-level='36' />
375385
</e>
376386
<e name='meta-data' api-level='10'>
377387
<parent>application</parent>
@@ -656,4 +666,8 @@
656666
<parent>intent-filter</parent>
657667
<a name='allow' format='boolean' api-level='35' />
658668
</e>
669+
<e name='adopt-permissions' api-level='36'>
670+
<parent>manifest</parent>
671+
<a name='name' api-level='36' />
672+
</e>
659673
</m>

build-tools/manifest-attribute-codegen/metadata.xml

+9
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
<type name="action" ignore="true" />
2727
<type name="activity-alias" ignore="true" />
2828
<type name="additional-certificate" ignore="true" />
29+
<type name="adopt-permissions" ignore="true" />
2930
<type name="allow-permission" ignore="true" />
3031
<type name="apex-system-service" ignore="true" />
3132
<type name="attribution" ignore="true" />
@@ -136,6 +137,7 @@
136137
<element path="activity.attributionTags" visible="false" />
137138
<element path="activity.forceQueryable" visible="false" />
138139
<element path="activity.inheritShowWhenLocked" visible="false" />
140+
<element path="activity.intentMatchingFlags" visible="false" />
139141
<element path="activity.knownActivityEmbeddingCerts" visible="false" />
140142
<element path="activity.minAspectRatio" visible="false" />
141143
<element path="activity.playHomeTransitionSound" visible="false" />
@@ -174,6 +176,7 @@
174176
<element path="application.manageSpaceActivity" type="Type?" manualMap="true" />
175177
<element path="application.name" manualMap="true" />
176178
<element path="application.networkSecurityConfig" visible="true" />
179+
<element path="application.pageSizeCompat" visible="true" />
177180
<element path="application.permission" visible="true" />
178181
<element path="application.persistent" type="bool" />
179182
<element path="application.process" visible="true" />
@@ -195,6 +198,8 @@
195198
<element path="application.allowAudioPlaybackCapture" visible="false" />
196199
<element path="application.allowAutoRevokePermissionsExemption" visible="false" />
197200
<element path="application.allowClearUserDataOnFailedRestore" visible="false" />
201+
<element path="application.alternateLauncherIcons" visible="false" />
202+
<element path="application.alternateLauncherLabels" visible="false" />
198203
<element path="application.appCategory" type="Android.Content.PM.ApplicationCategories" />
199204
<element path="application.appComponentFactory" visible="false" />
200205
<element path="application.attributionsAreUserVisible" visible="false" />
@@ -205,6 +210,7 @@
205210
<element path="application.defaultToDeviceProtectedStorage" visible="false" />
206211
<element path="application.enableOnBackInvokedCallback" visible="false" />
207212
<element path="application.forceQueryable" visible="false" />
213+
<element path="application.intentMatchingFlags" visible="false" />
208214
<element path="application.knownActivityEmbeddingCerts" visible="false" />
209215
<element path="application.localeConfig" visible="false" />
210216
<element path="application.maxAspectRatio" visible="false" />
@@ -354,6 +360,7 @@
354360
<element path="provider.banner" visible="false" />
355361
<element path="provider.description" visible="false" />
356362
<element path="provider.forceUriPermissions" visible="false" />
363+
<element path="provider.intentMatchingFlags" visible="false" />
357364
<element path="provider.logo" visible="false" />
358365
<element path="provider.singleUser" visible="false" />
359366
<element path="provider.splitName" visible="false" />
@@ -375,6 +382,7 @@
375382
<!-- Undocumented attributes -->
376383
<element path="receiver.attributionTags" visible="false" />
377384
<element path="receiver.banner" visible="false" />
385+
<element path="receiver.intentMatchingFlags" visible="false" />
378386
<element path="receiver.logo" visible="false" />
379387
<element path="receiver.singleUser" visible="false" />
380388

@@ -397,6 +405,7 @@
397405
<element path="service.banner" visible="false" />
398406
<element path="service.description" visible="true" />
399407
<element path="service.externalService" visible="false" />
408+
<element path="service.intentMatchingFlags" visible="false" />
400409
<element path="service.logo" visible="false" />
401410
<element path="service.singleUser" visible="false" />
402411
<element path="service.splitName" visible="false" />

build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class BuildAndroidPlatforms
4646
new AndroidPlatform (apiName: "Tiramisu", apiLevel: 33, platformID: "33", include: "v13.0", framework: "v13.0"),
4747
new AndroidPlatform (apiName: "UpsideDownCake", apiLevel: 34, platformID: "34", include: "v14.0", framework: "v14.0"),
4848
new AndroidPlatform (apiName: "VanillaIceCream", apiLevel: 35, platformID: "35", include: "v15.0", framework: "v15.0"),
49-
new AndroidPlatform (apiName: "Baklava", apiLevel: 36, platformID: "Baklava", include: "v15.0.99", framework: "v15.0.99", stable: false),
49+
new AndroidPlatform (apiName: "Baklava", apiLevel: 36, platformID: "36", include: "v16.0", framework: "v16.0"),
5050
};
5151

5252
}

build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ public AndroidToolchain ()
7272
new AndroidPlatformComponent ("platform-32_r01", apiLevel: "32", pkgRevision: "1"),
7373
new AndroidPlatformComponent ("platform-33-ext3_r03", apiLevel: "33", pkgRevision: "3"),
7474
new AndroidPlatformComponent ("platform-34-ext7_r02", apiLevel: "34", pkgRevision: "2"),
75-
new AndroidPlatformComponent ("platform-35_r01", apiLevel: "35", pkgRevision: "1", isLatestStable: true),
76-
new AndroidPlatformComponent ("platform-Baklava_r05", apiLevel: "Baklava", pkgRevision: "5", isLatestStable: true),
75+
new AndroidPlatformComponent ("platform-35_r01", apiLevel: "35", pkgRevision: "1"),
76+
new AndroidPlatformComponent ("platform-36_r01", apiLevel: "36", pkgRevision: "1", isLatestStable: true),
7777

7878
new AndroidToolchainComponent ("source-35_r01",
7979
destDir: Path.Combine ("sources", "android-35"),

src/Mono.Android/Mono.Android.csproj

+1-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@
3434
<RunAnalyzers Condition=" '$(DisableApiCompatibilityCheck)' == 'True' ">false</RunAnalyzers>
3535

3636
<!-- PublicApiAnalyzers warnings should be errors, but building in VS throws incorrect extra warnings -->
37-
<!-- Temporarily ignore unstable version warnings until VS can build .NET 10 projects -->
38-
<WarningsAsErrors Condition=" '$(BuildingInsideVisualStudio)' != 'True' AND '$(IsUnstableVersion)' != 'True' ">$(WarningsAsErrors);RS0016,RS0017</WarningsAsErrors>
37+
<WarningsAsErrors Condition=" '$(BuildingInsideVisualStudio)' != 'True' ">$(WarningsAsErrors);RS0016,RS0017</WarningsAsErrors>
3938
</PropertyGroup>
4039

4140
<PropertyGroup Condition=" '$(IncludeAndroidJavadoc)' == 'True' ">

0 commit comments

Comments
 (0)