Skip to content

Commit 5ccd09d

Browse files
[Xamarin.Android.Build.Tasks] disable Switch.System.Reflection.ForceInterpretedInvoke
Fixes: dotnet/runtime#83893 In .NET 8, `System.Reflection.ConstructorInfo/MethodInfo.Invoke()` will call `System.Reflection.Emit` when called more than once. This impacts startup in mobile applications, so it may not be a desired feature. Unfortunately, this appears to happen quite easily in Android apps, some examples: * https://gist.github.com/ivanpovazan/2563ea9d2fea320e6425cfcc58da3ee5 * https://gist.github.com/ivanpovazan/d2546d4abad17900d4366cc29e1689b2 The types of situations this happens: * You call a Java method from C# that returns a `Java.Lang.Object` subclass. * You override a Java method in C#, that has a `Java.Lang.Object` parameter. To solve this problem, we can set: <ItemGroup> <RuntimeHostConfigurationOption Include="Switch.System.Reflection.ForceInterpretedInvoke" Value="$(_SystemReflectionForceInterpretedInvoke)" Trim="true" /> </ItemGroup> And we can set `$(_SystemReflectionForceInterpretedInvoke)` to test out the setting in various apps. I also updated the `.aotprofile` to verify that all `System.Reflection.Emit` code paths disappear from `dotnet new android` applications.
1 parent 7473928 commit 5ccd09d

File tree

3 files changed

+36
-79
lines changed

3 files changed

+36
-79
lines changed

src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
<_AggressiveAttributeTrimming Condition="'$(_AggressiveAttributeTrimming)' == ''">true</_AggressiveAttributeTrimming>
103103
<NullabilityInfoContextSupport Condition="'$(NullabilityInfoContextSupport)' == ''">false</NullabilityInfoContextSupport>
104104
<BuiltInComInteropSupport Condition="'$(BuiltInComInteropSupport)' == ''">false</BuiltInComInteropSupport>
105+
<_SystemReflectionForceInterpretedInvoke Condition="'$(_SystemReflectionForceInterpretedInvoke)' == ''">true</_SystemReflectionForceInterpretedInvoke>
105106
<!-- Verify DI trimmability at development-time, but turn the validation off for production/trimmed builds. -->
106107
<VerifyDependencyInjectionOpenGenericServiceTrimmability Condition="'$(VerifyDependencyInjectionOpenGenericServiceTrimmability)' == '' and '$(PublishTrimmed)' == 'true'">false</VerifyDependencyInjectionOpenGenericServiceTrimmability>
107108
<VerifyDependencyInjectionOpenGenericServiceTrimmability Condition="'$(VerifyDependencyInjectionOpenGenericServiceTrimmability)' == ''">true</VerifyDependencyInjectionOpenGenericServiceTrimmability>
@@ -121,4 +122,9 @@
121122
<ApplicationDisplayVersion Condition=" '$(ApplicationDisplayVersion)' == '' ">$(Version)</ApplicationDisplayVersion>
122123
</PropertyGroup>
123124

125+
<ItemGroup>
126+
<!-- https://github.com/dotnet/runtime/blob/211cdd011f19a51b7092d8365e11e774a8280afb/src/libraries/System.Private.CoreLib/src/System/LocalAppContextSwitches.cs#L52 -->
127+
<RuntimeHostConfigurationOption Include="Switch.System.Reflection.ForceInterpretedInvoke" Value="$(_SystemReflectionForceInterpretedInvoke)" Trim="true" />
128+
</ItemGroup>
129+
124130
</Project>

src/profiled-aot/dotnet.aotprofile

-3.86 KB
Binary file not shown.

0 commit comments

Comments
 (0)