ff707c145e
When we implemented support for using default interface members for binding protocols, we also unintentionally introduced a size regression. This happened because we now tell the linker to keep all methods in a protocol interface, thus all the corresponding types end up marked as well, etc. This had an additional side effect: depending on the types that weren't linked away anymore, the App Store could flag an app, saying that additional entitlements is needed. This is what's happening in #21002: the App Store detects that the app references the `application:didRegisterForRemoteNotificationsWithDeviceToken:` selector [1] (from the method `RegisteredForRemoteNotifications` on `IUIApplicationDelegate`) and tells the developer they probably need the push notification entitlement. The good news is that we don't need these protocol interface methods at runtime if the optimization to register protocols with the static registrar is enabled (which it is by default). In this PR I teach the optimizer to remove the DynamicDependency attributes keeping these protocol interface methods from being trimmed out. ## Size improvements * monotouch-test build for Release/ios-arm64 shrinks by [2.9mb (-2.6%)](https://gist.github.com/rolfbjarne/5e8ca6ea6854dc4a46f8e838dff11e6b) * A very simple app (tests/dotnet/MySimpleApp) shrinks by [176kb (-0.3%)](https://gist.github.com/rolfbjarne/f0e062900528eb499fd96d124d18376f) [1]: This is somewhat speculative, but it's probably not far from what the App Store actually does. Fixes #21002. |
||
---|---|---|
.. | ||
MonoTouch.Tuner | ||
ApplyPreserveAttribute.cs | ||
BaseProfile.cs | ||
ChangeLog | ||
CoreHttpMessageHandler.cs | ||
CoreMarkStep.cs | ||
CoreOptimizeGeneratedCode.cs | ||
CorePreserveCode.cs | ||
CoreRemoveAttributes.cs | ||
CoreRemoveSecurity.cs | ||
CoreSweepStep.cs | ||
CoreTypeMapStep.cs | ||
CustomSymbolWriter.cs | ||
ExceptionalSubStep.cs | ||
MarkNSObjects.cs | ||
MobileApplyPreserveAttribute.cs | ||
MobileExtensions.cs | ||
MobileMarkStep.cs | ||
MobileProfile.cs | ||
MobileRemoveAttributes.cs | ||
MobileResolveMainAssemblyStep.cs | ||
MobileSweepStep.cs | ||
ObjCExtensions.cs | ||
README.linker | ||
RegistrarRemovalTrackingStep.cs | ||
RemoveRejectedTypesStep.cs | ||
RemoveSelectors.cs | ||
RemoveUserResourcesSubStep.cs | ||
ScanTypeReferenceStep.cs |
README.linker
README.linker Q: Why some stuff is not linked out ? A: In most case this is because: a) the BCL uses it internally b) the mono runtime depends on the type, methods, class layout = mscorlib.dll = System.Security.PermissionSet * Assembly has (3) fields of that type * mscorlib.xml preserve all fields from Assembly (object-internals.h) * code is "stubified" by the linker System.Security.Policy.ApplicationTrust: * Used as a field in AppDomainSetup; * Field also exists in unmanaged code (domain-internals.h); * mscorlib.xml preserve all fields from AppDomainSetup * only the default .ctor remains and is stubified by the linker System.Security.Policy.Evidence * Used by AppDomain.Load[Assembly] * Used by Assembly.LoadWithPartialName overloads * code is "stubified" by the linker = System.dll = System.Text.RegularExpressions.* * Included because there is 2 regex in UriParser