Skip to content

[TrimmableTypeMap] Add GetStaticMethodFallbackTypesCore override for desugared default interface methods - #11050

Merged
jonathanpeppers merged 4 commits into
mainfrom
copilot/add-getstaticmethodfallbacktypescore-override
Apr 13, 2026
Merged

[TrimmableTypeMap] Add GetStaticMethodFallbackTypesCore override for desugared default interface methods#11050
jonathanpeppers merged 4 commits into
mainfrom
copilot/add-getstaticmethodfallbacktypescore-override

Conversation

CopilotAI commented Mar 30, 2026

Copy link
Copy Markdown
Contributor

Adds GetStaticMethodFallbackTypesCore override to TrimmableTypeMapTypeManager to support Java 8+ default interface methods desugared by D8/R8.

Problem

TrimmableTypeMapTypeManager did not override GetStaticMethodFallbackTypesCore(). Without this, calls to desugared default interface methods fail with NoSuchMethodError at runtime when using the trimmable type map. This affects any app using Java libraries with default interface methods (Java 8+ feature, very common in modern Android libraries like AndroidX).

Fix

Added the same override that already exists in ManagedTypeManager to TrimmableTypeMapTypeManager:

protectedoverrideIReadOnlyList<string>?GetStaticMethodFallbackTypesCore(stringjniSimpleReference){intslash=jniSimpleReference.LastIndexOf('/');vardesugarType=slash>0?$"{jniSimpleReference.Substring(0,slash+1)}Desugar{jniSimpleReference.Substring(slash+1)}":$"Desugar{jniSimpleReference}";returnnew[]{$"{desugarType}$_CC",$"{jniSimpleReference}$-CC",};}

This generates two fallback type names for desugared companion classes (Desugar{Type}$_CC and {Type}$-CC) so that JNI static method lookups on desugared default interface methods succeed at runtime.

Tests

Added TrimmableTypeMapTypeManagerTests to tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/ to verify the fallback type generation. The tests use a subclass of TrimmableTypeMapTypeManager (accessible via the existing InternalsVisibleTo in Mono.Android) and cover three cases:

  • Type with a single-level package name (e.g. android/app/Activity)
  • Type without a package name (e.g. Activity)
  • Type with a deep package hierarchy (e.g. com/example/package/MyInterface)

@simonrozsival

Copy link
Copy Markdown
Member

@copilot continue

…Manager
Agent-Logs-Url: https://github.com/dotnet/android/sessions/1eb1fc88-df89-4cb7-bd45-15187eea3776
Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com>

CopilotAI commented Mar 31, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot continue

Added the GetStaticMethodFallbackTypesCore override to TrimmableTypeMapTypeManager in c0a25a0. The implementation is a direct copy from ManagedTypeManager, generating the two desugar fallback type names (Desugar...$_CC and ...$-CC) needed for D8/R8-desugared default interface methods.

CopilotAI changed the title [WIP] Add GetStaticMethodFallbackTypesCore override for TrimmableTypeMap[TrimmableTypeMap] Add GetStaticMethodFallbackTypesCore override for desugared default interface methodsMar 31, 2026
@simonrozsival
simonrozsival marked this pull request as ready for review March 31, 2026 13:35
CopilotAI review requested due to automatic review settings March 31, 2026 13:35

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds support in the trimmable typemap runtime type manager for resolving Java 8+ desugared default interface method companion classes during JNI static method lookup, preventing runtime NoSuchMethodError when default interface methods are used.

Changes:

  • Added GetStaticMethodFallbackTypesCore() override to TrimmableTypeMapTypeManager.
  • Implemented desugar companion-class fallback name generation (Desugar{Type}$_CC and {Type}$-CC) consistent with ManagedTypeManager.

@simonrozsivalsimonrozsival added copilot `copilot-cli` or other AIs were used to author this trimmable-type-map labels Mar 31, 2026
…Core
Agent-Logs-Url: https://github.com/dotnet/android/sessions/66cf81ea-433f-43ac-8c85-45bb0483a230
Co-authored-by: jonathanpeppers <840039+jonathanpeppers@users.noreply.github.com>
@jonathanpeppers
jonathanpeppers merged commit daa930d into mainApr 13, 2026
6 checks passed
@jonathanpeppers
jonathanpeppers deleted the copilot/add-getstaticmethodfallbacktypescore-override branch April 13, 2026 21:01
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 14, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

copilot`copilot-cli` or other AIs were used to author thistrimmable-type-map

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[TrimmableTypeMap] Add GetStaticMethodFallbackTypesCore override for desugared default interface methods

4 participants

@simonrozsival@jonathanpeppers