[net11.0] Strip CoreCLR/R2R frameworks in Debug on devices#25360
[net11.0] Strip CoreCLR/R2R frameworks in Debug on devices#25360kotlarmilos wants to merge 7 commits into
Conversation
5a65c1c to
b74dd00
Compare
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>
b74dd00 to
281f423
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
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
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
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>
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
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>
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
@copilot resolve the merge conflicts in this pull request |
…r2r-debug Co-authored-by: kotlarmilos <11523312+kotlarmilos@users.noreply.github.com>
Resolved. Two conflicts were fixed in commit
|
✅ [PR Build #cee4a73] Build passed (Detect API changes) ✅Pipeline on Agent |
This comment has been minimized.
This comment has been minimized.
✅ [PR Build #cee4a73] Build passed (Build packages) ✅Pipeline on Agent |
✅ API diff for current PR / commitNET (empty diffs)✅ API diff vs stableNET (empty diffs)ℹ️ Generator diffGenerator Diff: vsdrops (html) vsdrops (raw diff) gist (raw diff) - Please review changes) Pipeline on Agent |
✅ [PR Build #cee4a73] Build passed (Build macOS tests) ✅Pipeline on Agent |
🔥 [CI Build #cee4a73] Test results 🔥Test results❌ Tests failed on VSTS: test results 0 tests crashed, 26 tests failed, 161 tests passed. Failures❌ linker tests22 tests failed, 22 tests passed.Failed tests
Html Report (VSDrops) Download ❌ monotouch tests (tvOS)2 tests failed, 20 tests passed.Failed tests
Html Report (VSDrops) Download ❌ xcframework tests2 tests failed, 2 tests passed.Failed tests
Html Report (VSDrops) Download Successes✅ cecil: All 1 tests passed. Html Report (VSDrops) Download macOS tests✅ Tests on macOS Sonoma (14): All 5 tests passed. Html Report (VSDrops) Download Linux Build VerificationPipeline on Agent |
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.propsset 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