Skip to content

[net11.0] Strip CoreCLR/R2R frameworks in Debug on devices#25360

Open
kotlarmilos wants to merge 7 commits into
net11.0from
dev/strip-coreclr-r2r-debug
Open

[net11.0] Strip CoreCLR/R2R frameworks in Debug on devices#25360
kotlarmilos wants to merge 7 commits into
net11.0from
dev/strip-coreclr-r2r-debug

Conversation

@kotlarmilos
Copy link
Copy Markdown
Member

@kotlarmilos kotlarmilos commented May 7, 2026

Description

PR #24678 enabled stripping of R2R composite framework, which took effect for Release device builds. In Debug device builds the strip was bypassed because the Debug-default in Xamarin.Shared.props set the global $(NoSymbolStrip)=true, which then propagated onto every `_PostProcessingItem.

This PR removes the Debug-default rule entirely. iOS/tvOS device builds now always strip native binaries and a dSYM bundle is generated for symbolication, regardless of configuration. Simulator builds remain unstripped.

Size saving in Debug on a device is ~50% of the overall app bundle.

Behavior

Configuration Target Stripped? dSYM?
Debug Device yes yes
Release Device yes yes
Debug Simulator no no
Release Simulator no no

@kotlarmilos kotlarmilos force-pushed the dev/strip-coreclr-r2r-debug branch 3 times, most recently from 5a65c1c to b74dd00 Compare May 7, 2026 11:30
Follow-up to #24678. PR #24678 added the CoreCLR runtime frameworks
and the R2R composite framework to @(_PostProcessingItem) so they
would be stripped, which took effect for Release device builds. In
Debug device builds the strip was bypassed because the Debug-default
in Xamarin.Shared.props set the global $(NoSymbolStrip)=true, which
then propagated onto every _PostProcessingItem with empty
%(NoSymbolStrip) metadata, causing _NativeStripItems to filter all
items out.

Remove the Debug-default rule entirely. iOS/tvOS device builds now
always strip native binaries and a dSYM bundle is generated for
post-mortem symbolication, regardless of Configuration. Simulator
builds remain unstripped so the live debugger keeps symbols on disk.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos kotlarmilos force-pushed the dev/strip-coreclr-r2r-debug branch from b74dd00 to 281f423 Compare May 7, 2026 11:33
@kotlarmilos kotlarmilos added this to the .NET 11 milestone May 7, 2026
@kotlarmilos kotlarmilos self-assigned this May 7, 2026
@vs-mobiletools-engineering-service2

This comment has been minimized.

@kotlarmilos kotlarmilos marked this pull request as ready for review May 7, 2026 11:39
@kotlarmilos kotlarmilos requested a review from mauroa as a code owner May 7, 2026 11:39
Copilot AI review requested due to automatic review settings May 7, 2026 11:39
@kotlarmilos kotlarmilos requested a review from rolfbjarne as a code owner May 7, 2026 11:39
@vs-mobiletools-engineering-service2

This comment has been minimized.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Removes the MSBuild default that disabled native symbol stripping in Debug configurations, so iOS/tvOS device builds strip CoreCLR/R2R frameworks (and other native binaries collected for post-processing) consistently across Debug/Release while keeping simulator builds unstripped.

Changes:

  • Remove the Debug-configuration default that set $(NoSymbolStrip)=true.
Show a summary per file
File Description
msbuild/Xamarin.Shared/Xamarin.Shared.props Drops the Debug default for NoSymbolStrip, allowing post-processing strip/dSYM behavior to apply in Debug device builds.

Copilot's findings

Comments suppressed due to low confidence (1)

msbuild/Xamarin.Shared/Xamarin.Shared.props:146

  • PR title says stripping affects “simulator builds”, but this file still explicitly disables stripping for simulator builds via the ComputedPlatform != iPhone condition. If simulator builds are intended to remain unstripped (as described), consider updating the PR title to avoid confusion; otherwise adjust the simulator default here.
		<!-- Disable stripping for simulator builds by default -->
		<NoSymbolStrip Condition="'$(NoSymbolStrip)' == '' And ('$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS') And '$(ComputedPlatform)' != 'iPhone'">true</NoSymbolStrip>
		<NoSymbolStrip Condition="'$(NoSymbolStrip)' == ''">false</NoSymbolStrip>
  • Files reviewed: 1/1 changed files
  • Comments generated: 0

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@kotlarmilos kotlarmilos changed the title [net11.0] Strip CoreCLR/R2R frameworks in Debug and simulator builds [net11.0] Strip CoreCLR/R2R frameworks in Debug on devices May 7, 2026
@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

rolfbjarne and others added 3 commits May 13, 2026 14:24
The _PostProcessingItem construction for dynamic native references
used %(Filename)%(Extension) which loses subdirectory paths. For
example, a file at Contents/MonoBundle/subdir/libframework.so
would get an Identity of Contents/MonoBundle/libframework.so,
causing strip to fail with 'No such file or directory'.

Fix by computing the bundle-relative path using MakeRelative from
the intermediate nativelibraries directory, which preserves the
full subdirectory structure. A fallback to the old behavior is
kept for when _IntermediateNativeLibraryDir is not available.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ost-processing

Replace the GetFullPath+MakeRelative approach with normalizing the
existing ComputedRelativePath metadata (replacing backslashes with
forward slashes). GetFullPath resolves against the local file system,
which produces wrong paths during remote builds from Windows.

Also add a section to the copilot instructions documenting that
GetFullPath should not be used in MSBuild targets.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…zation

MSBuild normalizes path separators for us, so the String.Replace
call is unnecessary. Use %(ComputedRelativePath) directly in the
item transform.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

- Increase maxPathLength for Mono from 118 to 130 to accommodate strip
  stamp file paths that are now generated for Debug device builds.
- Ignore PluralRuntimeIdentifiersWithRemoteMac_Mono which fails with
  stripping enabled in the Windows remote build path. Fixes #25438.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@kotlarmilos
Copy link
Copy Markdown
Member Author

@copilot resolve the merge conflicts in this pull request

…r2r-debug

Co-authored-by: kotlarmilos <11523312+kotlarmilos@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

Copilot AI commented May 15, 2026

@copilot resolve the merge conflicts in this pull request

Resolved. Two conflicts were fixed in commit cee4a73:

  • msbuild/Xamarin.Shared/Xamarin.Shared.props: kept the SdkIsDesktop condition from net11.0 (equivalent to the macOS/MacCatalyst check) and dropped the Debug default (the intent of this PR).
  • tests/dotnet/UnitTests/WindowsTest.cs: kept the GitHub issue link in the [Ignore] attribute.

@vs-mobiletools-engineering-service2
Copy link
Copy Markdown
Collaborator

✅ [PR Build #cee4a73] Build passed (Detect API changes) ✅

Pipeline on Agent
Hash: cee4a731edc25ec332e197716b610d63433bb011 [PR build]

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2
Copy link
Copy Markdown
Collaborator

✅ [PR Build #cee4a73] Build passed (Build packages) ✅

Pipeline on Agent
Hash: cee4a731edc25ec332e197716b610d63433bb011 [PR build]

@vs-mobiletools-engineering-service2
Copy link
Copy Markdown
Collaborator

✅ API diff for current PR / commit

NET (empty diffs)

✅ API diff vs stable

NET (empty diffs)

ℹ️ Generator diff

Generator Diff: vsdrops (html) vsdrops (raw diff) gist (raw diff) - Please review changes)

Pipeline on Agent
Hash: cee4a731edc25ec332e197716b610d63433bb011 [PR build]

@vs-mobiletools-engineering-service2
Copy link
Copy Markdown
Collaborator

✅ [PR Build #cee4a73] Build passed (Build macOS tests) ✅

Pipeline on Agent
Hash: cee4a731edc25ec332e197716b610d63433bb011 [PR build]

@vs-mobiletools-engineering-service2
Copy link
Copy Markdown
Collaborator

🔥 [CI Build #cee4a73] Test results 🔥

Test results

❌ Tests failed on VSTS: test results

0 tests crashed, 26 tests failed, 161 tests passed.

Failures

❌ linker tests

22 tests failed, 22 tests passed.

Failed tests

  • dont link/iOS - simulator/Debug: LaunchTimedOut
  • dont link/iOS - simulator/Release: LaunchTimedOut
  • dont link/tvOS - simulator/Debug: LaunchTimedOut
  • dont link/tvOS - simulator/Release: LaunchTimedOut
  • link sdk/iOS - simulator/Debug: LaunchTimedOut
  • link sdk/iOS - simulator/Release: LaunchTimedOut
  • link sdk/tvOS - simulator/Debug: LaunchTimedOut
  • link sdk/tvOS - simulator/Release: LaunchTimedOut
  • link all/iOS - simulator/Debug: LaunchTimedOut
  • link all/iOS - simulator/Release: LaunchTimedOut
  • link all/iOS - simulator/Debug (don't bundle original resources): LaunchTimedOut
  • link all/tvOS - simulator/Debug: LaunchTimedOut
  • link all/tvOS - simulator/Release: LaunchTimedOut
  • link all/tvOS - simulator/Debug (don't bundle original resources): LaunchTimedOut
  • trimmode copy/iOS - simulator/Debug: LaunchTimedOut
  • trimmode copy/iOS - simulator/Release: LaunchTimedOut
  • trimmode copy/tvOS - simulator/Debug: LaunchTimedOut
  • trimmode copy/tvOS - simulator/Release: LaunchTimedOut
  • trimmode link/iOS - simulator/Debug: LaunchTimedOut
  • trimmode link/iOS - simulator/Release: LaunchTimedOut
  • trimmode link/tvOS - simulator/Debug: LaunchTimedOut
  • trimmode link/tvOS - simulator/Release: LaunchTimedOut

Html Report (VSDrops) Download

❌ monotouch tests (tvOS)

2 tests failed, 20 tests passed.

Failed tests

  • monotouch-test/tvOS - simulator/Release (trimmable static registrar, all optimizations): Failed
  • monotouch-test/tvOS - simulator/Release (interpreter): Failed

Html Report (VSDrops) Download

❌ xcframework tests

2 tests failed, 2 tests passed.

Failed tests

  • xcframework-test/iOS - simulator/Debug: LaunchTimedOut
  • xcframework-test/tvOS - simulator/Debug: LaunchTimedOut

Html Report (VSDrops) Download

Successes

✅ cecil: All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (iOS): All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (MacCatalyst): All 1 tests passed. (⚠️ Html Report Publish failed ⚠️) Download
✅ dotnettests (macOS): All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (Multiple platforms): All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (tvOS): All 1 tests passed. (⚠️ Html Report Publish failed ⚠️) Download
✅ framework: All 2 tests passed. Html Report (VSDrops) Download
✅ fsharp: All 4 tests passed. Html Report (VSDrops) Download
✅ generator: All 5 tests passed. (⚠️ Html Report Publish failed ⚠️) Download
✅ interdependent-binding-projects: All 4 tests passed. Html Report (VSDrops) Download
✅ introspection: All 9 tests passed. Html Report (VSDrops) Download
✅ monotouch (iOS): All 22 tests passed. Html Report (VSDrops) Download
✅ monotouch (MacCatalyst): All 25 tests passed. Html Report (VSDrops) Download
✅ monotouch (macOS): All 18 tests passed. Html Report (VSDrops) Download
✅ msbuild: All 2 tests passed. Html Report (VSDrops) Download
✅ sharpie: All 1 tests passed. (⚠️ Html Report Publish failed ⚠️) Download
✅ windows: All 3 tests passed. Html Report (VSDrops) Download
✅ xtro: All 1 tests passed. Html Report (VSDrops) Download

macOS tests

✅ Tests on macOS Sonoma (14): All 5 tests passed. Html Report (VSDrops) Download
✅ Tests on macOS Sequoia (15): All 5 tests passed. Html Report (VSDrops) Download
✅ Tests on macOS Tahoe (26): All 5 tests passed. Html Report (VSDrops) Download

Linux Build Verification

Linux build succeeded

Pipeline on Agent
Hash: cee4a731edc25ec332e197716b610d63433bb011 [PR build]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants