This repository was archived by the owner on Aug 27, 2026. It is now read-only.

Remove Java.Interop.GenericMarshaler - #1450

Merged
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler
Jun 9, 2026
Merged

Remove Java.Interop.GenericMarshaler#1450
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Part of dotnet/android#11843.

This removes the standalone Java.Interop.GenericMarshaler helper assembly and its performance benchmark project. Java.Interop-Tests still exercises the few generic marshaling paths it needs via a small test-local helper instead of referencing the deleted assembly.

Also removes the now-obsolete CI/docs/metadata references and the InternalsVisibleTo entry for Java.Interop.GenericMarshaler.

Validation:

  • git diff --check origin/main
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop-Tests/Java.Interop-Tests.csproj
    • Passed: 671, Failed: 0, Skipped: 4

Note for dotnet/android codeflow:

  • Android has test-only references to this helper in Xamarin.Android-Tests.sln and tests/Mono.Android-Tests/Java.Interop-Tests/Java.Interop-Tests.NET.csproj; those will need to be removed or updated when this flows.

Remove the standalone generic JNI marshaling helper assembly and its performance tests. Keep Java.Interop-Tests compiling by moving the few needed helper wrappers into the test assembly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 9, 2026 06:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR removes the standalone Java.Interop.GenericMarshaler assembly (and its performance benchmark project) as part of the repo reduction effort in #1448, while keeping required generic marshaling test coverage by introducing a small test-local replacement for the few extension methods the unit tests still need.

Changes:

  • Removed the src/Java.Interop.GenericMarshaler project and the Java.Interop-PerformanceTests project (and associated sources/CI/docs references).
  • Updated Java.Interop-Tests to stop referencing Java.Interop.GenericMarshaler and added a test-local JniPeerMembersExtensions helper to cover required generic marshaling paths.
  • Removed the InternalsVisibleTo entry for Java.Interop.GenericMarshaler from Java.Interop.
Show a summary per file
FileDescription
tests/Java.Interop-Tests/Java.Interop/TestType.csDrops Java.Interop.GenericMarshaler using; continues to exercise generic marshaling via test-local extensions.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersTests.csDrops Java.Interop.GenericMarshaler using; keeps tests using extension-method-based generic marshal paths.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersExtensions.csAdds test-local extension methods replacing the limited generic marshaling helpers previously sourced from the deleted assembly.
tests/Java.Interop-Tests/Java.Interop/CallVirtualFromConstructorBase.csDrops Java.Interop.GenericMarshaler using; continues constructor/method invocation coverage via test-local extensions.
tests/Java.Interop-Tests/Java.Interop-Tests.csprojRemoves project reference to Java.Interop.GenericMarshaler.
tests/Java.Interop-PerformanceTests/java/com/xamarin/interop/performance/JavaTiming.javaDeletes Java timing helper source as part of removing the performance test project.
tests/Java.Interop-PerformanceTests/Java.Interop/TimingTests.csDeletes performance benchmark test suite.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaVMFixture.csDeletes performance-test JVM fixture.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaTiming.csDeletes managed wrapper used by performance benchmarks (and its generic marshal benchmark paths).
tests/Java.Interop-PerformanceTests/Java.Interop/JavaPrimitiveArraysTiming.csDeletes primitive array lookup/creation performance benchmarks.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.targetsDeletes MSBuild target used to build the performance-test JAR.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csprojDeletes the performance test project definition.
src/Java.Interop/Properties/AssemblyInfo.csRemoves InternalsVisibleTo for Java.Interop.GenericMarshaler.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler/JniPeerInstanceMethodsExtensions.ttDeletes T4 template which generated the generic marshaling extension surface.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler.csprojDeletes the Java.Interop.GenericMarshaler project file.
Java.Interop.slnRemoves the deleted projects from the solution.
build-tools/automation/templates/core-tests.yamlRemoves CI execution of the deleted performance test project.
.github/skills/build-and-test/SKILL.mdRemoves mention of Java.Interop-PerformanceTests from the documented common test projects list.
.github/copilot-instructions.mdRemoves mention of Java.Interop-PerformanceTests from repo testing structure documentation.

Copilot's findings

  • Files reviewed: 19/20 changed files
  • Comments generated: 0

@simonrozsivalsimonrozsival added the ready-to-review This PR is ready to review/merge, thanks! label Jun 9, 2026
@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/review

@github-actions

github-actionsBot commented Jun 9, 2026

Copy link
Copy Markdown

Java.Interop PR Reviewer completed successfully!

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ LGTM

Clean removal of Java.Interop.GenericMarshaler and Java.Interop-PerformanceTests. The test-local JniPeerMembersExtensions helper covers exactly the 5 extension methods still used by tests, with proper [DynamicallyAccessedMembers] annotations and try/finally cleanup for DestroyGenericArgumentState.

Summary of changes verified:

  • All using Java.Interop.GenericMarshaler; removed; call sites resolve the extension methods from the new test-local helper in the same namespace ✅
  • InternalsVisibleTo for GenericMarshaler removed from AssemblyInfo.cs
  • Solution, CI pipeline, and documentation references all cleaned up ✅
  • Pre-existing missing EndProject for Java.Interop.Tools.Maven-Tests in .sln fixed incidentally — nice catch 👍
  • No remaining references to GenericMarshaler anywhere in the repo ✅

Positive callouts:

  • PR description is thorough — documents downstream dotnet/android impact
  • Validation section includes test counts
  • The replacement helper is minimal and well-scoped to only what tests actually need

CI note: Only license/cla and copilot-pull-request-reviewer checks are visible — no build/test CI run yet. The author reports local test success (671 passed, 0 failed), but a green CI run would be nice before merge.

SeverityCount
❌ error0
⚠️ warning0
💡 suggestion1

Generated by Java.Interop PR Reviewer for issue #1450 · ● 3.5M

@jonathanpeppers
jonathanpeppers enabled auto-merge (squash) June 9, 2026 13:15
@jonathanpeppers
jonathanpeppers merged commit cd2fc12 into mainJun 9, 2026
2 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/remove-generic-marshaler branch June 9, 2026 14:02
jonathanpeppers added a commit to dotnet/android that referenced this pull request Jun 16, 2026
Bumps [external/Java.Interop](https://github.com/dotnet/java-interop) from `b881d21` to [`6820a9cb`](dotnet/java-interop@6820a9c).
## Java.Interop changes pulled in
- [`6820a9c`](dotnet/java-interop@6820a9c) [Java.Interop] Make JavaProxyObject.RegisterNativeMembers private again ([#1468](dotnet/java-interop#1468))
- [`a2159d7`](dotnet/java-interop@a2159d70) Remove NuGet dependency grouping from Dependabot config ([#1459](dotnet/java-interop#1459))
- [`a0ca676`](dotnet/java-interop@a0ca6760) [ci] Update agentic workflows to claude-opus-4.8 ([#1461](dotnet/java-interop#1461))
- [`6d8aef7`](dotnet/java-interop@6d8aef7b) Bump to dotnet/android-tools@1fb68b6 ([#1457](dotnet/java-interop#1457))
- [`cfca8ad`](dotnet/java-interop@cfca8ad) Upgrade gh-aw to v0.79.6 and recompile workflows ([#1460](dotnet/java-interop#1460))
- [`0104236`](dotnet/java-interop@0104236e) [JniValueManager] Make TryConstructPeer virtual ([#1456](dotnet/java-interop#1456))
- [`d7dbad5`](dotnet/java-interop@d7dbad5) Remove Java.Interop.Dynamic ([#1449](dotnet/java-interop#1449))
- [`0244c10`](dotnet/java-interop@0244c10) Split reflection-based JniTypeManager and JniValueManager behavior ([#1441](dotnet/java-interop#1441))
- [`9ca7064`](dotnet/java-interop@9ca7064) [Java.Interop] Remove legacy `NET` preprocessor paths ([#1451](dotnet/java-interop#1451))
- [`cd2fc12`](dotnet/java-interop@cd2fc12) Remove Java.Interop.GenericMarshaler ([#1450](dotnet/java-interop#1450))
See full diff in [compare view](dotnet/java-interop@b881d21...6820a9c).
## Changes in this PR (beyond the submodule bump)
The Java.Interop bump — particularly [#1441](dotnet/java-interop#1441) (split reflection-based `JniTypeManager` and `JniValueManager`) and [#1449](dotnet/java-interop#1449) (removal of `Java.Interop.Dynamic`) — required a number of follow-on changes in `dotnet/android`:
### Runtime / `Mono.Android`
- **Adapt Android runtime to Java.Interop reflection managers** — switch the `JavaInteropTypeManager` / `JavaInteropValueManager` hierarchy to the new reflection-based base types and update type/value manager construction to match.
- **Change base type of value managers and type managers** so the runtime composes correctly with the new Java.Interop split.
- **Suppress reflection manager trim warnings only** — narrow the existing trim suppressions so they apply to the reflection-only managers and don't hide other warnings.
- **Suppress IL2068 on `ManagedTypeManager.GetTypeForSimpleReference`** — annotate the entry point that legitimately requires reflection so trim analysis is satisfied.
### Tests / apkdescs
- **Regenerate `BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc`** to track size changes from the Java.Interop bump.
- **Regenerate Simple `BuildReleaseArm64` apkdescs** (`MonoVM` + `NativeAOT`) from a `Release` SDK so they match what CI produces.
- **Update NativeAOT warning expectations** — `Mono.Android` now produces fewer trim/AOT warnings, so loosen the strict `4 Warning(s)` checks in `SupportedOSPlatformVersion` and `CheckSignApk` to `AssertHasAtMostWarnings (2)` (new helper in `AssertionExtensions`) and drop the `BuildHasTrimmerWarnings` data counts (`3 → 2`, `4 → 3`) accordingly.
### Merges
- Two merges from `origin/main` to keep the branch current and resolve a conflict in `Microsoft.Android.Sdk.TypeMap.Trimmable.targets`.
Co-authored-by: Simon Rozsival <simon@rozsival.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

ready-to-reviewThis PR is ready to review/merge, thanks!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Aug 27, 2026. It is now read-only.

Remove Java.Interop.GenericMarshaler - #1450

Merged
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler
Jun 9, 2026
Merged

Remove Java.Interop.GenericMarshaler#1450
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Part of dotnet/android#11843.

This removes the standalone Java.Interop.GenericMarshaler helper assembly and its performance benchmark project. Java.Interop-Tests still exercises the few generic marshaling paths it needs via a small test-local helper instead of referencing the deleted assembly.

Also removes the now-obsolete CI/docs/metadata references and the InternalsVisibleTo entry for Java.Interop.GenericMarshaler.

Validation:

  • git diff --check origin/main
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop-Tests/Java.Interop-Tests.csproj
    • Passed: 671, Failed: 0, Skipped: 4

Note for dotnet/android codeflow:

  • Android has test-only references to this helper in Xamarin.Android-Tests.sln and tests/Mono.Android-Tests/Java.Interop-Tests/Java.Interop-Tests.NET.csproj; those will need to be removed or updated when this flows.

Remove the standalone generic JNI marshaling helper assembly and its performance tests. Keep Java.Interop-Tests compiling by moving the few needed helper wrappers into the test assembly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 9, 2026 06:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR removes the standalone Java.Interop.GenericMarshaler assembly (and its performance benchmark project) as part of the repo reduction effort in #1448, while keeping required generic marshaling test coverage by introducing a small test-local replacement for the few extension methods the unit tests still need.

Changes:

  • Removed the src/Java.Interop.GenericMarshaler project and the Java.Interop-PerformanceTests project (and associated sources/CI/docs references).
  • Updated Java.Interop-Tests to stop referencing Java.Interop.GenericMarshaler and added a test-local JniPeerMembersExtensions helper to cover required generic marshaling paths.
  • Removed the InternalsVisibleTo entry for Java.Interop.GenericMarshaler from Java.Interop.
Show a summary per file
FileDescription
tests/Java.Interop-Tests/Java.Interop/TestType.csDrops Java.Interop.GenericMarshaler using; continues to exercise generic marshaling via test-local extensions.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersTests.csDrops Java.Interop.GenericMarshaler using; keeps tests using extension-method-based generic marshal paths.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersExtensions.csAdds test-local extension methods replacing the limited generic marshaling helpers previously sourced from the deleted assembly.
tests/Java.Interop-Tests/Java.Interop/CallVirtualFromConstructorBase.csDrops Java.Interop.GenericMarshaler using; continues constructor/method invocation coverage via test-local extensions.
tests/Java.Interop-Tests/Java.Interop-Tests.csprojRemoves project reference to Java.Interop.GenericMarshaler.
tests/Java.Interop-PerformanceTests/java/com/xamarin/interop/performance/JavaTiming.javaDeletes Java timing helper source as part of removing the performance test project.
tests/Java.Interop-PerformanceTests/Java.Interop/TimingTests.csDeletes performance benchmark test suite.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaVMFixture.csDeletes performance-test JVM fixture.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaTiming.csDeletes managed wrapper used by performance benchmarks (and its generic marshal benchmark paths).
tests/Java.Interop-PerformanceTests/Java.Interop/JavaPrimitiveArraysTiming.csDeletes primitive array lookup/creation performance benchmarks.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.targetsDeletes MSBuild target used to build the performance-test JAR.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csprojDeletes the performance test project definition.
src/Java.Interop/Properties/AssemblyInfo.csRemoves InternalsVisibleTo for Java.Interop.GenericMarshaler.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler/JniPeerInstanceMethodsExtensions.ttDeletes T4 template which generated the generic marshaling extension surface.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler.csprojDeletes the Java.Interop.GenericMarshaler project file.
Java.Interop.slnRemoves the deleted projects from the solution.
build-tools/automation/templates/core-tests.yamlRemoves CI execution of the deleted performance test project.
.github/skills/build-and-test/SKILL.mdRemoves mention of Java.Interop-PerformanceTests from the documented common test projects list.
.github/copilot-instructions.mdRemoves mention of Java.Interop-PerformanceTests from repo testing structure documentation.

Copilot's findings

  • Files reviewed: 19/20 changed files
  • Comments generated: 0

@simonrozsivalsimonrozsival added the ready-to-review This PR is ready to review/merge, thanks! label Jun 9, 2026
@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/review

@github-actions

github-actionsBot commented Jun 9, 2026

Copy link
Copy Markdown

Java.Interop PR Reviewer completed successfully!

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ LGTM

Clean removal of Java.Interop.GenericMarshaler and Java.Interop-PerformanceTests. The test-local JniPeerMembersExtensions helper covers exactly the 5 extension methods still used by tests, with proper [DynamicallyAccessedMembers] annotations and try/finally cleanup for DestroyGenericArgumentState.

Summary of changes verified:

  • All using Java.Interop.GenericMarshaler; removed; call sites resolve the extension methods from the new test-local helper in the same namespace ✅
  • InternalsVisibleTo for GenericMarshaler removed from AssemblyInfo.cs
  • Solution, CI pipeline, and documentation references all cleaned up ✅
  • Pre-existing missing EndProject for Java.Interop.Tools.Maven-Tests in .sln fixed incidentally — nice catch 👍
  • No remaining references to GenericMarshaler anywhere in the repo ✅

Positive callouts:

  • PR description is thorough — documents downstream dotnet/android impact
  • Validation section includes test counts
  • The replacement helper is minimal and well-scoped to only what tests actually need

CI note: Only license/cla and copilot-pull-request-reviewer checks are visible — no build/test CI run yet. The author reports local test success (671 passed, 0 failed), but a green CI run would be nice before merge.

SeverityCount
❌ error0
⚠️ warning0
💡 suggestion1

Generated by Java.Interop PR Reviewer for issue #1450 · ● 3.5M

@jonathanpeppers
jonathanpeppers enabled auto-merge (squash) June 9, 2026 13:15
@jonathanpeppers
jonathanpeppers merged commit cd2fc12 into mainJun 9, 2026
2 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/remove-generic-marshaler branch June 9, 2026 14:02
jonathanpeppers added a commit to dotnet/android that referenced this pull request Jun 16, 2026
Bumps [external/Java.Interop](https://github.com/dotnet/java-interop) from `b881d21` to [`6820a9cb`](dotnet/java-interop@6820a9c).
## Java.Interop changes pulled in
- [`6820a9c`](dotnet/java-interop@6820a9c) [Java.Interop] Make JavaProxyObject.RegisterNativeMembers private again ([#1468](dotnet/java-interop#1468))
- [`a2159d7`](dotnet/java-interop@a2159d70) Remove NuGet dependency grouping from Dependabot config ([#1459](dotnet/java-interop#1459))
- [`a0ca676`](dotnet/java-interop@a0ca6760) [ci] Update agentic workflows to claude-opus-4.8 ([#1461](dotnet/java-interop#1461))
- [`6d8aef7`](dotnet/java-interop@6d8aef7b) Bump to dotnet/android-tools@1fb68b6 ([#1457](dotnet/java-interop#1457))
- [`cfca8ad`](dotnet/java-interop@cfca8ad) Upgrade gh-aw to v0.79.6 and recompile workflows ([#1460](dotnet/java-interop#1460))
- [`0104236`](dotnet/java-interop@0104236e) [JniValueManager] Make TryConstructPeer virtual ([#1456](dotnet/java-interop#1456))
- [`d7dbad5`](dotnet/java-interop@d7dbad5) Remove Java.Interop.Dynamic ([#1449](dotnet/java-interop#1449))
- [`0244c10`](dotnet/java-interop@0244c10) Split reflection-based JniTypeManager and JniValueManager behavior ([#1441](dotnet/java-interop#1441))
- [`9ca7064`](dotnet/java-interop@9ca7064) [Java.Interop] Remove legacy `NET` preprocessor paths ([#1451](dotnet/java-interop#1451))
- [`cd2fc12`](dotnet/java-interop@cd2fc12) Remove Java.Interop.GenericMarshaler ([#1450](dotnet/java-interop#1450))
See full diff in [compare view](dotnet/java-interop@b881d21...6820a9c).
## Changes in this PR (beyond the submodule bump)
The Java.Interop bump — particularly [#1441](dotnet/java-interop#1441) (split reflection-based `JniTypeManager` and `JniValueManager`) and [#1449](dotnet/java-interop#1449) (removal of `Java.Interop.Dynamic`) — required a number of follow-on changes in `dotnet/android`:
### Runtime / `Mono.Android`
- **Adapt Android runtime to Java.Interop reflection managers** — switch the `JavaInteropTypeManager` / `JavaInteropValueManager` hierarchy to the new reflection-based base types and update type/value manager construction to match.
- **Change base type of value managers and type managers** so the runtime composes correctly with the new Java.Interop split.
- **Suppress reflection manager trim warnings only** — narrow the existing trim suppressions so they apply to the reflection-only managers and don't hide other warnings.
- **Suppress IL2068 on `ManagedTypeManager.GetTypeForSimpleReference`** — annotate the entry point that legitimately requires reflection so trim analysis is satisfied.
### Tests / apkdescs
- **Regenerate `BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc`** to track size changes from the Java.Interop bump.
- **Regenerate Simple `BuildReleaseArm64` apkdescs** (`MonoVM` + `NativeAOT`) from a `Release` SDK so they match what CI produces.
- **Update NativeAOT warning expectations** — `Mono.Android` now produces fewer trim/AOT warnings, so loosen the strict `4 Warning(s)` checks in `SupportedOSPlatformVersion` and `CheckSignApk` to `AssertHasAtMostWarnings (2)` (new helper in `AssertionExtensions`) and drop the `BuildHasTrimmerWarnings` data counts (`3 → 2`, `4 → 3`) accordingly.
### Merges
- Two merges from `origin/main` to keep the branch current and resolve a conflict in `Microsoft.Android.Sdk.TypeMap.Trimmable.targets`.
Co-authored-by: Simon Rozsival <simon@rozsival.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

ready-to-reviewThis PR is ready to review/merge, thanks!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 27, 2026. It is now read-only.

Remove Java.Interop.GenericMarshaler - #1450

Merged
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler
Jun 9, 2026
Merged

Remove Java.Interop.GenericMarshaler#1450
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Part of dotnet/android#11843.

This removes the standalone Java.Interop.GenericMarshaler helper assembly and its performance benchmark project. Java.Interop-Tests still exercises the few generic marshaling paths it needs via a small test-local helper instead of referencing the deleted assembly.

Also removes the now-obsolete CI/docs/metadata references and the InternalsVisibleTo entry for Java.Interop.GenericMarshaler.

Validation:

  • git diff --check origin/main
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop-Tests/Java.Interop-Tests.csproj
    • Passed: 671, Failed: 0, Skipped: 4

Note for dotnet/android codeflow:

  • Android has test-only references to this helper in Xamarin.Android-Tests.sln and tests/Mono.Android-Tests/Java.Interop-Tests/Java.Interop-Tests.NET.csproj; those will need to be removed or updated when this flows.

Remove the standalone generic JNI marshaling helper assembly and its performance tests. Keep Java.Interop-Tests compiling by moving the few needed helper wrappers into the test assembly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 9, 2026 06:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR removes the standalone Java.Interop.GenericMarshaler assembly (and its performance benchmark project) as part of the repo reduction effort in #1448, while keeping required generic marshaling test coverage by introducing a small test-local replacement for the few extension methods the unit tests still need.

Changes:

  • Removed the src/Java.Interop.GenericMarshaler project and the Java.Interop-PerformanceTests project (and associated sources/CI/docs references).
  • Updated Java.Interop-Tests to stop referencing Java.Interop.GenericMarshaler and added a test-local JniPeerMembersExtensions helper to cover required generic marshaling paths.
  • Removed the InternalsVisibleTo entry for Java.Interop.GenericMarshaler from Java.Interop.
Show a summary per file
FileDescription
tests/Java.Interop-Tests/Java.Interop/TestType.csDrops Java.Interop.GenericMarshaler using; continues to exercise generic marshaling via test-local extensions.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersTests.csDrops Java.Interop.GenericMarshaler using; keeps tests using extension-method-based generic marshal paths.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersExtensions.csAdds test-local extension methods replacing the limited generic marshaling helpers previously sourced from the deleted assembly.
tests/Java.Interop-Tests/Java.Interop/CallVirtualFromConstructorBase.csDrops Java.Interop.GenericMarshaler using; continues constructor/method invocation coverage via test-local extensions.
tests/Java.Interop-Tests/Java.Interop-Tests.csprojRemoves project reference to Java.Interop.GenericMarshaler.
tests/Java.Interop-PerformanceTests/java/com/xamarin/interop/performance/JavaTiming.javaDeletes Java timing helper source as part of removing the performance test project.
tests/Java.Interop-PerformanceTests/Java.Interop/TimingTests.csDeletes performance benchmark test suite.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaVMFixture.csDeletes performance-test JVM fixture.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaTiming.csDeletes managed wrapper used by performance benchmarks (and its generic marshal benchmark paths).
tests/Java.Interop-PerformanceTests/Java.Interop/JavaPrimitiveArraysTiming.csDeletes primitive array lookup/creation performance benchmarks.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.targetsDeletes MSBuild target used to build the performance-test JAR.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csprojDeletes the performance test project definition.
src/Java.Interop/Properties/AssemblyInfo.csRemoves InternalsVisibleTo for Java.Interop.GenericMarshaler.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler/JniPeerInstanceMethodsExtensions.ttDeletes T4 template which generated the generic marshaling extension surface.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler.csprojDeletes the Java.Interop.GenericMarshaler project file.
Java.Interop.slnRemoves the deleted projects from the solution.
build-tools/automation/templates/core-tests.yamlRemoves CI execution of the deleted performance test project.
.github/skills/build-and-test/SKILL.mdRemoves mention of Java.Interop-PerformanceTests from the documented common test projects list.
.github/copilot-instructions.mdRemoves mention of Java.Interop-PerformanceTests from repo testing structure documentation.

Copilot's findings

  • Files reviewed: 19/20 changed files
  • Comments generated: 0

@simonrozsivalsimonrozsival added the ready-to-review This PR is ready to review/merge, thanks! label Jun 9, 2026
@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/review

@github-actions

github-actionsBot commented Jun 9, 2026

Copy link
Copy Markdown

Java.Interop PR Reviewer completed successfully!

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ LGTM

Clean removal of Java.Interop.GenericMarshaler and Java.Interop-PerformanceTests. The test-local JniPeerMembersExtensions helper covers exactly the 5 extension methods still used by tests, with proper [DynamicallyAccessedMembers] annotations and try/finally cleanup for DestroyGenericArgumentState.

Summary of changes verified:

  • All using Java.Interop.GenericMarshaler; removed; call sites resolve the extension methods from the new test-local helper in the same namespace ✅
  • InternalsVisibleTo for GenericMarshaler removed from AssemblyInfo.cs
  • Solution, CI pipeline, and documentation references all cleaned up ✅
  • Pre-existing missing EndProject for Java.Interop.Tools.Maven-Tests in .sln fixed incidentally — nice catch 👍
  • No remaining references to GenericMarshaler anywhere in the repo ✅

Positive callouts:

  • PR description is thorough — documents downstream dotnet/android impact
  • Validation section includes test counts
  • The replacement helper is minimal and well-scoped to only what tests actually need

CI note: Only license/cla and copilot-pull-request-reviewer checks are visible — no build/test CI run yet. The author reports local test success (671 passed, 0 failed), but a green CI run would be nice before merge.

SeverityCount
❌ error0
⚠️ warning0
💡 suggestion1

Generated by Java.Interop PR Reviewer for issue #1450 · ● 3.5M

@jonathanpeppers
jonathanpeppers enabled auto-merge (squash) June 9, 2026 13:15
@jonathanpeppers
jonathanpeppers merged commit cd2fc12 into mainJun 9, 2026
2 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/remove-generic-marshaler branch June 9, 2026 14:02
jonathanpeppers added a commit to dotnet/android that referenced this pull request Jun 16, 2026
Bumps [external/Java.Interop](https://github.com/dotnet/java-interop) from `b881d21` to [`6820a9cb`](dotnet/java-interop@6820a9c).
## Java.Interop changes pulled in
- [`6820a9c`](dotnet/java-interop@6820a9c) [Java.Interop] Make JavaProxyObject.RegisterNativeMembers private again ([#1468](dotnet/java-interop#1468))
- [`a2159d7`](dotnet/java-interop@a2159d70) Remove NuGet dependency grouping from Dependabot config ([#1459](dotnet/java-interop#1459))
- [`a0ca676`](dotnet/java-interop@a0ca6760) [ci] Update agentic workflows to claude-opus-4.8 ([#1461](dotnet/java-interop#1461))
- [`6d8aef7`](dotnet/java-interop@6d8aef7b) Bump to dotnet/android-tools@1fb68b6 ([#1457](dotnet/java-interop#1457))
- [`cfca8ad`](dotnet/java-interop@cfca8ad) Upgrade gh-aw to v0.79.6 and recompile workflows ([#1460](dotnet/java-interop#1460))
- [`0104236`](dotnet/java-interop@0104236e) [JniValueManager] Make TryConstructPeer virtual ([#1456](dotnet/java-interop#1456))
- [`d7dbad5`](dotnet/java-interop@d7dbad5) Remove Java.Interop.Dynamic ([#1449](dotnet/java-interop#1449))
- [`0244c10`](dotnet/java-interop@0244c10) Split reflection-based JniTypeManager and JniValueManager behavior ([#1441](dotnet/java-interop#1441))
- [`9ca7064`](dotnet/java-interop@9ca7064) [Java.Interop] Remove legacy `NET` preprocessor paths ([#1451](dotnet/java-interop#1451))
- [`cd2fc12`](dotnet/java-interop@cd2fc12) Remove Java.Interop.GenericMarshaler ([#1450](dotnet/java-interop#1450))
See full diff in [compare view](dotnet/java-interop@b881d21...6820a9c).
## Changes in this PR (beyond the submodule bump)
The Java.Interop bump — particularly [#1441](dotnet/java-interop#1441) (split reflection-based `JniTypeManager` and `JniValueManager`) and [#1449](dotnet/java-interop#1449) (removal of `Java.Interop.Dynamic`) — required a number of follow-on changes in `dotnet/android`:
### Runtime / `Mono.Android`
- **Adapt Android runtime to Java.Interop reflection managers** — switch the `JavaInteropTypeManager` / `JavaInteropValueManager` hierarchy to the new reflection-based base types and update type/value manager construction to match.
- **Change base type of value managers and type managers** so the runtime composes correctly with the new Java.Interop split.
- **Suppress reflection manager trim warnings only** — narrow the existing trim suppressions so they apply to the reflection-only managers and don't hide other warnings.
- **Suppress IL2068 on `ManagedTypeManager.GetTypeForSimpleReference`** — annotate the entry point that legitimately requires reflection so trim analysis is satisfied.
### Tests / apkdescs
- **Regenerate `BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc`** to track size changes from the Java.Interop bump.
- **Regenerate Simple `BuildReleaseArm64` apkdescs** (`MonoVM` + `NativeAOT`) from a `Release` SDK so they match what CI produces.
- **Update NativeAOT warning expectations** — `Mono.Android` now produces fewer trim/AOT warnings, so loosen the strict `4 Warning(s)` checks in `SupportedOSPlatformVersion` and `CheckSignApk` to `AssertHasAtMostWarnings (2)` (new helper in `AssertionExtensions`) and drop the `BuildHasTrimmerWarnings` data counts (`3 → 2`, `4 → 3`) accordingly.
### Merges
- Two merges from `origin/main` to keep the branch current and resolve a conflict in `Microsoft.Android.Sdk.TypeMap.Trimmable.targets`.
Co-authored-by: Simon Rozsival <simon@rozsival.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

ready-to-reviewThis PR is ready to review/merge, thanks!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 27, 2026. It is now read-only.

Remove Java.Interop.GenericMarshaler - #1450

Merged
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler
Jun 9, 2026
Merged

Remove Java.Interop.GenericMarshaler#1450
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Part of dotnet/android#11843.

This removes the standalone Java.Interop.GenericMarshaler helper assembly and its performance benchmark project. Java.Interop-Tests still exercises the few generic marshaling paths it needs via a small test-local helper instead of referencing the deleted assembly.

Also removes the now-obsolete CI/docs/metadata references and the InternalsVisibleTo entry for Java.Interop.GenericMarshaler.

Validation:

  • git diff --check origin/main
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop-Tests/Java.Interop-Tests.csproj
    • Passed: 671, Failed: 0, Skipped: 4

Note for dotnet/android codeflow:

  • Android has test-only references to this helper in Xamarin.Android-Tests.sln and tests/Mono.Android-Tests/Java.Interop-Tests/Java.Interop-Tests.NET.csproj; those will need to be removed or updated when this flows.

Remove the standalone generic JNI marshaling helper assembly and its performance tests. Keep Java.Interop-Tests compiling by moving the few needed helper wrappers into the test assembly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 9, 2026 06:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR removes the standalone Java.Interop.GenericMarshaler assembly (and its performance benchmark project) as part of the repo reduction effort in #1448, while keeping required generic marshaling test coverage by introducing a small test-local replacement for the few extension methods the unit tests still need.

Changes:

  • Removed the src/Java.Interop.GenericMarshaler project and the Java.Interop-PerformanceTests project (and associated sources/CI/docs references).
  • Updated Java.Interop-Tests to stop referencing Java.Interop.GenericMarshaler and added a test-local JniPeerMembersExtensions helper to cover required generic marshaling paths.
  • Removed the InternalsVisibleTo entry for Java.Interop.GenericMarshaler from Java.Interop.
Show a summary per file
FileDescription
tests/Java.Interop-Tests/Java.Interop/TestType.csDrops Java.Interop.GenericMarshaler using; continues to exercise generic marshaling via test-local extensions.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersTests.csDrops Java.Interop.GenericMarshaler using; keeps tests using extension-method-based generic marshal paths.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersExtensions.csAdds test-local extension methods replacing the limited generic marshaling helpers previously sourced from the deleted assembly.
tests/Java.Interop-Tests/Java.Interop/CallVirtualFromConstructorBase.csDrops Java.Interop.GenericMarshaler using; continues constructor/method invocation coverage via test-local extensions.
tests/Java.Interop-Tests/Java.Interop-Tests.csprojRemoves project reference to Java.Interop.GenericMarshaler.
tests/Java.Interop-PerformanceTests/java/com/xamarin/interop/performance/JavaTiming.javaDeletes Java timing helper source as part of removing the performance test project.
tests/Java.Interop-PerformanceTests/Java.Interop/TimingTests.csDeletes performance benchmark test suite.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaVMFixture.csDeletes performance-test JVM fixture.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaTiming.csDeletes managed wrapper used by performance benchmarks (and its generic marshal benchmark paths).
tests/Java.Interop-PerformanceTests/Java.Interop/JavaPrimitiveArraysTiming.csDeletes primitive array lookup/creation performance benchmarks.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.targetsDeletes MSBuild target used to build the performance-test JAR.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csprojDeletes the performance test project definition.
src/Java.Interop/Properties/AssemblyInfo.csRemoves InternalsVisibleTo for Java.Interop.GenericMarshaler.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler/JniPeerInstanceMethodsExtensions.ttDeletes T4 template which generated the generic marshaling extension surface.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler.csprojDeletes the Java.Interop.GenericMarshaler project file.
Java.Interop.slnRemoves the deleted projects from the solution.
build-tools/automation/templates/core-tests.yamlRemoves CI execution of the deleted performance test project.
.github/skills/build-and-test/SKILL.mdRemoves mention of Java.Interop-PerformanceTests from the documented common test projects list.
.github/copilot-instructions.mdRemoves mention of Java.Interop-PerformanceTests from repo testing structure documentation.

Copilot's findings

  • Files reviewed: 19/20 changed files
  • Comments generated: 0

@simonrozsivalsimonrozsival added the ready-to-review This PR is ready to review/merge, thanks! label Jun 9, 2026
@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/review

@github-actions

github-actionsBot commented Jun 9, 2026

Copy link
Copy Markdown

Java.Interop PR Reviewer completed successfully!

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ LGTM

Clean removal of Java.Interop.GenericMarshaler and Java.Interop-PerformanceTests. The test-local JniPeerMembersExtensions helper covers exactly the 5 extension methods still used by tests, with proper [DynamicallyAccessedMembers] annotations and try/finally cleanup for DestroyGenericArgumentState.

Summary of changes verified:

  • All using Java.Interop.GenericMarshaler; removed; call sites resolve the extension methods from the new test-local helper in the same namespace ✅
  • InternalsVisibleTo for GenericMarshaler removed from AssemblyInfo.cs
  • Solution, CI pipeline, and documentation references all cleaned up ✅
  • Pre-existing missing EndProject for Java.Interop.Tools.Maven-Tests in .sln fixed incidentally — nice catch 👍
  • No remaining references to GenericMarshaler anywhere in the repo ✅

Positive callouts:

  • PR description is thorough — documents downstream dotnet/android impact
  • Validation section includes test counts
  • The replacement helper is minimal and well-scoped to only what tests actually need

CI note: Only license/cla and copilot-pull-request-reviewer checks are visible — no build/test CI run yet. The author reports local test success (671 passed, 0 failed), but a green CI run would be nice before merge.

SeverityCount
❌ error0
⚠️ warning0
💡 suggestion1

Generated by Java.Interop PR Reviewer for issue #1450 · ● 3.5M

@jonathanpeppers
jonathanpeppers enabled auto-merge (squash) June 9, 2026 13:15
@jonathanpeppers
jonathanpeppers merged commit cd2fc12 into mainJun 9, 2026
2 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/remove-generic-marshaler branch June 9, 2026 14:02
jonathanpeppers added a commit to dotnet/android that referenced this pull request Jun 16, 2026
Bumps [external/Java.Interop](https://github.com/dotnet/java-interop) from `b881d21` to [`6820a9cb`](dotnet/java-interop@6820a9c).
## Java.Interop changes pulled in
- [`6820a9c`](dotnet/java-interop@6820a9c) [Java.Interop] Make JavaProxyObject.RegisterNativeMembers private again ([#1468](dotnet/java-interop#1468))
- [`a2159d7`](dotnet/java-interop@a2159d70) Remove NuGet dependency grouping from Dependabot config ([#1459](dotnet/java-interop#1459))
- [`a0ca676`](dotnet/java-interop@a0ca6760) [ci] Update agentic workflows to claude-opus-4.8 ([#1461](dotnet/java-interop#1461))
- [`6d8aef7`](dotnet/java-interop@6d8aef7b) Bump to dotnet/android-tools@1fb68b6 ([#1457](dotnet/java-interop#1457))
- [`cfca8ad`](dotnet/java-interop@cfca8ad) Upgrade gh-aw to v0.79.6 and recompile workflows ([#1460](dotnet/java-interop#1460))
- [`0104236`](dotnet/java-interop@0104236e) [JniValueManager] Make TryConstructPeer virtual ([#1456](dotnet/java-interop#1456))
- [`d7dbad5`](dotnet/java-interop@d7dbad5) Remove Java.Interop.Dynamic ([#1449](dotnet/java-interop#1449))
- [`0244c10`](dotnet/java-interop@0244c10) Split reflection-based JniTypeManager and JniValueManager behavior ([#1441](dotnet/java-interop#1441))
- [`9ca7064`](dotnet/java-interop@9ca7064) [Java.Interop] Remove legacy `NET` preprocessor paths ([#1451](dotnet/java-interop#1451))
- [`cd2fc12`](dotnet/java-interop@cd2fc12) Remove Java.Interop.GenericMarshaler ([#1450](dotnet/java-interop#1450))
See full diff in [compare view](dotnet/java-interop@b881d21...6820a9c).
## Changes in this PR (beyond the submodule bump)
The Java.Interop bump — particularly [#1441](dotnet/java-interop#1441) (split reflection-based `JniTypeManager` and `JniValueManager`) and [#1449](dotnet/java-interop#1449) (removal of `Java.Interop.Dynamic`) — required a number of follow-on changes in `dotnet/android`:
### Runtime / `Mono.Android`
- **Adapt Android runtime to Java.Interop reflection managers** — switch the `JavaInteropTypeManager` / `JavaInteropValueManager` hierarchy to the new reflection-based base types and update type/value manager construction to match.
- **Change base type of value managers and type managers** so the runtime composes correctly with the new Java.Interop split.
- **Suppress reflection manager trim warnings only** — narrow the existing trim suppressions so they apply to the reflection-only managers and don't hide other warnings.
- **Suppress IL2068 on `ManagedTypeManager.GetTypeForSimpleReference`** — annotate the entry point that legitimately requires reflection so trim analysis is satisfied.
### Tests / apkdescs
- **Regenerate `BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc`** to track size changes from the Java.Interop bump.
- **Regenerate Simple `BuildReleaseArm64` apkdescs** (`MonoVM` + `NativeAOT`) from a `Release` SDK so they match what CI produces.
- **Update NativeAOT warning expectations** — `Mono.Android` now produces fewer trim/AOT warnings, so loosen the strict `4 Warning(s)` checks in `SupportedOSPlatformVersion` and `CheckSignApk` to `AssertHasAtMostWarnings (2)` (new helper in `AssertionExtensions`) and drop the `BuildHasTrimmerWarnings` data counts (`3 → 2`, `4 → 3`) accordingly.
### Merges
- Two merges from `origin/main` to keep the branch current and resolve a conflict in `Microsoft.Android.Sdk.TypeMap.Trimmable.targets`.
Co-authored-by: Simon Rozsival <simon@rozsival.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

ready-to-reviewThis PR is ready to review/merge, thanks!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Aug 27, 2026. It is now read-only.

Remove Java.Interop.GenericMarshaler - #1450

Merged
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler
Jun 9, 2026
Merged

Remove Java.Interop.GenericMarshaler#1450
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Part of dotnet/android#11843.

This removes the standalone Java.Interop.GenericMarshaler helper assembly and its performance benchmark project. Java.Interop-Tests still exercises the few generic marshaling paths it needs via a small test-local helper instead of referencing the deleted assembly.

Also removes the now-obsolete CI/docs/metadata references and the InternalsVisibleTo entry for Java.Interop.GenericMarshaler.

Validation:

  • git diff --check origin/main
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop-Tests/Java.Interop-Tests.csproj
    • Passed: 671, Failed: 0, Skipped: 4

Note for dotnet/android codeflow:

  • Android has test-only references to this helper in Xamarin.Android-Tests.sln and tests/Mono.Android-Tests/Java.Interop-Tests/Java.Interop-Tests.NET.csproj; those will need to be removed or updated when this flows.

Remove the standalone generic JNI marshaling helper assembly and its performance tests. Keep Java.Interop-Tests compiling by moving the few needed helper wrappers into the test assembly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 9, 2026 06:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR removes the standalone Java.Interop.GenericMarshaler assembly (and its performance benchmark project) as part of the repo reduction effort in #1448, while keeping required generic marshaling test coverage by introducing a small test-local replacement for the few extension methods the unit tests still need.

Changes:

  • Removed the src/Java.Interop.GenericMarshaler project and the Java.Interop-PerformanceTests project (and associated sources/CI/docs references).
  • Updated Java.Interop-Tests to stop referencing Java.Interop.GenericMarshaler and added a test-local JniPeerMembersExtensions helper to cover required generic marshaling paths.
  • Removed the InternalsVisibleTo entry for Java.Interop.GenericMarshaler from Java.Interop.
Show a summary per file
FileDescription
tests/Java.Interop-Tests/Java.Interop/TestType.csDrops Java.Interop.GenericMarshaler using; continues to exercise generic marshaling via test-local extensions.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersTests.csDrops Java.Interop.GenericMarshaler using; keeps tests using extension-method-based generic marshal paths.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersExtensions.csAdds test-local extension methods replacing the limited generic marshaling helpers previously sourced from the deleted assembly.
tests/Java.Interop-Tests/Java.Interop/CallVirtualFromConstructorBase.csDrops Java.Interop.GenericMarshaler using; continues constructor/method invocation coverage via test-local extensions.
tests/Java.Interop-Tests/Java.Interop-Tests.csprojRemoves project reference to Java.Interop.GenericMarshaler.
tests/Java.Interop-PerformanceTests/java/com/xamarin/interop/performance/JavaTiming.javaDeletes Java timing helper source as part of removing the performance test project.
tests/Java.Interop-PerformanceTests/Java.Interop/TimingTests.csDeletes performance benchmark test suite.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaVMFixture.csDeletes performance-test JVM fixture.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaTiming.csDeletes managed wrapper used by performance benchmarks (and its generic marshal benchmark paths).
tests/Java.Interop-PerformanceTests/Java.Interop/JavaPrimitiveArraysTiming.csDeletes primitive array lookup/creation performance benchmarks.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.targetsDeletes MSBuild target used to build the performance-test JAR.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csprojDeletes the performance test project definition.
src/Java.Interop/Properties/AssemblyInfo.csRemoves InternalsVisibleTo for Java.Interop.GenericMarshaler.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler/JniPeerInstanceMethodsExtensions.ttDeletes T4 template which generated the generic marshaling extension surface.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler.csprojDeletes the Java.Interop.GenericMarshaler project file.
Java.Interop.slnRemoves the deleted projects from the solution.
build-tools/automation/templates/core-tests.yamlRemoves CI execution of the deleted performance test project.
.github/skills/build-and-test/SKILL.mdRemoves mention of Java.Interop-PerformanceTests from the documented common test projects list.
.github/copilot-instructions.mdRemoves mention of Java.Interop-PerformanceTests from repo testing structure documentation.

Copilot's findings

  • Files reviewed: 19/20 changed files
  • Comments generated: 0

@simonrozsivalsimonrozsival added the ready-to-review This PR is ready to review/merge, thanks! label Jun 9, 2026
@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/review

@github-actions

github-actionsBot commented Jun 9, 2026

Copy link
Copy Markdown

Java.Interop PR Reviewer completed successfully!

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ LGTM

Clean removal of Java.Interop.GenericMarshaler and Java.Interop-PerformanceTests. The test-local JniPeerMembersExtensions helper covers exactly the 5 extension methods still used by tests, with proper [DynamicallyAccessedMembers] annotations and try/finally cleanup for DestroyGenericArgumentState.

Summary of changes verified:

  • All using Java.Interop.GenericMarshaler; removed; call sites resolve the extension methods from the new test-local helper in the same namespace ✅
  • InternalsVisibleTo for GenericMarshaler removed from AssemblyInfo.cs
  • Solution, CI pipeline, and documentation references all cleaned up ✅
  • Pre-existing missing EndProject for Java.Interop.Tools.Maven-Tests in .sln fixed incidentally — nice catch 👍
  • No remaining references to GenericMarshaler anywhere in the repo ✅

Positive callouts:

  • PR description is thorough — documents downstream dotnet/android impact
  • Validation section includes test counts
  • The replacement helper is minimal and well-scoped to only what tests actually need

CI note: Only license/cla and copilot-pull-request-reviewer checks are visible — no build/test CI run yet. The author reports local test success (671 passed, 0 failed), but a green CI run would be nice before merge.

SeverityCount
❌ error0
⚠️ warning0
💡 suggestion1

Generated by Java.Interop PR Reviewer for issue #1450 · ● 3.5M

@jonathanpeppers
jonathanpeppers enabled auto-merge (squash) June 9, 2026 13:15
@jonathanpeppers
jonathanpeppers merged commit cd2fc12 into mainJun 9, 2026
2 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/remove-generic-marshaler branch June 9, 2026 14:02
jonathanpeppers added a commit to dotnet/android that referenced this pull request Jun 16, 2026
Bumps [external/Java.Interop](https://github.com/dotnet/java-interop) from `b881d21` to [`6820a9cb`](dotnet/java-interop@6820a9c).
## Java.Interop changes pulled in
- [`6820a9c`](dotnet/java-interop@6820a9c) [Java.Interop] Make JavaProxyObject.RegisterNativeMembers private again ([#1468](dotnet/java-interop#1468))
- [`a2159d7`](dotnet/java-interop@a2159d70) Remove NuGet dependency grouping from Dependabot config ([#1459](dotnet/java-interop#1459))
- [`a0ca676`](dotnet/java-interop@a0ca6760) [ci] Update agentic workflows to claude-opus-4.8 ([#1461](dotnet/java-interop#1461))
- [`6d8aef7`](dotnet/java-interop@6d8aef7b) Bump to dotnet/android-tools@1fb68b6 ([#1457](dotnet/java-interop#1457))
- [`cfca8ad`](dotnet/java-interop@cfca8ad) Upgrade gh-aw to v0.79.6 and recompile workflows ([#1460](dotnet/java-interop#1460))
- [`0104236`](dotnet/java-interop@0104236e) [JniValueManager] Make TryConstructPeer virtual ([#1456](dotnet/java-interop#1456))
- [`d7dbad5`](dotnet/java-interop@d7dbad5) Remove Java.Interop.Dynamic ([#1449](dotnet/java-interop#1449))
- [`0244c10`](dotnet/java-interop@0244c10) Split reflection-based JniTypeManager and JniValueManager behavior ([#1441](dotnet/java-interop#1441))
- [`9ca7064`](dotnet/java-interop@9ca7064) [Java.Interop] Remove legacy `NET` preprocessor paths ([#1451](dotnet/java-interop#1451))
- [`cd2fc12`](dotnet/java-interop@cd2fc12) Remove Java.Interop.GenericMarshaler ([#1450](dotnet/java-interop#1450))
See full diff in [compare view](dotnet/java-interop@b881d21...6820a9c).
## Changes in this PR (beyond the submodule bump)
The Java.Interop bump — particularly [#1441](dotnet/java-interop#1441) (split reflection-based `JniTypeManager` and `JniValueManager`) and [#1449](dotnet/java-interop#1449) (removal of `Java.Interop.Dynamic`) — required a number of follow-on changes in `dotnet/android`:
### Runtime / `Mono.Android`
- **Adapt Android runtime to Java.Interop reflection managers** — switch the `JavaInteropTypeManager` / `JavaInteropValueManager` hierarchy to the new reflection-based base types and update type/value manager construction to match.
- **Change base type of value managers and type managers** so the runtime composes correctly with the new Java.Interop split.
- **Suppress reflection manager trim warnings only** — narrow the existing trim suppressions so they apply to the reflection-only managers and don't hide other warnings.
- **Suppress IL2068 on `ManagedTypeManager.GetTypeForSimpleReference`** — annotate the entry point that legitimately requires reflection so trim analysis is satisfied.
### Tests / apkdescs
- **Regenerate `BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc`** to track size changes from the Java.Interop bump.
- **Regenerate Simple `BuildReleaseArm64` apkdescs** (`MonoVM` + `NativeAOT`) from a `Release` SDK so they match what CI produces.
- **Update NativeAOT warning expectations** — `Mono.Android` now produces fewer trim/AOT warnings, so loosen the strict `4 Warning(s)` checks in `SupportedOSPlatformVersion` and `CheckSignApk` to `AssertHasAtMostWarnings (2)` (new helper in `AssertionExtensions`) and drop the `BuildHasTrimmerWarnings` data counts (`3 → 2`, `4 → 3`) accordingly.
### Merges
- Two merges from `origin/main` to keep the branch current and resolve a conflict in `Microsoft.Android.Sdk.TypeMap.Trimmable.targets`.
Co-authored-by: Simon Rozsival <simon@rozsival.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

ready-to-reviewThis PR is ready to review/merge, thanks!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 27, 2026. It is now read-only.

Remove Java.Interop.GenericMarshaler - #1450

Merged
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler
Jun 9, 2026
Merged

Remove Java.Interop.GenericMarshaler#1450
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Part of dotnet/android#11843.

This removes the standalone Java.Interop.GenericMarshaler helper assembly and its performance benchmark project. Java.Interop-Tests still exercises the few generic marshaling paths it needs via a small test-local helper instead of referencing the deleted assembly.

Also removes the now-obsolete CI/docs/metadata references and the InternalsVisibleTo entry for Java.Interop.GenericMarshaler.

Validation:

  • git diff --check origin/main
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop-Tests/Java.Interop-Tests.csproj
    • Passed: 671, Failed: 0, Skipped: 4

Note for dotnet/android codeflow:

  • Android has test-only references to this helper in Xamarin.Android-Tests.sln and tests/Mono.Android-Tests/Java.Interop-Tests/Java.Interop-Tests.NET.csproj; those will need to be removed or updated when this flows.

Remove the standalone generic JNI marshaling helper assembly and its performance tests. Keep Java.Interop-Tests compiling by moving the few needed helper wrappers into the test assembly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 9, 2026 06:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR removes the standalone Java.Interop.GenericMarshaler assembly (and its performance benchmark project) as part of the repo reduction effort in #1448, while keeping required generic marshaling test coverage by introducing a small test-local replacement for the few extension methods the unit tests still need.

Changes:

  • Removed the src/Java.Interop.GenericMarshaler project and the Java.Interop-PerformanceTests project (and associated sources/CI/docs references).
  • Updated Java.Interop-Tests to stop referencing Java.Interop.GenericMarshaler and added a test-local JniPeerMembersExtensions helper to cover required generic marshaling paths.
  • Removed the InternalsVisibleTo entry for Java.Interop.GenericMarshaler from Java.Interop.
Show a summary per file
FileDescription
tests/Java.Interop-Tests/Java.Interop/TestType.csDrops Java.Interop.GenericMarshaler using; continues to exercise generic marshaling via test-local extensions.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersTests.csDrops Java.Interop.GenericMarshaler using; keeps tests using extension-method-based generic marshal paths.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersExtensions.csAdds test-local extension methods replacing the limited generic marshaling helpers previously sourced from the deleted assembly.
tests/Java.Interop-Tests/Java.Interop/CallVirtualFromConstructorBase.csDrops Java.Interop.GenericMarshaler using; continues constructor/method invocation coverage via test-local extensions.
tests/Java.Interop-Tests/Java.Interop-Tests.csprojRemoves project reference to Java.Interop.GenericMarshaler.
tests/Java.Interop-PerformanceTests/java/com/xamarin/interop/performance/JavaTiming.javaDeletes Java timing helper source as part of removing the performance test project.
tests/Java.Interop-PerformanceTests/Java.Interop/TimingTests.csDeletes performance benchmark test suite.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaVMFixture.csDeletes performance-test JVM fixture.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaTiming.csDeletes managed wrapper used by performance benchmarks (and its generic marshal benchmark paths).
tests/Java.Interop-PerformanceTests/Java.Interop/JavaPrimitiveArraysTiming.csDeletes primitive array lookup/creation performance benchmarks.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.targetsDeletes MSBuild target used to build the performance-test JAR.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csprojDeletes the performance test project definition.
src/Java.Interop/Properties/AssemblyInfo.csRemoves InternalsVisibleTo for Java.Interop.GenericMarshaler.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler/JniPeerInstanceMethodsExtensions.ttDeletes T4 template which generated the generic marshaling extension surface.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler.csprojDeletes the Java.Interop.GenericMarshaler project file.
Java.Interop.slnRemoves the deleted projects from the solution.
build-tools/automation/templates/core-tests.yamlRemoves CI execution of the deleted performance test project.
.github/skills/build-and-test/SKILL.mdRemoves mention of Java.Interop-PerformanceTests from the documented common test projects list.
.github/copilot-instructions.mdRemoves mention of Java.Interop-PerformanceTests from repo testing structure documentation.

Copilot's findings

  • Files reviewed: 19/20 changed files
  • Comments generated: 0

@simonrozsivalsimonrozsival added the ready-to-review This PR is ready to review/merge, thanks! label Jun 9, 2026
@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/review

@github-actions

github-actionsBot commented Jun 9, 2026

Copy link
Copy Markdown

Java.Interop PR Reviewer completed successfully!

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ LGTM

Clean removal of Java.Interop.GenericMarshaler and Java.Interop-PerformanceTests. The test-local JniPeerMembersExtensions helper covers exactly the 5 extension methods still used by tests, with proper [DynamicallyAccessedMembers] annotations and try/finally cleanup for DestroyGenericArgumentState.

Summary of changes verified:

  • All using Java.Interop.GenericMarshaler; removed; call sites resolve the extension methods from the new test-local helper in the same namespace ✅
  • InternalsVisibleTo for GenericMarshaler removed from AssemblyInfo.cs
  • Solution, CI pipeline, and documentation references all cleaned up ✅
  • Pre-existing missing EndProject for Java.Interop.Tools.Maven-Tests in .sln fixed incidentally — nice catch 👍
  • No remaining references to GenericMarshaler anywhere in the repo ✅

Positive callouts:

  • PR description is thorough — documents downstream dotnet/android impact
  • Validation section includes test counts
  • The replacement helper is minimal and well-scoped to only what tests actually need

CI note: Only license/cla and copilot-pull-request-reviewer checks are visible — no build/test CI run yet. The author reports local test success (671 passed, 0 failed), but a green CI run would be nice before merge.

SeverityCount
❌ error0
⚠️ warning0
💡 suggestion1

Generated by Java.Interop PR Reviewer for issue #1450 · ● 3.5M

@jonathanpeppers
jonathanpeppers enabled auto-merge (squash) June 9, 2026 13:15
@jonathanpeppers
jonathanpeppers merged commit cd2fc12 into mainJun 9, 2026
2 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/remove-generic-marshaler branch June 9, 2026 14:02
jonathanpeppers added a commit to dotnet/android that referenced this pull request Jun 16, 2026
Bumps [external/Java.Interop](https://github.com/dotnet/java-interop) from `b881d21` to [`6820a9cb`](dotnet/java-interop@6820a9c).
## Java.Interop changes pulled in
- [`6820a9c`](dotnet/java-interop@6820a9c) [Java.Interop] Make JavaProxyObject.RegisterNativeMembers private again ([#1468](dotnet/java-interop#1468))
- [`a2159d7`](dotnet/java-interop@a2159d70) Remove NuGet dependency grouping from Dependabot config ([#1459](dotnet/java-interop#1459))
- [`a0ca676`](dotnet/java-interop@a0ca6760) [ci] Update agentic workflows to claude-opus-4.8 ([#1461](dotnet/java-interop#1461))
- [`6d8aef7`](dotnet/java-interop@6d8aef7b) Bump to dotnet/android-tools@1fb68b6 ([#1457](dotnet/java-interop#1457))
- [`cfca8ad`](dotnet/java-interop@cfca8ad) Upgrade gh-aw to v0.79.6 and recompile workflows ([#1460](dotnet/java-interop#1460))
- [`0104236`](dotnet/java-interop@0104236e) [JniValueManager] Make TryConstructPeer virtual ([#1456](dotnet/java-interop#1456))
- [`d7dbad5`](dotnet/java-interop@d7dbad5) Remove Java.Interop.Dynamic ([#1449](dotnet/java-interop#1449))
- [`0244c10`](dotnet/java-interop@0244c10) Split reflection-based JniTypeManager and JniValueManager behavior ([#1441](dotnet/java-interop#1441))
- [`9ca7064`](dotnet/java-interop@9ca7064) [Java.Interop] Remove legacy `NET` preprocessor paths ([#1451](dotnet/java-interop#1451))
- [`cd2fc12`](dotnet/java-interop@cd2fc12) Remove Java.Interop.GenericMarshaler ([#1450](dotnet/java-interop#1450))
See full diff in [compare view](dotnet/java-interop@b881d21...6820a9c).
## Changes in this PR (beyond the submodule bump)
The Java.Interop bump — particularly [#1441](dotnet/java-interop#1441) (split reflection-based `JniTypeManager` and `JniValueManager`) and [#1449](dotnet/java-interop#1449) (removal of `Java.Interop.Dynamic`) — required a number of follow-on changes in `dotnet/android`:
### Runtime / `Mono.Android`
- **Adapt Android runtime to Java.Interop reflection managers** — switch the `JavaInteropTypeManager` / `JavaInteropValueManager` hierarchy to the new reflection-based base types and update type/value manager construction to match.
- **Change base type of value managers and type managers** so the runtime composes correctly with the new Java.Interop split.
- **Suppress reflection manager trim warnings only** — narrow the existing trim suppressions so they apply to the reflection-only managers and don't hide other warnings.
- **Suppress IL2068 on `ManagedTypeManager.GetTypeForSimpleReference`** — annotate the entry point that legitimately requires reflection so trim analysis is satisfied.
### Tests / apkdescs
- **Regenerate `BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc`** to track size changes from the Java.Interop bump.
- **Regenerate Simple `BuildReleaseArm64` apkdescs** (`MonoVM` + `NativeAOT`) from a `Release` SDK so they match what CI produces.
- **Update NativeAOT warning expectations** — `Mono.Android` now produces fewer trim/AOT warnings, so loosen the strict `4 Warning(s)` checks in `SupportedOSPlatformVersion` and `CheckSignApk` to `AssertHasAtMostWarnings (2)` (new helper in `AssertionExtensions`) and drop the `BuildHasTrimmerWarnings` data counts (`3 → 2`, `4 → 3`) accordingly.
### Merges
- Two merges from `origin/main` to keep the branch current and resolve a conflict in `Microsoft.Android.Sdk.TypeMap.Trimmable.targets`.
Co-authored-by: Simon Rozsival <simon@rozsival.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

ready-to-reviewThis PR is ready to review/merge, thanks!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 27, 2026. It is now read-only.

Remove Java.Interop.GenericMarshaler - #1450

Merged
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler
Jun 9, 2026
Merged

Remove Java.Interop.GenericMarshaler#1450
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Part of dotnet/android#11843.

This removes the standalone Java.Interop.GenericMarshaler helper assembly and its performance benchmark project. Java.Interop-Tests still exercises the few generic marshaling paths it needs via a small test-local helper instead of referencing the deleted assembly.

Also removes the now-obsolete CI/docs/metadata references and the InternalsVisibleTo entry for Java.Interop.GenericMarshaler.

Validation:

  • git diff --check origin/main
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop-Tests/Java.Interop-Tests.csproj
    • Passed: 671, Failed: 0, Skipped: 4

Note for dotnet/android codeflow:

  • Android has test-only references to this helper in Xamarin.Android-Tests.sln and tests/Mono.Android-Tests/Java.Interop-Tests/Java.Interop-Tests.NET.csproj; those will need to be removed or updated when this flows.

Remove the standalone generic JNI marshaling helper assembly and its performance tests. Keep Java.Interop-Tests compiling by moving the few needed helper wrappers into the test assembly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 9, 2026 06:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR removes the standalone Java.Interop.GenericMarshaler assembly (and its performance benchmark project) as part of the repo reduction effort in #1448, while keeping required generic marshaling test coverage by introducing a small test-local replacement for the few extension methods the unit tests still need.

Changes:

  • Removed the src/Java.Interop.GenericMarshaler project and the Java.Interop-PerformanceTests project (and associated sources/CI/docs references).
  • Updated Java.Interop-Tests to stop referencing Java.Interop.GenericMarshaler and added a test-local JniPeerMembersExtensions helper to cover required generic marshaling paths.
  • Removed the InternalsVisibleTo entry for Java.Interop.GenericMarshaler from Java.Interop.
Show a summary per file
FileDescription
tests/Java.Interop-Tests/Java.Interop/TestType.csDrops Java.Interop.GenericMarshaler using; continues to exercise generic marshaling via test-local extensions.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersTests.csDrops Java.Interop.GenericMarshaler using; keeps tests using extension-method-based generic marshal paths.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersExtensions.csAdds test-local extension methods replacing the limited generic marshaling helpers previously sourced from the deleted assembly.
tests/Java.Interop-Tests/Java.Interop/CallVirtualFromConstructorBase.csDrops Java.Interop.GenericMarshaler using; continues constructor/method invocation coverage via test-local extensions.
tests/Java.Interop-Tests/Java.Interop-Tests.csprojRemoves project reference to Java.Interop.GenericMarshaler.
tests/Java.Interop-PerformanceTests/java/com/xamarin/interop/performance/JavaTiming.javaDeletes Java timing helper source as part of removing the performance test project.
tests/Java.Interop-PerformanceTests/Java.Interop/TimingTests.csDeletes performance benchmark test suite.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaVMFixture.csDeletes performance-test JVM fixture.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaTiming.csDeletes managed wrapper used by performance benchmarks (and its generic marshal benchmark paths).
tests/Java.Interop-PerformanceTests/Java.Interop/JavaPrimitiveArraysTiming.csDeletes primitive array lookup/creation performance benchmarks.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.targetsDeletes MSBuild target used to build the performance-test JAR.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csprojDeletes the performance test project definition.
src/Java.Interop/Properties/AssemblyInfo.csRemoves InternalsVisibleTo for Java.Interop.GenericMarshaler.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler/JniPeerInstanceMethodsExtensions.ttDeletes T4 template which generated the generic marshaling extension surface.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler.csprojDeletes the Java.Interop.GenericMarshaler project file.
Java.Interop.slnRemoves the deleted projects from the solution.
build-tools/automation/templates/core-tests.yamlRemoves CI execution of the deleted performance test project.
.github/skills/build-and-test/SKILL.mdRemoves mention of Java.Interop-PerformanceTests from the documented common test projects list.
.github/copilot-instructions.mdRemoves mention of Java.Interop-PerformanceTests from repo testing structure documentation.

Copilot's findings

  • Files reviewed: 19/20 changed files
  • Comments generated: 0

@simonrozsivalsimonrozsival added the ready-to-review This PR is ready to review/merge, thanks! label Jun 9, 2026
@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/review

@github-actions

github-actionsBot commented Jun 9, 2026

Copy link
Copy Markdown

Java.Interop PR Reviewer completed successfully!

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ LGTM

Clean removal of Java.Interop.GenericMarshaler and Java.Interop-PerformanceTests. The test-local JniPeerMembersExtensions helper covers exactly the 5 extension methods still used by tests, with proper [DynamicallyAccessedMembers] annotations and try/finally cleanup for DestroyGenericArgumentState.

Summary of changes verified:

  • All using Java.Interop.GenericMarshaler; removed; call sites resolve the extension methods from the new test-local helper in the same namespace ✅
  • InternalsVisibleTo for GenericMarshaler removed from AssemblyInfo.cs
  • Solution, CI pipeline, and documentation references all cleaned up ✅
  • Pre-existing missing EndProject for Java.Interop.Tools.Maven-Tests in .sln fixed incidentally — nice catch 👍
  • No remaining references to GenericMarshaler anywhere in the repo ✅

Positive callouts:

  • PR description is thorough — documents downstream dotnet/android impact
  • Validation section includes test counts
  • The replacement helper is minimal and well-scoped to only what tests actually need

CI note: Only license/cla and copilot-pull-request-reviewer checks are visible — no build/test CI run yet. The author reports local test success (671 passed, 0 failed), but a green CI run would be nice before merge.

SeverityCount
❌ error0
⚠️ warning0
💡 suggestion1

Generated by Java.Interop PR Reviewer for issue #1450 · ● 3.5M

@jonathanpeppers
jonathanpeppers enabled auto-merge (squash) June 9, 2026 13:15
@jonathanpeppers
jonathanpeppers merged commit cd2fc12 into mainJun 9, 2026
2 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/remove-generic-marshaler branch June 9, 2026 14:02
jonathanpeppers added a commit to dotnet/android that referenced this pull request Jun 16, 2026
Bumps [external/Java.Interop](https://github.com/dotnet/java-interop) from `b881d21` to [`6820a9cb`](dotnet/java-interop@6820a9c).
## Java.Interop changes pulled in
- [`6820a9c`](dotnet/java-interop@6820a9c) [Java.Interop] Make JavaProxyObject.RegisterNativeMembers private again ([#1468](dotnet/java-interop#1468))
- [`a2159d7`](dotnet/java-interop@a2159d70) Remove NuGet dependency grouping from Dependabot config ([#1459](dotnet/java-interop#1459))
- [`a0ca676`](dotnet/java-interop@a0ca6760) [ci] Update agentic workflows to claude-opus-4.8 ([#1461](dotnet/java-interop#1461))
- [`6d8aef7`](dotnet/java-interop@6d8aef7b) Bump to dotnet/android-tools@1fb68b6 ([#1457](dotnet/java-interop#1457))
- [`cfca8ad`](dotnet/java-interop@cfca8ad) Upgrade gh-aw to v0.79.6 and recompile workflows ([#1460](dotnet/java-interop#1460))
- [`0104236`](dotnet/java-interop@0104236e) [JniValueManager] Make TryConstructPeer virtual ([#1456](dotnet/java-interop#1456))
- [`d7dbad5`](dotnet/java-interop@d7dbad5) Remove Java.Interop.Dynamic ([#1449](dotnet/java-interop#1449))
- [`0244c10`](dotnet/java-interop@0244c10) Split reflection-based JniTypeManager and JniValueManager behavior ([#1441](dotnet/java-interop#1441))
- [`9ca7064`](dotnet/java-interop@9ca7064) [Java.Interop] Remove legacy `NET` preprocessor paths ([#1451](dotnet/java-interop#1451))
- [`cd2fc12`](dotnet/java-interop@cd2fc12) Remove Java.Interop.GenericMarshaler ([#1450](dotnet/java-interop#1450))
See full diff in [compare view](dotnet/java-interop@b881d21...6820a9c).
## Changes in this PR (beyond the submodule bump)
The Java.Interop bump — particularly [#1441](dotnet/java-interop#1441) (split reflection-based `JniTypeManager` and `JniValueManager`) and [#1449](dotnet/java-interop#1449) (removal of `Java.Interop.Dynamic`) — required a number of follow-on changes in `dotnet/android`:
### Runtime / `Mono.Android`
- **Adapt Android runtime to Java.Interop reflection managers** — switch the `JavaInteropTypeManager` / `JavaInteropValueManager` hierarchy to the new reflection-based base types and update type/value manager construction to match.
- **Change base type of value managers and type managers** so the runtime composes correctly with the new Java.Interop split.
- **Suppress reflection manager trim warnings only** — narrow the existing trim suppressions so they apply to the reflection-only managers and don't hide other warnings.
- **Suppress IL2068 on `ManagedTypeManager.GetTypeForSimpleReference`** — annotate the entry point that legitimately requires reflection so trim analysis is satisfied.
### Tests / apkdescs
- **Regenerate `BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc`** to track size changes from the Java.Interop bump.
- **Regenerate Simple `BuildReleaseArm64` apkdescs** (`MonoVM` + `NativeAOT`) from a `Release` SDK so they match what CI produces.
- **Update NativeAOT warning expectations** — `Mono.Android` now produces fewer trim/AOT warnings, so loosen the strict `4 Warning(s)` checks in `SupportedOSPlatformVersion` and `CheckSignApk` to `AssertHasAtMostWarnings (2)` (new helper in `AssertionExtensions`) and drop the `BuildHasTrimmerWarnings` data counts (`3 → 2`, `4 → 3`) accordingly.
### Merges
- Two merges from `origin/main` to keep the branch current and resolve a conflict in `Microsoft.Android.Sdk.TypeMap.Trimmable.targets`.
Co-authored-by: Simon Rozsival <simon@rozsival.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

ready-to-reviewThis PR is ready to review/merge, thanks!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Aug 27, 2026. It is now read-only.

Remove Java.Interop.GenericMarshaler - #1450

Merged
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler
Jun 9, 2026
Merged

Remove Java.Interop.GenericMarshaler#1450
jonathanpeppers merged 2 commits into
mainfrom
dev/simonrozsival/remove-generic-marshaler

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Part of dotnet/android#11843.

This removes the standalone Java.Interop.GenericMarshaler helper assembly and its performance benchmark project. Java.Interop-Tests still exercises the few generic marshaling paths it needs via a small test-local helper instead of referencing the deleted assembly.

Also removes the now-obsolete CI/docs/metadata references and the InternalsVisibleTo entry for Java.Interop.GenericMarshaler.

Validation:

  • git diff --check origin/main
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop-Tests/Java.Interop-Tests.csproj
    • Passed: 671, Failed: 0, Skipped: 4

Note for dotnet/android codeflow:

  • Android has test-only references to this helper in Xamarin.Android-Tests.sln and tests/Mono.Android-Tests/Java.Interop-Tests/Java.Interop-Tests.NET.csproj; those will need to be removed or updated when this flows.

Remove the standalone generic JNI marshaling helper assembly and its performance tests. Keep Java.Interop-Tests compiling by moving the few needed helper wrappers into the test assembly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 9, 2026 06:13

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR removes the standalone Java.Interop.GenericMarshaler assembly (and its performance benchmark project) as part of the repo reduction effort in #1448, while keeping required generic marshaling test coverage by introducing a small test-local replacement for the few extension methods the unit tests still need.

Changes:

  • Removed the src/Java.Interop.GenericMarshaler project and the Java.Interop-PerformanceTests project (and associated sources/CI/docs references).
  • Updated Java.Interop-Tests to stop referencing Java.Interop.GenericMarshaler and added a test-local JniPeerMembersExtensions helper to cover required generic marshaling paths.
  • Removed the InternalsVisibleTo entry for Java.Interop.GenericMarshaler from Java.Interop.
Show a summary per file
FileDescription
tests/Java.Interop-Tests/Java.Interop/TestType.csDrops Java.Interop.GenericMarshaler using; continues to exercise generic marshaling via test-local extensions.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersTests.csDrops Java.Interop.GenericMarshaler using; keeps tests using extension-method-based generic marshal paths.
tests/Java.Interop-Tests/Java.Interop/JniPeerMembersExtensions.csAdds test-local extension methods replacing the limited generic marshaling helpers previously sourced from the deleted assembly.
tests/Java.Interop-Tests/Java.Interop/CallVirtualFromConstructorBase.csDrops Java.Interop.GenericMarshaler using; continues constructor/method invocation coverage via test-local extensions.
tests/Java.Interop-Tests/Java.Interop-Tests.csprojRemoves project reference to Java.Interop.GenericMarshaler.
tests/Java.Interop-PerformanceTests/java/com/xamarin/interop/performance/JavaTiming.javaDeletes Java timing helper source as part of removing the performance test project.
tests/Java.Interop-PerformanceTests/Java.Interop/TimingTests.csDeletes performance benchmark test suite.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaVMFixture.csDeletes performance-test JVM fixture.
tests/Java.Interop-PerformanceTests/Java.Interop/JavaTiming.csDeletes managed wrapper used by performance benchmarks (and its generic marshal benchmark paths).
tests/Java.Interop-PerformanceTests/Java.Interop/JavaPrimitiveArraysTiming.csDeletes primitive array lookup/creation performance benchmarks.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.targetsDeletes MSBuild target used to build the performance-test JAR.
tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csprojDeletes the performance test project definition.
src/Java.Interop/Properties/AssemblyInfo.csRemoves InternalsVisibleTo for Java.Interop.GenericMarshaler.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler/JniPeerInstanceMethodsExtensions.ttDeletes T4 template which generated the generic marshaling extension surface.
src/Java.Interop.GenericMarshaler/Java.Interop.GenericMarshaler.csprojDeletes the Java.Interop.GenericMarshaler project file.
Java.Interop.slnRemoves the deleted projects from the solution.
build-tools/automation/templates/core-tests.yamlRemoves CI execution of the deleted performance test project.
.github/skills/build-and-test/SKILL.mdRemoves mention of Java.Interop-PerformanceTests from the documented common test projects list.
.github/copilot-instructions.mdRemoves mention of Java.Interop-PerformanceTests from repo testing structure documentation.

Copilot's findings

  • Files reviewed: 19/20 changed files
  • Comments generated: 0

@simonrozsivalsimonrozsival added the ready-to-review This PR is ready to review/merge, thanks! label Jun 9, 2026
@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/review

@github-actions

github-actionsBot commented Jun 9, 2026

Copy link
Copy Markdown

Java.Interop PR Reviewer completed successfully!

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ LGTM

Clean removal of Java.Interop.GenericMarshaler and Java.Interop-PerformanceTests. The test-local JniPeerMembersExtensions helper covers exactly the 5 extension methods still used by tests, with proper [DynamicallyAccessedMembers] annotations and try/finally cleanup for DestroyGenericArgumentState.

Summary of changes verified:

  • All using Java.Interop.GenericMarshaler; removed; call sites resolve the extension methods from the new test-local helper in the same namespace ✅
  • InternalsVisibleTo for GenericMarshaler removed from AssemblyInfo.cs
  • Solution, CI pipeline, and documentation references all cleaned up ✅
  • Pre-existing missing EndProject for Java.Interop.Tools.Maven-Tests in .sln fixed incidentally — nice catch 👍
  • No remaining references to GenericMarshaler anywhere in the repo ✅

Positive callouts:

  • PR description is thorough — documents downstream dotnet/android impact
  • Validation section includes test counts
  • The replacement helper is minimal and well-scoped to only what tests actually need

CI note: Only license/cla and copilot-pull-request-reviewer checks are visible — no build/test CI run yet. The author reports local test success (671 passed, 0 failed), but a green CI run would be nice before merge.

SeverityCount
❌ error0
⚠️ warning0
💡 suggestion1

Generated by Java.Interop PR Reviewer for issue #1450 · ● 3.5M

@jonathanpeppers
jonathanpeppers enabled auto-merge (squash) June 9, 2026 13:15
@jonathanpeppers
jonathanpeppers merged commit cd2fc12 into mainJun 9, 2026
2 checks passed
@jonathanpeppers
jonathanpeppers deleted the dev/simonrozsival/remove-generic-marshaler branch June 9, 2026 14:02
jonathanpeppers added a commit to dotnet/android that referenced this pull request Jun 16, 2026
Bumps [external/Java.Interop](https://github.com/dotnet/java-interop) from `b881d21` to [`6820a9cb`](dotnet/java-interop@6820a9c).
## Java.Interop changes pulled in
- [`6820a9c`](dotnet/java-interop@6820a9c) [Java.Interop] Make JavaProxyObject.RegisterNativeMembers private again ([#1468](dotnet/java-interop#1468))
- [`a2159d7`](dotnet/java-interop@a2159d70) Remove NuGet dependency grouping from Dependabot config ([#1459](dotnet/java-interop#1459))
- [`a0ca676`](dotnet/java-interop@a0ca6760) [ci] Update agentic workflows to claude-opus-4.8 ([#1461](dotnet/java-interop#1461))
- [`6d8aef7`](dotnet/java-interop@6d8aef7b) Bump to dotnet/android-tools@1fb68b6 ([#1457](dotnet/java-interop#1457))
- [`cfca8ad`](dotnet/java-interop@cfca8ad) Upgrade gh-aw to v0.79.6 and recompile workflows ([#1460](dotnet/java-interop#1460))
- [`0104236`](dotnet/java-interop@0104236e) [JniValueManager] Make TryConstructPeer virtual ([#1456](dotnet/java-interop#1456))
- [`d7dbad5`](dotnet/java-interop@d7dbad5) Remove Java.Interop.Dynamic ([#1449](dotnet/java-interop#1449))
- [`0244c10`](dotnet/java-interop@0244c10) Split reflection-based JniTypeManager and JniValueManager behavior ([#1441](dotnet/java-interop#1441))
- [`9ca7064`](dotnet/java-interop@9ca7064) [Java.Interop] Remove legacy `NET` preprocessor paths ([#1451](dotnet/java-interop#1451))
- [`cd2fc12`](dotnet/java-interop@cd2fc12) Remove Java.Interop.GenericMarshaler ([#1450](dotnet/java-interop#1450))
See full diff in [compare view](dotnet/java-interop@b881d21...6820a9c).
## Changes in this PR (beyond the submodule bump)
The Java.Interop bump — particularly [#1441](dotnet/java-interop#1441) (split reflection-based `JniTypeManager` and `JniValueManager`) and [#1449](dotnet/java-interop#1449) (removal of `Java.Interop.Dynamic`) — required a number of follow-on changes in `dotnet/android`:
### Runtime / `Mono.Android`
- **Adapt Android runtime to Java.Interop reflection managers** — switch the `JavaInteropTypeManager` / `JavaInteropValueManager` hierarchy to the new reflection-based base types and update type/value manager construction to match.
- **Change base type of value managers and type managers** so the runtime composes correctly with the new Java.Interop split.
- **Suppress reflection manager trim warnings only** — narrow the existing trim suppressions so they apply to the reflection-only managers and don't hide other warnings.
- **Suppress IL2068 on `ManagedTypeManager.GetTypeForSimpleReference`** — annotate the entry point that legitimately requires reflection so trim analysis is satisfied.
### Tests / apkdescs
- **Regenerate `BuildReleaseArm64SimpleDotNet.MonoVM.apkdesc`** to track size changes from the Java.Interop bump.
- **Regenerate Simple `BuildReleaseArm64` apkdescs** (`MonoVM` + `NativeAOT`) from a `Release` SDK so they match what CI produces.
- **Update NativeAOT warning expectations** — `Mono.Android` now produces fewer trim/AOT warnings, so loosen the strict `4 Warning(s)` checks in `SupportedOSPlatformVersion` and `CheckSignApk` to `AssertHasAtMostWarnings (2)` (new helper in `AssertionExtensions`) and drop the `BuildHasTrimmerWarnings` data counts (`3 → 2`, `4 → 3`) accordingly.
### Merges
- Two merges from `origin/main` to keep the branch current and resolve a conflict in `Microsoft.Android.Sdk.TypeMap.Trimmable.targets`.
Co-authored-by: Simon Rozsival <simon@rozsival.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jonathan Peppers <jonathan.peppers@microsoft.com>
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

ready-to-reviewThis PR is ready to review/merge, thanks!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@simonrozsival@jonathanpeppers