From d4f17d25d0480d6e20c81a271f1e5592adc825d8 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Mon, 18 Sep 2023 11:19:57 -0500 Subject: [PATCH 1/9] [Xamarin.Android.Build.Tasks] feature switch defaults for fast startup Context: https://github.com/dotnet/runtime/commit/fecf3eeffd3650566555e15292f9df0d3abcdfc6 Context: https://github.com/dotnet/runtime/commit/3aeefbdd5e975e287effaa8670422837dc661d68 Context: https://github.com/dotnet/runtime/issues/89880 In dotnet/runtime two new feature switches were added in order to improve startup performance on Android: * `System.Diagnostics.Metrics.Meter.IsSupported`: disables `System.Diagnostics.Metrics` support for `HttpClient`, etc. * `Microsoft.Extensions.DependencyInjection.DisableDynamicEngine`: after the second call to retrieve a service from a dependency injection container, `System.Reflection.Emit is used to improve performance of repeated calls. We also have the existing switch: * `Switch.System.Reflection.ForceInterpretedInvoke`: after the second call to `MethodInfo.Invoke()` or `ConstructorInfo.Invoke()`, `System.Reflection.Emit is used to improve performance of repeated calls. Introduce two new MSBuild properties: * `$(AvoidEmitForPerformance)` to toggle both `Microsoft.Extensions.DependencyInjection.DisableDynamicEngine` and `Switch.System.Reflection.ForceInterpretedInvoke`. This is a public property that defaults to `true`, matching a property of the same name used somewhere in ASP.NET. * `$(_SystemDiagnosticsMetricsMeterIsSupported)` to toggle `System.Diagnostics.Metrics.Meter.IsSupported`. This is a private property that defaults to `false`. I added a test to check `System.Diagnostics.Metrics.Meter.IsSupported` at runtime. I did not do this with Microsoft.Extensions, as we'd have to add a reference to the NuGet package and track its version for nightly builds. I also updated the AOT profile, and some `System.Diagnostics.Metrics.Meter` API calls are gone now: bool System.Diagnostics.Metrics.Meter:AddInstrument (System.Diagnostics.Metrics.Instrument) object System.Diagnostics.Metrics.Instrument:get_SyncObject () System.Diagnostics.Metrics.Counter`1 System.Diagnostics.Metrics.Meter:CreateCounter (string,string,string,System.Collections.Generic.IEnumerable`1>) System.Diagnostics.Metrics.Counter`1 System.Diagnostics.Metrics.Meter:CreateCounter (string,string,string) void System.Diagnostics.Metrics.MeterListener:.cctor () void System.Diagnostics.Metrics.MetricsEventSource:.cctor () void System.Diagnostics.Metrics.MetricsEventSource:.ctor () --- .../guides/building-apps/build-properties.md | 26 ++++++++ ...soft.Android.Sdk.DefaultProperties.targets | 3 +- ...icrosoft.Android.Sdk.RuntimeConfig.targets | 12 +++- src/profiled-aot/dotnet.aotprofile | Bin 247417 -> 245797 bytes src/profiled-aot/dotnet.aotprofile.txt | 60 +++++++----------- .../System/AppContextTests.cs | 16 +++-- 6 files changed, 73 insertions(+), 44 deletions(-) diff --git a/Documentation/guides/building-apps/build-properties.md b/Documentation/guides/building-apps/build-properties.md index afe06d94074..d32dd289b02 100644 --- a/Documentation/guides/building-apps/build-properties.md +++ b/Documentation/guides/building-apps/build-properties.md @@ -1628,6 +1628,32 @@ as support for `$(AotAssemblies)` will be removed in a future release. Extra options to pass to `aprofutil`. +## AvoidEmitForPerformance + +A boolean property that determines whether or not `System.Reflection.Emit` is +"avoided" to improve startup performance. This property is `True` by default. + +Usage of `System.Reflection.Emit` has a noticeable impact on startup performance +on Android. This behavior is disabled by default for the following feature +switches: + +* `Switch.System.Reflection.ForceInterpretedInvoke`: after the second call to + `MethodInfo.Invoke()` or `ConstructorInfo.Invoke()`, code is emitted to + improve performance of repeated calls. + +* `Microsoft.Extensions.DependencyInjection.DisableDynamicEngine`: after the + second call to retrieve a service from a dependency injection container, code + is emitted to improve performance of repeated calls. + +It is desirable in most Android applications to disable this behavior. + +See the [Base Class Libraries Feature Switches documentation][feature-switches] +for details about available feature switches. + +Added in .NET 8. + +[feature-switches]: https://github.com/dotnet/runtime/blob/main/docs/workflow/trimming/feature-switches.md + ## BeforeGenerateAndroidManifest MSBuild Targets listed in this diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets index fa68b285c07..96ba714e734 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets @@ -113,7 +113,8 @@ false false true - <_SystemReflectionForceInterpretedInvoke Condition="'$(_SystemReflectionForceInterpretedInvoke)' == ''">true + <_SystemDiagnosticsMetricsMeterIsSupported Condition="'$(_SystemDiagnosticsMetricsMeterIsSupported)' == ''">false + true false true diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.RuntimeConfig.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.RuntimeConfig.targets index 01c858c77cb..080337885a2 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.RuntimeConfig.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.RuntimeConfig.targets @@ -38,7 +38,17 @@ See: https://github.com/dotnet/runtime/blob/b13715b6984889a709ba29ea8a1961db469f Trim="true" /> + + + + diff --git a/src/profiled-aot/dotnet.aotprofile b/src/profiled-aot/dotnet.aotprofile index a58eb7b5210b42564175eb90dfae1dddb903d4e7..15af4b92975202439e56cc395f78b11b783d1333 100644 GIT binary patch delta 44102 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 CxYug{ delta 44973 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:Contains (string) bool System.Collections.Generic.List`1/Enumerator:MoveNext () bool System.Collections.Generic.List`1/Enumerator:MoveNextRare () - bool System.Collections.Generic.List`1:Contains (System.Diagnostics.Metrics.Instrument) + bool System.Collections.Generic.List`1:Contains (string) bool System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalComparer:Equals (string,string) bool System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalIgnoreCaseComparer:Equals (string,string) - bool System.Collections.Generic.ObjectEqualityComparer`1:Equals (System.Diagnostics.Metrics.Instrument,System.Diagnostics.Metrics.Instrument) + bool System.Collections.Generic.ObjectEqualityComparer`1:Equals (System.Type,System.Type) bool System.Collections.Generic.ValueListBuilder`1:TryCopyTo (System.Span`1,int&) bool System.Collections.Hashtable:KeyEquals (object,object) bool System.DateTime:op_Equality (System.DateTime,System.DateTime) @@ -111,9 +111,10 @@ Methods: bool System.Delegate:IsArgumentTypeMatch (System.Type,System.Type) bool System.Delegate:IsMatchingCandidate (System.RuntimeType,object,System.Reflection.MethodInfo,bool,System.DelegateData&) bool System.Delegate:IsReturnTypeMatch (System.Type,System.Type) - bool System.Diagnostics.Metrics.Meter:AddInstrument (System.Diagnostics.Metrics.Instrument) + bool System.Diagnostics.Metrics.Meter:InitializeIsSupported () bool System.Diagnostics.Tracing.EventSource:InitializeIsSupported () bool System.DomainNameHelper:IsValid (System.ReadOnlySpan`1,bool,bool,int&) + bool System.Globalization.CalendarData:g__AreEraNamesEmpty|24_0 () bool System.Globalization.CalendarData:EnumCalendarInfo (string,System.Globalization.CalendarId,System.Globalization.CalendarDataType,string[]&) bool System.Globalization.CalendarData:EnumCalendarInfo (string,System.Globalization.CalendarId,System.Globalization.CalendarDataType,System.Globalization.CalendarData/IcuEnumCalendarsData&) bool System.Globalization.CalendarData:EnumDatePatterns (string,System.Globalization.CalendarId,System.Globalization.CalendarDataType,string[]&) @@ -215,7 +216,6 @@ Methods: bool System.Net.Http.HttpRuleParser:ContainsNewLine (string,int) bool System.Net.Http.QPack.QPackEncoder:EncodeNameString (string,System.Span`1,int&) bool System.Number:TryUInt32ToDecStr (uint,System.Span`1,int&) - bool System.Object:Equals (object) bool System.OrdinalIgnoreCaseComparer:Equals (string,string) bool System.Private.CoreLib.GateThread/DelayHelper:ShouldPerformGateActivities (int,bool) bool System.Private.CoreLib.Interop:CallStringMethod (System.Buffers.SpanFunc`5,string,string,Interop/Globalization/TimeZoneDisplayNameType,string&) @@ -260,6 +260,7 @@ Methods: bool System.RuntimeType:get_ContainsGenericParameters () bool System.RuntimeType:get_IsByRefLike () bool System.RuntimeType:get_IsEnum () + bool System.RuntimeType:get_IsFunctionPointer () bool System.RuntimeType:get_IsGenericParameter () bool System.RuntimeType:get_IsGenericType () bool System.RuntimeType:get_IsGenericTypeDefinition () @@ -371,9 +372,9 @@ Methods: bool System.TimeZoneInfo:TZif_ParseMDateRule (System.ReadOnlySpan`1,int&,int&,System.DayOfWeek&) bool System.TimeZoneInfo:TZif_ParsePosixFormat (System.ReadOnlySpan`1,System.ReadOnlySpan`1&,System.ReadOnlySpan`1&,System.ReadOnlySpan`1&,System.ReadOnlySpan`1&,System.ReadOnlySpan`1&,System.ReadOnlySpan`1&,System.ReadOnlySpan`1&,System.ReadOnlySpan`1&) bool System.TimeZoneInfo:UtcOffsetOutOfRange (System.TimeSpan) - bool System.TimeZoneInfo/<>c:b__155_0 (char) - bool System.TimeZoneInfo/<>c:b__152_0 (char) - bool System.TimeZoneInfo/<>c:b__153_0 (char) + bool System.TimeZoneInfo/<>c:b__156_0 (char) + bool System.TimeZoneInfo/<>c:b__153_0 (char) + bool System.TimeZoneInfo/<>c:b__154_0 (char) bool System.TimeZoneInfo/AdjustmentRule:get_HasDaylightSaving () bool System.TimeZoneInfo/AdjustmentRule:IsEndDateMarkerForEndOfYear () bool System.TimeZoneInfo/AdjustmentRule:IsStartDateMarkerForBeginningOfYear () @@ -384,7 +385,6 @@ Methods: bool System.Type:get_IsAbstract () bool System.Type:get_IsArray () bool System.Type:get_IsByRef () - bool System.Type:get_IsFunctionPointer () bool System.Type:get_IsInterface () bool System.Type:get_IsPointer () bool System.Type:get_IsPrimitive () @@ -454,7 +454,6 @@ Methods: int System.Array:BinarySearch (System.Array,int,int,object,System.Collections.IComparer) int System.Array:GetLowerBound (int) int System.Array:GetLowerBoundInternal (System.Runtime.CompilerServices.ObjectHandleOnStack,int) - int System.Array:IndexOf (System.Diagnostics.Metrics.Instrument[],System.Diagnostics.Metrics.Instrument,int,int) int System.ArraySegment`1:get_Count () int System.ArraySegment`1:get_Offset () int System.Buffers.Any5SearchValues`2:IndexOfAny (System.ReadOnlySpan`1) @@ -475,11 +474,9 @@ Methods: int System.Collections.Generic.Dictionary`2:Initialize (int) int System.Collections.Generic.Dictionary`2:Initialize (int) int System.Collections.Generic.Dictionary`2:Initialize (int) - int System.Collections.Generic.EqualityComparer`1:IndexOf (System.Diagnostics.Metrics.Instrument[],System.Diagnostics.Metrics.Instrument,int,int) int System.Collections.Generic.GenericArraySortHelper`1:BinarySearch (string[],int,int,string,System.Collections.Generic.IComparer`1) int System.Collections.Generic.HashSet`1:FindItemIndex (string) int System.Collections.Generic.HashSet`1:Initialize (int) - int System.Collections.Generic.List`1:IndexOf (System.Diagnostics.Metrics.Instrument) int System.Collections.Generic.List`1:EnsureCapacity (int) int System.Collections.Generic.List`1:get_Count () int System.Collections.Generic.NonRandomizedStringEqualityComparer/OrdinalComparer:GetHashCode (string) @@ -684,7 +681,6 @@ Methods: int System.TimeZoneInfo:TZif_ToInt32 (System.ReadOnlySpan`1) int System.Uri:CheckAuthorityHelper (char*,int,int,System.ParsingError&,System.Uri/Flags&,System.UriParser,string&) int System.Uri:get_Port () - int System.Uri:ParseSchemeCheckImplicitFile (char*,int,System.ParsingError&,System.Uri/Flags&,System.UriParser&) int[] System.Globalization.CultureData:get_CurrencyGroupSizes () int[] System.Globalization.CultureData:get_NumberGroupSizes () int[] System.Globalization.CultureData:GetLocaleInfoCoreUserOverride (System.Globalization.CultureData/LocaleGroupingData) @@ -703,7 +699,7 @@ Methods: Interop/Globalization/ResultCode System.Private.CoreLib.Interop/Globalization:GetCalendarInfo (string,System.Globalization.CalendarId,System.Globalization.CalendarDataType,char*,int) Interop/Globalization/ResultCode System.Private.CoreLib.Interop/Globalization:GetSortHandle (string,intptr&) Interop/Globalization/ResultCode System.Private.CoreLib.Interop/Globalization:GetTimeZoneDisplayName (string,string,Interop/Globalization/TimeZoneDisplayNameType,char*,int) - Interop/Globalization/ResultCode System.TimeZoneInfo/<>c:b__192_0 (System.Span`1,string,string,Interop/Globalization/TimeZoneDisplayNameType) + Interop/Globalization/ResultCode System.TimeZoneInfo/<>c:b__193_0 (System.Span`1,string,string,Interop/Globalization/TimeZoneDisplayNameType) Interop/Sys/OpenFlags Microsoft.Win32.SafeHandles.SafeFileHandle:PreOpenConfigurationFromOptions (System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,System.IO.FileOptions,bool) intptr Android.Runtime.InputStreamAdapter:ToLocalJniHandle (System.IO.Stream) intptr Android.Runtime.JavaDictionary:GetKeys () @@ -906,7 +902,6 @@ Methods: object System.Collections.SortedList/SyncSortedList:get_SyncRoot () object System.Collections.SortedList/ValueList:get_Item (int) object System.Delegate:get_Target () - object System.Diagnostics.Metrics.Instrument:get_SyncObject () object System.GC:get_ephemeron_tombstone () object System.Globalization.CultureInfo:GetFormat (System.Type) object System.MulticastDelegate:GetTarget () @@ -1161,6 +1156,7 @@ Methods: System.Collections.Generic.Dictionary`2 Java.Interop.TypeManagerMapDictionaries:get_JniToManaged () System.Collections.Generic.EqualityComparer`1 System.Collections.Generic.EqualityComparer`1:CreateComparer () System.Collections.Generic.EqualityComparer`1 System.Collections.Generic.EqualityComparer`1:CreateComparer () + System.Collections.Generic.HashSet`1 System.TimeZoneInfo/AndroidTzData:FilterBackwardIDs (string) System.Collections.Generic.IArraySortHelper`1 System.Collections.Generic.ArraySortHelper`1:CreateArraySortHelper () System.Collections.Generic.IArraySortHelper`1 System.Collections.Generic.ArraySortHelper`1:get_Default () System.Collections.Generic.ICollection`1 Android.Runtime.JavaDictionary`2>:get_Keys () @@ -1176,7 +1172,6 @@ Methods: System.Collections.Generic.IList`1 Android.Runtime.JavaDictionary`2>:get_Item (string) System.Collections.Generic.IList`1 Android.Runtime.JavaList`1:FromJniHandle (intptr,Android.Runtime.JniHandleOwnership) System.Collections.Generic.List`1/Enumerator System.Collections.Generic.List`1:GetEnumerator () - System.Collections.Generic.List`1 System.Diagnostics.Metrics.MeterListener:GetAllListeners () System.Collections.Generic.List`1 System.Threading.TimerQueue:InitializeScheduledTimerManager_Locked () System.Collections.IList System.Collections.SortedList:GetValueList () System.Collections.IList System.Collections.SortedList/SyncSortedList:GetValueList () @@ -1210,16 +1205,13 @@ Methods: System.Delegate System.Delegate:CreateDelegate (System.Type,System.Type,string,bool,bool) System.Delegate System.Delegate:CreateDelegate (System.Type,System.Type,string) System.Delegate System.Delegate:CreateDelegate_internal (System.Runtime.CompilerServices.QCallTypeHandle,object,System.Reflection.MethodInfo,bool) - System.Diagnostics.Metrics.Counter`1 System.Diagnostics.Metrics.Meter:CreateCounter (string,string,string,System.Collections.Generic.IEnumerable`1>) - System.Diagnostics.Metrics.Counter`1 System.Diagnostics.Metrics.Meter:CreateCounter (string,string,string) System.Diagnostics.Metrics.Histogram`1 System.Diagnostics.Metrics.Meter:CreateHistogram (string,string,string,System.Collections.Generic.IEnumerable`1>) System.Diagnostics.Metrics.Histogram`1 System.Diagnostics.Metrics.Meter:CreateHistogram (string,string,string) System.Diagnostics.Metrics.Instrument System.Diagnostics.Metrics.Meter:GetCachedInstrument (System.Collections.Generic.List`1,System.Type,string,string,System.Collections.Generic.IEnumerable`1>) System.Diagnostics.Metrics.Instrument System.Diagnostics.Metrics.Meter:GetOrCreateInstrument (System.Type,string,string,string,System.Collections.Generic.IEnumerable`1>,System.Func`1) System.Diagnostics.Metrics.Instrument System.Diagnostics.Metrics.Meter:GetOrCreateInstrument (System.Type,string,string,string,System.Collections.Generic.IEnumerable`1>,System.Func`1) - System.Diagnostics.Metrics.Instrument System.Diagnostics.Metrics.Meter/<>c__DisplayClass29_0`1:b__0 () - System.Diagnostics.Metrics.Instrument System.Diagnostics.Metrics.Meter/<>c__DisplayClass31_0`1:b__0 () - System.Diagnostics.Metrics.Instrument System.Diagnostics.Metrics.Meter/<>c__DisplayClass33_0`1:b__0 () + System.Diagnostics.Metrics.Instrument System.Diagnostics.Metrics.Meter/<>c__DisplayClass35_0`1:b__0 () + System.Diagnostics.Metrics.Instrument System.Diagnostics.Metrics.Meter/<>c__DisplayClass37_0`1:b__0 () System.Diagnostics.Metrics.Meter System.Net.Http.Metrics.MetricsHandler/SharedMeter:get_Instance () System.Diagnostics.Metrics.UpDownCounter`1 System.Diagnostics.Metrics.Meter:CreateUpDownCounter (string,string,string,System.Collections.Generic.IEnumerable`1>) System.Diagnostics.Metrics.UpDownCounter`1 System.Diagnostics.Metrics.Meter:CreateUpDownCounter (string,string,string) @@ -1311,10 +1303,10 @@ Methods: System.Net.Http.HttpContent Xamarin.Android.Net.AndroidMessageHandler:GetContent (Java.Net.URLConnection,System.IO.Stream,Xamarin.Android.Net.AndroidMessageHandler/ContentState) System.Net.Http.HttpContent/LimitMemoryStream System.Net.Http.HttpContent:CreateMemoryStream (long,System.Exception&) System.Net.Http.HttpMessageHandler System.Net.Http.HttpClientHandler:CreateNativeHandler () + System.Net.Http.HttpMessageHandler System.Net.Http.HttpClientHandler:get_Handler () System.Net.Http.HttpMethod System.Net.Http.HttpMethod:get_Get () System.Net.Http.HttpRequestMessage System.Net.Http.HttpClient:CreateRequestMessage (System.Net.Http.HttpMethod,System.Uri) System.Net.Http.HttpResponseMessage System.Net.Http.HttpResponseMessage:EnsureSuccessStatusCode () - System.Net.Http.Metrics.MetricsHandler System.Net.Http.HttpClientHandler:SetupHandlerChain () System.Net.HttpStatusCode System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1/ConfiguredTaskAwaiter:GetResult () System.Net.HttpStatusCode Xamarin.Android.Net.AndroidMessageHandler/<>c__DisplayClass136_0:b__2 () System.Nullable`1 Android.Runtime.AndroidTypeManager:GetReplacementMethodInfoCore (string,string,string) @@ -1325,7 +1317,6 @@ Methods: System.Number/ParsingStatus System.Number:TryParseBinaryIntegerStyle (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo,int&) System.Number/ParsingStatus System.Number:TryParseBinaryIntegerStyle (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo,long&) System.Number/ParsingStatus System.Number:TryParseBinaryIntegerStyle (System.ReadOnlySpan`1,System.Globalization.NumberStyles,System.Globalization.NumberFormatInfo,uint16&) - System.ParsingError System.Uri:CheckSchemeSyntax (System.ReadOnlySpan`1,System.UriParser&) System.ParsingError System.Uri:ParseScheme (string,System.Uri/Flags&,System.UriParser&) System.ParsingError System.Uri:PrivateParseMinimal () System.ReadOnlySpan`1 System.Globalization.CompareInfo:get_HighCharTable () @@ -1440,6 +1431,7 @@ Methods: System.Runtime.CompilerServices.IAsyncStateMachineBox System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1:GetStateMachineBox (System.Net.Http.HttpClient/d__41&,System.Threading.Tasks.Task`1&) System.Runtime.CompilerServices.IAsyncStateMachineBox System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1:GetStateMachineBox (System.IO.BufferedStream/d__68&,System.Threading.Tasks.Task`1&) System.Runtime.CompilerServices.IAsyncStateMachineBox System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1:GetStateMachineBox (System.IO.Stream/<g__Core|27_0>d&,System.Threading.Tasks.Task`1&) + System.Runtime.CompilerServices.IAsyncStateMachineBox System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1:GetStateMachineBox (System.Net.Http.StreamToStreamCopy/<g__DisposeSourceAsync|1_0>d&,System.Threading.Tasks.Task`1&) System.Runtime.CompilerServices.TaskAwaiter System.Threading.Tasks.Task:GetAwaiter () System.Runtime.InteropServices.GCHandle System.Runtime.InteropServices.GCHandle:Alloc (object,System.Runtime.InteropServices.GCHandleType) System.Runtime.Loader.AssemblyLoadContext System.Runtime.Loader.AssemblyLoadContext:GetAssemblyLoadContext (intptr) @@ -1476,6 +1468,7 @@ Methods: System.Threading.ExecutionContext& System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1d__41>:get_Context () System.Threading.ExecutionContext& System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1d__68>:get_Context () System.Threading.ExecutionContext& System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__Core|27_0>d>:get_Context () + System.Threading.ExecutionContext& System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__DisposeSourceAsync|1_0>d>:get_Context () System.Threading.LowLevelLifoSemaphoreBase/Counts System.Threading.LowLevelLifoSemaphoreBase/Counts:InterlockedCompareExchange (System.Threading.LowLevelLifoSemaphoreBase/Counts,System.Threading.LowLevelLifoSemaphoreBase/Counts) System.Threading.PortableThreadPool/ThreadCounts System.Threading.PortableThreadPool/ThreadCounts:InterlockedCompareExchange (System.Threading.PortableThreadPool/ThreadCounts,System.Threading.PortableThreadPool/ThreadCounts) System.Threading.SemaphoreSlim System.IO.Stream:EnsureAsyncActiveSemaphoreInitialized () @@ -1650,7 +1643,7 @@ Methods: uint System.Private.CoreLib.GateThread/DelayHelper:GetNextDelay (int) uint System.Threading.TimerQueueTimer:GetMilliseconds (System.TimeSpan,string) uintptr System.Text.Ascii:ChangeCase (uint16*,uint16*,uintptr) - uintptr System.Text.Ascii:GetIndexOfFirstNonAsciiByte_Default (byte*,uintptr) + uintptr System.Text.Ascii:GetIndexOfFirstNonAsciiByte_Vector (byte*,uintptr) uintptr System.Text.Ascii:NarrowUtf16ToAscii (char*,byte*,uintptr) uintptr System.Text.Ascii:WidenAsciiToUtf16 (byte*,char*,uintptr) ulong System.Marvin:GenerateSeed () @@ -2037,7 +2030,6 @@ Methods: void System.DBNull:.ctor () void System.DefaultBinder:.cctor () void System.DefaultBinder:.ctor () - void System.Diagnostics.Metrics.Counter`1:.ctor (System.Diagnostics.Metrics.Meter,string,string,string,System.Collections.Generic.IEnumerable`1>) void System.Diagnostics.Metrics.Histogram`1:.ctor (System.Diagnostics.Metrics.Meter,string,string,string,System.Collections.Generic.IEnumerable`1>) void System.Diagnostics.Metrics.Instrument:.cctor () void System.Diagnostics.Metrics.Instrument:.ctor (System.Diagnostics.Metrics.Meter,string,string,string,System.Collections.Generic.IEnumerable`1>) @@ -2054,9 +2046,6 @@ Methods: void System.Diagnostics.Metrics.Meter:Initialize (string,string,System.Collections.Generic.IEnumerable`1>,object) void System.Diagnostics.Metrics.Meter/<>c:.cctor () void System.Diagnostics.Metrics.Meter/<>c:.ctor () - void System.Diagnostics.Metrics.MeterListener:.cctor () - void System.Diagnostics.Metrics.MetricsEventSource:.cctor () - void System.Diagnostics.Metrics.MetricsEventSource:.ctor () void System.Diagnostics.Metrics.UpDownCounter`1:.ctor (System.Diagnostics.Metrics.Meter,string,string,string,System.Collections.Generic.IEnumerable`1>) void System.Diagnostics.Stopwatch:.cctor () void System.Diagnostics.Tracing.EventSource:.cctor () @@ -2070,8 +2059,6 @@ Methods: void System.Diagnostics.Tracing.NativeRuntimeEventSource:.cctor () void System.Diagnostics.Tracing.NativeRuntimeEventSource:.ctor () void System.DomainNameHelper:.cctor () - void System.DomainNameHelper/<>c:.cctor () - void System.DomainNameHelper/<>c:.ctor () void System.Environment:.cctor () void System.GC:_GetGCMemoryInfo (long&,long&,long&,long&,long&,long&) void System.GC:_SuppressFinalize (object) @@ -2332,6 +2319,7 @@ Methods: void System.Net.PathList/PathListComparer:.ctor () void System.NullReferenceException:.ctor (string) void System.Number:.cctor () + void System.Numerics.Vector`1:.ctor (uint16) void System.OrdinalCaseSensitiveComparer:.cctor () void System.OrdinalCaseSensitiveComparer:.ctor () void System.OrdinalIgnoreCaseComparer:.cctor () @@ -2430,7 +2418,6 @@ Methods: void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1d__0>:MoveNext (System.Threading.Thread) void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1d__41>:.cctor () void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1d__41>:.ctor () - void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1d__41>:ExecuteFromThreadPool (System.Threading.Thread) void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1d__41>:ExecutionContextCallback (object) void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1d__41>:MoveNext () void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1d__41>:MoveNext (System.Threading.Thread) @@ -2444,6 +2431,11 @@ Methods: void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__Core|27_0>d>:ExecutionContextCallback (object) void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__Core|27_0>d>:MoveNext () void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__Core|27_0>d>:MoveNext (System.Threading.Thread) + void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__DisposeSourceAsync|1_0>d>:.cctor () + void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__DisposeSourceAsync|1_0>d>:.ctor () + void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__DisposeSourceAsync|1_0>d>:ExecuteFromThreadPool (System.Threading.Thread) + void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__DisposeSourceAsync|1_0>d>:ExecutionContextCallback (object) + void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1/AsyncStateMachineBox`1g__DisposeSourceAsync|1_0>d>:MoveNext (System.Threading.Thread) void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1:SetResult (Java.Net.Proxy) void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1:AwaitUnsafeOnCompleted (System.Runtime.CompilerServices.ConfiguredTaskAwaitable/ConfiguredTaskAwaiter&,System.Runtime.CompilerServices.IAsyncStateMachineBox) void System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1:AwaitUnsafeOnCompleted (System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1/ConfiguredTaskAwaiter&,System.Runtime.CompilerServices.IAsyncStateMachineBox) @@ -2520,6 +2512,7 @@ Methods: void System.RuntimeTypeHandle:internal_from_name (intptr,System.Threading.StackCrawlMark&,System.Runtime.CompilerServices.ObjectHandleOnStack,bool,bool) void System.SpanHelpers:ClearWithoutReferences (byte&,uintptr) void System.SpanHelpers:ClearWithReferences (intptr&,uintptr) + void System.SpanHelpers:Fill (char&,uintptr,char) void System.StackOverflowException:.ctor (string) void System.String:.ctor (char[],int,int) void System.String:.ctor (char*,int,int) @@ -2582,7 +2575,6 @@ Methods: void System.Threading.CancellationTokenSource/Linked1CancellationTokenSource:Dispose (bool) void System.Threading.CancellationTokenSource/LinkedNCancellationTokenSource:.cctor () void System.Threading.CancellationTokenSource/Registrations:.ctor (System.Threading.CancellationTokenSource) - void System.Threading.CancellationTokenSource/Registrations:g__Contention|13_0 (int&) void System.Threading.CancellationTokenSource/Registrations:EnterLock () void System.Threading.EventWaitHandle:.ctor (bool,System.Threading.EventResetMode,string,bool&) void System.Threading.EventWaitHandle:.ctor (bool,System.Threading.EventResetMode) @@ -2651,9 +2643,6 @@ Methods: void System.Threading.SpinLock:.ctor (bool) void System.Threading.SpinLock:Exit (bool) void System.Threading.SpinLock:TryEnter (bool&) - void System.Threading.SpinWait:.cctor () - void System.Threading.SpinWait:SpinOnce () - void System.Threading.SpinWait:SpinOnceCore (int) void System.Threading.SynchronizationContext:SetSynchronizationContext (System.Threading.SynchronizationContext) void System.Threading.Tasks.AwaitTaskContinuation:.cctor () void System.Threading.Tasks.AwaitTaskContinuation:.ctor (System.Action,bool) @@ -2837,7 +2826,6 @@ Methods: void System.TimeZoneInfo/AdjustmentRule:AdjustDaylightDeltaToExpectedRange (System.TimeSpan&,System.TimeSpan&) void System.TimeZoneInfo/AdjustmentRule:ValidateAdjustmentRule (System.DateTime,System.DateTime,System.TimeSpan,System.TimeZoneInfo/TransitionTime,System.TimeZoneInfo/TransitionTime,bool) void System.TimeZoneInfo/AndroidTzData:.ctor () - void System.TimeZoneInfo/AndroidTzData:FilterBackwardIDs (string,System.Collections.Generic.HashSet`1&) void System.TimeZoneInfo/AndroidTzData:LoadEntryAt (System.IO.Stream,long,string&,int&,int&) void System.TimeZoneInfo/AndroidTzData:LoadHeader (System.Span`1,int&,int&) void System.TimeZoneInfo/AndroidTzData:LoadTzFile (string,System.IO.Stream) @@ -2863,8 +2851,6 @@ Methods: void System.Uri:InitializeUri (System.ParsingError,System.UriKind,System.UriFormatException&) void System.Uri:InterlockedSetFlags (System.Uri/Flags) void System.Uri:ParseRemaining () - void System.Uri/<>c:.cctor () - void System.Uri/<>c:.ctor () void System.UriBuilder:.cctor () void System.UriBuilder:.ctor (System.Uri) void System.UriBuilder:set_Port (int) diff --git a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs index f90aa4c09d3..b8f81033c5c 100644 --- a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs +++ b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs @@ -31,17 +31,23 @@ public void GetData (string name, string expected) static readonly object [] TestPrivateSwitchesSource = new object [] { new object [] { - /* name */ "ForceInterpretedInvoke", - /* expected */ true, + /* className */ "System.LocalAppContextSwitches, System.Private.CoreLib", + /* propertyName */ "ForceInterpretedInvoke", + /* expected */ true, + }, + new object [] { + /* className */ "System.Diagnostics.Metrics.Meter.IsSupported, System.Diagnostics.DiagnosticSource", + /* propertyName */ "IsSupported", + /* expected */ false, }, }; [Test] [TestCaseSource (nameof (TestPrivateSwitchesSource))] - public void TestPrivateSwitches (string name, object expected) + public void TestPrivateSwitches (string className, string propertyName, object expected) { - var type = Type.GetType ("System.LocalAppContextSwitches, System.Private.CoreLib", throwOnError: true); - var property = type.GetProperty (name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + var type = Type.GetType (className, throwOnError: true); + var property = type.GetProperty (propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); Assert.AreEqual (expected, property.GetValue (null)); } } From d32fa912f588cf0918d11b5ba25c4e3e23f942eb Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Mon, 18 Sep 2023 15:52:57 -0500 Subject: [PATCH 2/9] Use System.Diagnostics.Metrics.Meter in a test --- .../Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs index b8f81033c5c..cf8ac11d4e4 100644 --- a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs +++ b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs @@ -7,6 +7,9 @@ namespace SystemTests [TestFixture] public class AppContextTests { + // Ensures the type is not trimmed away + static AppContextTests() => new System.Diagnostics.Metrics.Meter("foo"); + static readonly object [] GetDataSource = new object [] { new object [] { /* name */ "test_bool", From c6ab3cd2bd59f2add4a25d6880ad09a04c4ba28f Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Mon, 18 Sep 2023 15:54:55 -0500 Subject: [PATCH 3/9] Update BuildReleaseArm64XFormsDotNet.apkdesc stdErr: Error: apkdiff: File 'assemblies/System.Diagnostics.DiagnosticSource.dll' has changed by -3,463 bytes (-38.24 %). This exceeds the threshold of 5.00 %. Error: apkdiff: Size regression occured, 1 check(s) failed. --- .../BuildReleaseArm64XFormsDotNet.apkdesc | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc index ee238514f33..1a0ecbe1e38 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Resources/Base/BuildReleaseArm64XFormsDotNet.apkdesc @@ -5,136 +5,136 @@ "Size": 3572 }, "assemblies/_Microsoft.Android.Resource.Designer.dll": { - "Size": 2101 + "Size": 2102 }, "assemblies/FormsViewGroup.dll": { "Size": 7112 }, "assemblies/Java.Interop.dll": { - "Size": 70026 + "Size": 70036 }, "assemblies/Mono.Android.dll": { - "Size": 469836 + "Size": 471216 }, "assemblies/Mono.Android.Runtime.dll": { - "Size": 5509 + "Size": 5506 }, "assemblies/mscorlib.dll": { - "Size": 3859 + "Size": 3852 }, "assemblies/netstandard.dll": { - "Size": 5575 + "Size": 5565 }, "assemblies/rc.bin": { - "Size": 1395 + "Size": 1512 }, "assemblies/System.Collections.Concurrent.dll": { - "Size": 11508 + "Size": 11502 }, "assemblies/System.Collections.dll": { - "Size": 15408 + "Size": 15398 }, "assemblies/System.Collections.NonGeneric.dll": { - "Size": 7451 + "Size": 7442 }, "assemblies/System.ComponentModel.dll": { - "Size": 1935 + "Size": 1925 }, "assemblies/System.ComponentModel.Primitives.dll": { - "Size": 2549 + "Size": 2538 }, "assemblies/System.ComponentModel.TypeConverter.dll": { - "Size": 6031 + "Size": 6020 }, "assemblies/System.Console.dll": { - "Size": 6572 + "Size": 6565 }, "assemblies/System.Core.dll": { - "Size": 1984 + "Size": 1977 }, "assemblies/System.Diagnostics.DiagnosticSource.dll": { - "Size": 12520 + "Size": 9057 }, "assemblies/System.Diagnostics.TraceSource.dll": { - "Size": 6548 + "Size": 6540 }, "assemblies/System.dll": { - "Size": 2341 + "Size": 2332 }, "assemblies/System.Drawing.dll": { - "Size": 1934 + "Size": 1923 }, "assemblies/System.Drawing.Primitives.dll": { - "Size": 11971 + "Size": 11967 }, "assemblies/System.IO.Compression.Brotli.dll": { - "Size": 11188 + "Size": 11187 }, "assemblies/System.IO.Compression.dll": { - "Size": 15864 + "Size": 15856 }, "assemblies/System.IO.IsolatedStorage.dll": { - "Size": 9869 + "Size": 9862 }, "assemblies/System.Linq.dll": { - "Size": 19560 + "Size": 19555 }, "assemblies/System.Linq.Expressions.dll": { - "Size": 164682 + "Size": 165111 }, "assemblies/System.Net.Http.dll": { - "Size": 69544 + "Size": 67637 }, "assemblies/System.Net.Primitives.dll": { - "Size": 22431 + "Size": 22426 }, "assemblies/System.Net.Requests.dll": { - "Size": 3599 + "Size": 3589 }, "assemblies/System.ObjectModel.dll": { - "Size": 8113 + "Size": 8106 }, "assemblies/System.Private.CoreLib.dll": { - "Size": 845111 + "Size": 845653 }, "assemblies/System.Private.DataContractSerialization.dll": { - "Size": 192906 + "Size": 193645 }, "assemblies/System.Private.Uri.dll": { - "Size": 43477 + "Size": 42849 }, "assemblies/System.Private.Xml.dll": { - "Size": 215983 + "Size": 215960 }, "assemblies/System.Private.Xml.Linq.dll": { - "Size": 16636 + "Size": 16631 }, "assemblies/System.Runtime.dll": { - "Size": 2748 + "Size": 2740 }, "assemblies/System.Runtime.InteropServices.dll": { - "Size": 3858 + "Size": 3851 }, "assemblies/System.Runtime.Serialization.dll": { - "Size": 1861 + "Size": 1850 }, "assemblies/System.Runtime.Serialization.Formatters.dll": { - "Size": 2480 + "Size": 2469 }, "assemblies/System.Runtime.Serialization.Primitives.dll": { - "Size": 3758 + "Size": 3747 }, "assemblies/System.Security.Cryptography.dll": { - "Size": 8099 + "Size": 8089 }, "assemblies/System.Text.RegularExpressions.dll": { - "Size": 158865 + "Size": 158950 }, "assemblies/System.Xml.dll": { - "Size": 1752 + "Size": 1741 }, "assemblies/System.Xml.Linq.dll": { - "Size": 1771 + "Size": 1761 }, "assemblies/UnnamedProject.dll": { "Size": 4987 @@ -206,7 +206,7 @@ "Size": 42282 }, "classes.dex": { - "Size": 3514720 + "Size": 3513140 }, "lib/arm64-v8a/libmono-component-marshal-ilgen.so": { "Size": 97080 @@ -215,19 +215,19 @@ "Size": 325320 }, "lib/arm64-v8a/libmonosgen-2.0.so": { - "Size": 3189360 + "Size": 3193200 }, "lib/arm64-v8a/libSystem.IO.Compression.Native.so": { "Size": 723560 }, "lib/arm64-v8a/libSystem.Native.so": { - "Size": 93920 + "Size": 93952 }, "lib/arm64-v8a/libSystem.Security.Cryptography.Native.Android.so": { "Size": 154904 }, "lib/arm64-v8a/libxamarin-app.so": { - "Size": 102752 + "Size": 102840 }, "META-INF/android.support.design_material.version": { "Size": 12 @@ -1916,5 +1916,5 @@ "Size": 325240 } }, - "PackageSize": 7977998 + "PackageSize": 7973902 } \ No newline at end of file From 194a084a44b3ebdf698ccac44af0f02afabfda2e Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Mon, 18 Sep 2023 15:58:16 -0500 Subject: [PATCH 4/9] Formatting --- .../Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs index cf8ac11d4e4..336f42a4e7d 100644 --- a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs +++ b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs @@ -8,7 +8,7 @@ namespace SystemTests public class AppContextTests { // Ensures the type is not trimmed away - static AppContextTests() => new System.Diagnostics.Metrics.Meter("foo"); + static AppContextTests () => new System.Diagnostics.Metrics.Meter ("foo"); static readonly object [] GetDataSource = new object [] { new object [] { From 5c07ad99eb9707f376b491b13e27043a7c614849 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Mon, 18 Sep 2023 21:03:33 -0500 Subject: [PATCH 5/9] Oh, I see my typo now --- .../Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs index 336f42a4e7d..f3bd7b76cd8 100644 --- a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs +++ b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs @@ -7,9 +7,6 @@ namespace SystemTests [TestFixture] public class AppContextTests { - // Ensures the type is not trimmed away - static AppContextTests () => new System.Diagnostics.Metrics.Meter ("foo"); - static readonly object [] GetDataSource = new object [] { new object [] { /* name */ "test_bool", @@ -39,7 +36,7 @@ public void GetData (string name, string expected) /* expected */ true, }, new object [] { - /* className */ "System.Diagnostics.Metrics.Meter.IsSupported, System.Diagnostics.DiagnosticSource", + /* className */ "System.Diagnostics.Metrics.Meter, System.Diagnostics.DiagnosticSource", /* propertyName */ "IsSupported", /* expected */ false, }, From 6abfef474aeb618ec518aa388c6967d20d9c8b7d Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Tue, 19 Sep 2023 08:34:15 -0500 Subject: [PATCH 6/9] `Assert.IsNotNull()` --- .../Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs index f3bd7b76cd8..7253e232b24 100644 --- a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs +++ b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs @@ -48,6 +48,7 @@ public void TestPrivateSwitches (string className, string propertyName, object e { var type = Type.GetType (className, throwOnError: true); var property = type.GetProperty (propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + Assert.IsNotNull (property); Assert.AreEqual (expected, property.GetValue (null)); } } From 980242391f82a2b87a0581ae8db2b729274cad4d Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Tue, 19 Sep 2023 09:04:52 -0500 Subject: [PATCH 7/9] Update AppContextTests.cs --- .../System/AppContextTests.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs index 7253e232b24..da3228cffe5 100644 --- a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs +++ b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/System/AppContextTests.cs @@ -37,7 +37,7 @@ public void GetData (string name, string expected) }, new object [] { /* className */ "System.Diagnostics.Metrics.Meter, System.Diagnostics.DiagnosticSource", - /* propertyName */ "IsSupported", + /* propertyName */ "k__BackingField", /* expected */ false, }, }; @@ -47,9 +47,15 @@ public void GetData (string name, string expected) public void TestPrivateSwitches (string className, string propertyName, object expected) { var type = Type.GetType (className, throwOnError: true); - var property = type.GetProperty (propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); - Assert.IsNotNull (property); - Assert.AreEqual (expected, property.GetValue (null)); + var members = type.GetMember (propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + Assert.AreEqual (1, members.Length); + if (members [0] is PropertyInfo property) { + Assert.AreEqual (expected, property.GetValue (null)); + } else if (members [0] is FieldInfo field) { + Assert.AreEqual (expected, field.GetValue (null)); + } else { + Assert.Fail($"Unknown member type: {members [0]}"); + } } } } From 69ddec5cb5d2e5e47396a89f7534015e8ef11f4d Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 20 Sep 2023 13:17:51 -0500 Subject: [PATCH 8/9] $(AndroidAvoidEmitForPerformance) --- .../guides/building-apps/build-properties.md | 52 +++++++++---------- ...soft.Android.Sdk.DefaultProperties.targets | 3 +- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/Documentation/guides/building-apps/build-properties.md b/Documentation/guides/building-apps/build-properties.md index d32dd289b02..54dc92d2606 100644 --- a/Documentation/guides/building-apps/build-properties.md +++ b/Documentation/guides/building-apps/build-properties.md @@ -153,6 +153,32 @@ The `$(AndroidApplicationJavaClass)` property is generally set by Added in Xamarin.Android 6.1. +## AndroidAvoidEmitForPerformance + +A boolean property that determines whether or not `System.Reflection.Emit` is +"avoided" to improve startup performance. This property is `True` by default. + +Usage of `System.Reflection.Emit` has a noticeable impact on startup performance +on Android. This behavior is disabled by default for the following feature +switches: + +* `Switch.System.Reflection.ForceInterpretedInvoke`: after the second call to + `MethodInfo.Invoke()` or `ConstructorInfo.Invoke()`, code is emitted to + improve performance of repeated calls. + +* `Microsoft.Extensions.DependencyInjection.DisableDynamicEngine`: after the + second call to retrieve a service from a dependency injection container, code + is emitted to improve performance of repeated calls. + +It is desirable in most Android applications to disable this behavior. + +See the [Base Class Libraries Feature Switches documentation][feature-switches] +for details about available feature switches. + +Added in .NET 8. + +[feature-switches]: https://github.com/dotnet/runtime/blob/main/docs/workflow/trimming/feature-switches.md + ## AndroidBinUtilsPath A path to a directory containing @@ -1628,32 +1654,6 @@ as support for `$(AotAssemblies)` will be removed in a future release. Extra options to pass to `aprofutil`. -## AvoidEmitForPerformance - -A boolean property that determines whether or not `System.Reflection.Emit` is -"avoided" to improve startup performance. This property is `True` by default. - -Usage of `System.Reflection.Emit` has a noticeable impact on startup performance -on Android. This behavior is disabled by default for the following feature -switches: - -* `Switch.System.Reflection.ForceInterpretedInvoke`: after the second call to - `MethodInfo.Invoke()` or `ConstructorInfo.Invoke()`, code is emitted to - improve performance of repeated calls. - -* `Microsoft.Extensions.DependencyInjection.DisableDynamicEngine`: after the - second call to retrieve a service from a dependency injection container, code - is emitted to improve performance of repeated calls. - -It is desirable in most Android applications to disable this behavior. - -See the [Base Class Libraries Feature Switches documentation][feature-switches] -for details about available feature switches. - -Added in .NET 8. - -[feature-switches]: https://github.com/dotnet/runtime/blob/main/docs/workflow/trimming/feature-switches.md - ## BeforeGenerateAndroidManifest MSBuild Targets listed in this diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets index 96ba714e734..2ec7baa7784 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets @@ -114,7 +114,8 @@ false true <_SystemDiagnosticsMetricsMeterIsSupported Condition="'$(_SystemDiagnosticsMetricsMeterIsSupported)' == ''">false - true + $(AvoidEmitForPerformance) + true false true From 15562abf331f86ce1a95783e07d58a7a8dd186bd Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 20 Sep 2023 13:18:30 -0500 Subject: [PATCH 9/9] Update Microsoft.Android.Sdk.RuntimeConfig.targets --- .../targets/Microsoft.Android.Sdk.RuntimeConfig.targets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.RuntimeConfig.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.RuntimeConfig.targets index 080337885a2..188c3846c1b 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.RuntimeConfig.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.RuntimeConfig.targets @@ -38,12 +38,12 @@ See: https://github.com/dotnet/runtime/blob/b13715b6984889a709ba29ea8a1961db469f Trim="true" />