$ the-wire · showcase
R8 obfuscation defaults flip in .NET 11, MAUI navigation test de-flaked, Roslyn tracks per-project loads
By RepoJournal · Filed · About .NET · Composed from the cited sources · methodology
dotnet/android adds a configurable $(AndroidR8ObfuscationMode) property and turns on selective Java obfuscation and R8 optimization by default in .NET 11, the day's most consequential change for anyone shipping Android apps.
dotnet/android made R8 behavior configurable with the public $(AndroidR8ObfuscationMode) build property and enabled selective Java obfuscation and R8 optimization by default in .NET 11 [1]. The default differs from .NET 10, where the disabled mode preserved all Java names and used the legacy non-optimizing configuration; under private-members, private and package-private members may be renamed [1]. This is a breaking change for apps that reflected over private Java members or relied on preserved names, so pin $(AndroidR8ObfuscationMode) to disabled if you depend on that.
On the same repo, simonrozsival's typemap work streams typemap fingerprints and PE output, a dependent change on top of #12599 that retries optimization ideas an earlier experimental pass rejected [2][3]. Candidates were benchmarked parent-vs-candidate in alternating fresh processes against the real Microsoft.Android.Ref.36 Mono.Android.dll plus fixture workloads, on both the changed and unchanged incremental paths; three changes cleared the bar and three did not [2]. A separate CI fix isolates the JavaSideActivation GREF leak check as an explicit JniReferenceLeak test, running that category in a dedicated JcwGen instrumentation process separate from the ordinary 38-test suite and warming 100 Java-side activations while requiring no positive net GREF growth [4]. MockBuildEngine's optional warning constructor was restored after its removal broke rewriter test fixtures with CS1729 and CS0103 [5].
dotnet/runtime removed CoreCLR PAL semaphore support: Unix System.Threading.Semaphore now uses the managed wait subsystem, and metadata's legacy UTSemReadWrite was the remaining PAL consumer [6]. The change adds a minipal read-write lock backed by SRWLOCK on Windows and pthread_rwlock_t elsewhere, requesting writer preference where supported [6]. Separately, SIMD complement and scalar FMA folding was fixed to preserve upper lanes, with regression coverage for both comparison paths and scalar FMA variants, closing three tracked issues [7]. Packaging gained a check for the maximum possible size of [Content_Types].xml to prevent memory exhaustion when opening malformed packages [8].
In dotnet/fsharp, Array2D.create and Array2D.init used to route through createBased 0 0 and initBased 0 0, hitting Array.CreateInstance, which is RequiresDynamicCode; they now allocate with zeroCreate, which emits newarr.multi, so a NativeAOT publish touching a zero-based 2D array no longer emits an IL3050 inside FSharp.Core that consumers could not suppress [9]. Nothing is deprecated and no signatures changed, so fsharp/fslang-suggestions#1454 does not need the deprecation it proposed [9]. MicroPerf work inlined the static-abstract interface-constraint predicate, adding ListInline.iter2 and ListInline.exists to drop per-node closure allocations in post-inference type checking [10]. On dotnet/roslyn, LanguageServerProjectLoader now tracks per-project load completion so callers can await only the projects they requested; paths are normalized and compared with platform semantics to prevent duplicate loads [11]. LSP 3.18 protocol updates landed [12], and empty definition, type-definition, reference, and implementation responses now emit telemetry to help diagnose invalid or off-by-one source positions [13].
Action items
- → Pin $(AndroidR8ObfuscationMode) to disabled before moving to .NET 11 if your app reflects over private or package-private Java members dotnet/android [plan]
- → Rebuild NativeAOT F# projects on the FSharp.Core containing the Array2D zeroCreate fix to clear IL3050 in zero-based 2D array code dotnet/fsharp [plan]
- → Update to the dotnet/runtime build carrying the SIMD complement and scalar FMA folding fix if you hit miscompiled upper lanes dotnet/runtime [plan]
- → Track the dotnet/android typemap streaming change for incremental build behavior once it lands past its dependent PR dotnet/android [monitor]
References
- [1] [r8] Add configurable private-member obfuscation and optimization (#12668) ↗ dotnet/android
- [2] [typemap] Stream typemap fingerprints and PE output (#12602) ↗ dotnet/android
- [3] [typemap] Stream typemap fingerprints and PE output ↗ dotnet/android
- [4] [flaky-ci] Isolate JavaSideActivation GREF leak check (#12716) ↗ dotnet/android
- [5] [tests] Restore MockBuildEngine warning constructor (#12755) ↗ dotnet/android
- [6] Remove CoreCLR PAL semaphore support (#132636) ↗ dotnet/runtime
- [7] Fix SIMD complement and scalar FMA folding ↗ dotnet/runtime
- [8] Add check for maximum possible size for [Content_Types].xml in Packaging ↗ dotnet/runtime
- [9] Make zero-based Array2D allocation AOT-clean ↗ dotnet/fsharp
- [10] [MicroPerf] Inline the static-abstract interface-constraint predicate (#20374) ↗ dotnet/fsharp
- [11] Track per-project load completion in LanguageServerProjectLoader ↗ dotnet/roslyn
- [12] LSP 3.18 protocol updates ↗ dotnet/roslyn
- [13] Add empty result to LSP request telemetry ↗ dotnet/roslyn