diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/GenerateProguardConfiguration.cs b/src/Microsoft.Android.Sdk.ILLink/GenerateProguardConfiguration.cs similarity index 94% rename from src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/GenerateProguardConfiguration.cs rename to src/Microsoft.Android.Sdk.ILLink/GenerateProguardConfiguration.cs index e491fc9de53..28730b06540 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/GenerateProguardConfiguration.cs +++ b/src/Microsoft.Android.Sdk.ILLink/GenerateProguardConfiguration.cs @@ -16,23 +16,13 @@ namespace Mono.Linker.Steps { public class GenerateProguardConfiguration : BaseStep { - -#if !ILLINK - public GenerateProguardConfiguration (string outputFileName) - { - this.filename = outputFileName; - } -#endif // !ILLINK - string filename; TextWriter writer; protected override void Process () { -#if ILLINK if (Context.TryGetCustomData ("ProguardConfiguration", out string proguardPath)) filename = proguardPath; -#endif // ILLINK var dir = Path.GetDirectoryName (filename); if (!Directory.Exists (dir)) Directory.CreateDirectory (dir); diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/GetAssembliesStep.cs b/src/Microsoft.Android.Sdk.ILLink/GetAssembliesStep.cs similarity index 100% rename from src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/GetAssembliesStep.cs rename to src/Microsoft.Android.Sdk.ILLink/GetAssembliesStep.cs diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MarkJavaObjects.cs b/src/Microsoft.Android.Sdk.ILLink/MarkJavaObjects.cs similarity index 95% rename from src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MarkJavaObjects.cs rename to src/Microsoft.Android.Sdk.ILLink/MarkJavaObjects.cs index 66893206bd8..f9ee603b446 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MarkJavaObjects.cs +++ b/src/Microsoft.Android.Sdk.ILLink/MarkJavaObjects.cs @@ -9,32 +9,17 @@ namespace MonoDroid.Tuner { - public class MarkJavaObjects : -#if ILLINK - BaseMarkHandler -#else // !ILLINK - BaseSubStep -#endif // !ILLINK + public class MarkJavaObjects : BaseMarkHandler { Dictionary> module_types = new Dictionary> (); -#if ILLINK public override void Initialize (LinkContext context, MarkContext markContext) { base.Initialize (context, markContext); markContext.RegisterMarkTypeAction (type => ProcessType (type)); } -#else // !ILLINK - public override SubStepTargets Targets { - get { return SubStepTargets.Type; } - } -#endif // !ILLINK - public -#if !ILLINK - override -#endif // !ILLINK - void ProcessType (TypeDefinition type) + public void ProcessType (TypeDefinition type) { // If this isn't a JLO or IJavaObject implementer, // then we don't need to MarkJavaObjects @@ -60,9 +45,7 @@ void PreserveJavaObjectImplementation (TypeDefinition type) PreserveIntPtrConstructor (type); PreserveAttributeSetConstructor (type); PreserveInvoker (type); -#if ILLINK PreserveInterfaces (type); -#endif // ILLINK } void PreserveAttributeSetConstructor (TypeDefinition type) @@ -199,12 +182,9 @@ void PreserveInvoker (TypeDefinition type) PreserveConstructors (type, invoker); PreserveIntPtrConstructor (invoker); PreserveInterfaceMethods (type, invoker); -#if ILLINK PreserveInterfaces (invoker); -#endif // ILLINK } -#if ILLINK void PreserveInterfaces (TypeDefinition type) { if (!type.HasInterfaces) @@ -255,7 +235,6 @@ bool ShouldPreserveInterfaces (TypeDefinition type) return true; } -#endif // ILLINK TypeDefinition GetInvokerType (TypeDefinition type) { diff --git a/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj b/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj index bee005cab0c..d8471f49fef 100644 --- a/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj +++ b/src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj @@ -13,27 +13,17 @@ - + - - - - - - - - - diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveApplications.cs b/src/Microsoft.Android.Sdk.ILLink/PreserveApplications.cs similarity index 77% rename from src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveApplications.cs rename to src/Microsoft.Android.Sdk.ILLink/PreserveApplications.cs index 716152d6980..16d2a4537d7 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveApplications.cs +++ b/src/Microsoft.Android.Sdk.ILLink/PreserveApplications.cs @@ -12,61 +12,31 @@ namespace MonoDroid.Tuner { - public class PreserveApplications : -#if ILLINK - BaseMarkHandler -#else // !ILLINK - BaseSubStep -#endif // !ILLINK + public class PreserveApplications : BaseMarkHandler { - -#if ILLINK public override void Initialize (LinkContext context, MarkContext markContext) { base.Initialize (context, markContext); markContext.RegisterMarkAssemblyAction (assembly => ProcessAssembly (assembly)); markContext.RegisterMarkTypeAction (type => ProcessType (type)); } -#else // !ILLINK - public override SubStepTargets Targets { - get { return SubStepTargets.Type - | SubStepTargets.Assembly; - } - } -#endif // !ILLINK - public -#if !ILLINK - override -#endif // !ILLINK - bool IsActiveFor (AssemblyDefinition assembly) + public bool IsActiveFor (AssemblyDefinition assembly) { return Annotations.GetAction (assembly) == AssemblyAction.Link; } - public -#if !ILLINK - override -#endif // !ILLINK - void ProcessAssembly (AssemblyDefinition assembly) + public void ProcessAssembly (AssemblyDefinition assembly) { -#if ILLINK if (!IsActiveFor (assembly)) return; -#endif // ILLINK ProcessAttributeProvider (assembly); } - public -#if !ILLINK - override -#endif // !ILLINK - void ProcessType (TypeDefinition type) + public void ProcessType (TypeDefinition type) { -#if ILLINK if (!IsActiveFor (type.Module.Assembly)) return; -#endif // ILLINK if (!type.Inherits ("Android.App.Application")) return; diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveExportedTypes.cs b/src/Microsoft.Android.Sdk.ILLink/PreserveExportedTypes.cs similarity index 99% rename from src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveExportedTypes.cs rename to src/Microsoft.Android.Sdk.ILLink/PreserveExportedTypes.cs index 482169cc3a7..13de9feb243 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveExportedTypes.cs +++ b/src/Microsoft.Android.Sdk.ILLink/PreserveExportedTypes.cs @@ -7,10 +7,7 @@ using Mono.Linker.Steps; using Mono.Cecil; - -#if ILLINK using Microsoft.Android.Sdk.ILLink; -#endif namespace Mono.Tuner { diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveJavaExceptions.cs b/src/Microsoft.Android.Sdk.ILLink/PreserveJavaExceptions.cs similarity index 79% rename from src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveJavaExceptions.cs rename to src/Microsoft.Android.Sdk.ILLink/PreserveJavaExceptions.cs index 4433be1732a..12a9c9f59fb 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveJavaExceptions.cs +++ b/src/Microsoft.Android.Sdk.ILLink/PreserveJavaExceptions.cs @@ -12,31 +12,16 @@ namespace MonoDroid.Tuner { - public class PreserveJavaExceptions : -#if ILLINK - BaseMarkHandler -#else // !ILLINK - BaseSubStep -#endif // !ILLINK + public class PreserveJavaExceptions : BaseMarkHandler { -#if ILLINK public override void Initialize (LinkContext context, MarkContext markContext) { base.Initialize (context, markContext); markContext.RegisterMarkTypeAction (type => ProcessType (type)); } -#else // !ILLINK - public override SubStepTargets Targets { - get { return SubStepTargets.Type; } - } -#endif // !ILLINK - public -#if !ILLINK - override -#endif // !ILLINK - void ProcessType (TypeDefinition type) + public void ProcessType (TypeDefinition type) { if (type.IsJavaException ()) PreserveJavaException (type); diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/StripEmbeddedLibraries.cs b/src/Microsoft.Android.Sdk.ILLink/StripEmbeddedLibraries.cs similarity index 100% rename from src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/StripEmbeddedLibraries.cs rename to src/Microsoft.Android.Sdk.ILLink/StripEmbeddedLibraries.cs diff --git a/src/Xamarin.Android.Build.Tasks/Linker/LinkModes.cs b/src/Xamarin.Android.Build.Tasks/Linker/LinkModes.cs deleted file mode 100644 index 9ef60b5096b..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/LinkModes.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Xamarin.Android.Tasks -{ - public enum LinkModes - { - None, - SdkOnly, - Full - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AndroidLinkContext.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AndroidLinkContext.cs deleted file mode 100644 index 47503b2965f..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/AndroidLinkContext.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Mono.Linker; -using Mono.Cecil; - -namespace MonoDroid.Tuner -{ - public class AndroidLinkContext : LinkContext - { - public AndroidLinkContext (Pipeline pipeline, AssemblyResolver resolver) - : base (pipeline, resolver) {} - - public AndroidLinkContext (Pipeline pipeline, AssemblyResolver resolver, ReaderParameters readerParameters, UnintializedContextFactory factory) - : base (pipeline, resolver, readerParameters, factory) {} - - public bool PreserveJniMarshalMethods { get; set; } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/ApplyPreserveAttribute.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/ApplyPreserveAttribute.cs deleted file mode 100644 index 9d8eb089366..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/ApplyPreserveAttribute.cs +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2011, 2015 Xamarin Inc. All rights reserved. - -using System; -using System.Collections.Generic; - -using Mono.Linker; -using Mono.Tuner; - -using Mono.Cecil; - -namespace MonoDroid.Tuner { - - public class ApplyPreserveAttribute : ApplyPreserveAttributeBase { - - bool is_sdk; - - // System.ServiceModeldll is an SDK assembly but it does contain types with [DataMember] attributes - public override bool IsActiveFor (AssemblyDefinition assembly) - { - is_sdk = Profile.IsSdkAssembly (assembly); - return Annotations.GetAction (assembly) == AssemblyAction.Link; - } - - // SDK candidates - they will be preserved only if the application (not the SDK) uses it - static List srs_data_contract = new List (); - static List xml_serialization = new List (); - - public static IList DataContract { - get { - return srs_data_contract; - } - } - - public static IList XmlSerialization { - get { - return xml_serialization; - } - } - - protected override bool IsPreservedAttribute (ICustomAttributeProvider provider, CustomAttribute attribute, out bool removeAttribute) - { - removeAttribute = false; - TypeReference type = attribute.Constructor.DeclaringType; - - switch (type.Namespace) { - case "Android.Runtime": - // there's no need to keep the [Preserve] attribute in the assembly once it was processed - if (type.Name == "PreserveAttribute") { - removeAttribute = true; - return true; - } - break; - case "System.Runtime.Serialization": - bool srs = false; - // http://bugzilla.xamarin.com/show_bug.cgi?id=1415 - // http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.aspx - if (provider is PropertyDefinition || provider is FieldDefinition || provider is EventDefinition) - srs = (type.Name == "DataMemberAttribute"); - else if (provider is TypeDefinition) - srs = (type.Name == "DataContractAttribute"); - - if (srs) { - MarkDefautConstructor (provider, is_sdk ? srs_data_contract : null); - return !is_sdk; - } - break; - case "System.Xml.Serialization": - // http://msdn.microsoft.com/en-us/library/83y7df3e.aspx - string name = type.Name; - if ((name.StartsWith ("Xml", StringComparison.Ordinal) && name.EndsWith ("Attribute", StringComparison.Ordinal))) { - // but we do not have to keep things that XML serialization will ignore anyway! - if (name != "XmlIgnoreAttribute") { - // the default constructor of the type *being used* is needed - MarkDefautConstructor (provider, is_sdk ? xml_serialization : null); - return !is_sdk; - } - } - break; - default: - if (type.Name == "PreserveAttribute") { - // there's no need to keep the [Preserve] attribute in the assembly once it was processed - removeAttribute = true; - return true; - } - break; - } - // keep them (provider and attribute) - return false; - } - - // xml serialization requires the default .ctor to be present - void MarkDefautConstructor (ICustomAttributeProvider provider, IList list) - { - if (list != null) { - list.Add (provider); - return; - } - - TypeDefinition td = (provider as TypeDefinition); - if (td == null) { - PropertyDefinition pd = (provider as PropertyDefinition); - if (pd != null) { - MarkDefautConstructor (pd.DeclaringType); - MarkGenericType (pd.PropertyType as GenericInstanceType); - td = pd.PropertyType.Resolve (); - } else { - FieldDefinition fd = (provider as FieldDefinition); - if (fd != null) { - MarkDefautConstructor (fd.DeclaringType); - MarkGenericType (fd.FieldType as GenericInstanceType); - td = (fd.FieldType as TypeReference).Resolve (); - } - } - } - - // e.g. property (see bug #5543) or field (see linkall unit tests) - if (td != null) - MarkDefautConstructor (td); - } - - void MarkGenericType (GenericInstanceType git) - { - if (git == null || !git.HasGenericArguments) - return; - - foreach (TypeReference tr in git.GenericArguments) - MarkDefautConstructor (tr.Resolve ()); - } - - void MarkDefautConstructor (TypeDefinition type) - { - if ((type == null) || !type.HasMethods) - return; - - foreach (MethodDefinition ctor in type.Methods) { - if (!ctor.IsConstructor || ctor.IsStatic || ctor.HasParameters) - continue; - - Annotations.AddPreservedMethod (type, ctor); - } - } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/Linker.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/Linker.cs deleted file mode 100644 index a7a2c864c9f..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/Linker.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Xml.XPath; -using Java.Interop.Tools.Cecil; -using Mono.Linker; -using Mono.Linker.Steps; -using Mono.Cecil.Mdb; -using Mono.Tuner; -using Mono.Cecil; -using Mono.Cecil.Cil; -using MonoTouch.Tuner; - -namespace MonoDroid.Tuner -{ - class Linker - { - public static void Process (LinkerOptions options, ILogger logger, out LinkContext context) - { - var pipeline = CreatePipeline (options); - - pipeline.PrependStep (new ResolveFromAssemblyStep (options.MainAssembly)); - if (options.RetainAssemblies != null) - foreach (var assembly in options.RetainAssemblies) - pipeline.PrependStep (new ResolveFromAssemblyStep (assembly)); - - context = CreateLinkContext (options, pipeline, logger); - context.Resolver.AddSearchDirectory (options.OutputDirectory); - - Run (pipeline, context); - } - - static void Run (Pipeline pipeline, LinkContext context) - { - pipeline.Process (context); - } - - static LinkContext CreateLinkContext (LinkerOptions options, Pipeline pipeline, ILogger logger) - { - var context = new AndroidLinkContext (pipeline, options.Resolver); - if (options.DumpDependencies) { - var prepareDependenciesDump = context.Annotations.GetType ().GetMethod ("PrepareDependenciesDump", new Type[] {}); - if (prepareDependenciesDump != null) - prepareDependenciesDump.Invoke (context.Annotations, null); - } - context.LogMessages = true; - context.Logger = logger; - context.CoreAction = AssemblyAction.Link; - context.UserAction = AssemblyAction.Link; - context.LinkSymbols = true; - context.DeterministicOutput = options.DeterministicOutput; - context.SymbolReaderProvider = new DefaultSymbolReaderProvider (true); - context.SymbolWriterProvider = new DefaultSymbolWriterProvider (); - context.OutputDirectory = options.OutputDirectory; - context.PreserveJniMarshalMethods = options.PreserveJniMarshalMethods; - context.DisabledOptimizations = CodeOptimizations.UnreachableBodies; - return context; - } - - static Pipeline CreatePipeline (LinkerOptions options) - { - var cache = new TypeDefinitionCache (); - var pipeline = new Pipeline (); - - if (options.LinkNone) { - pipeline.AppendStep (new FixAbstractMethodsStep (cache)); - if (options.AddKeepAlives) - pipeline.AppendStep (new AddKeepAlivesStep (cache)); - pipeline.AppendStep (new OutputStepWithTimestamps ()); - return pipeline; - } - - pipeline.AppendStep (new LoadReferencesStep ()); - - if (options.I18nAssemblies != I18nAssemblies.None) - pipeline.AppendStep (new LoadI18nAssemblies (options.I18nAssemblies)); - - pipeline.AppendStep (new BlacklistStep ()); - - foreach (var desc in options.LinkDescriptions) - pipeline.AppendStep (new ResolveFromXmlStep (new XPathDocument (desc))); - - pipeline.AppendStep (new CustomizeActions (options.LinkSdkOnly, options.SkippedAssemblies)); - - pipeline.AppendStep (new TypeMapStep ()); - - // monodroid tuner steps - pipeline.AppendStep (new SubStepDispatcher { - new ApplyPreserveAttribute (), - }); - pipeline.AppendStep (new SubStepDispatcher { - new PreserveExportedTypes (), - new RemoveSecurity (), - new MarkJavaObjects (), - new PreserveJavaExceptions (), - new PreserveApplications (), - new RemoveAttributes (), - new PreserveDynamicTypes (), - new PreserveHttpAndroidClientHandler { HttpClientHandlerType = options.HttpClientHandlerType }, - new PreserveTlsProvider { TlsProvider = options.TlsProvider }, - new PreserveSoapHttpClients (), - new PreserveTypeConverters (), - new PreserveLinqExpressions (), - new PreserveRuntimeSerialization (), - }); - - pipeline.AppendStep (new PreserveCrypto ()); - pipeline.AppendStep (new PreserveCode ()); - - pipeline.AppendStep (new RemoveResources (options.I18nAssemblies)); // remove collation tables - // end monodroid specific - - if (options.UseDesignerAssembly) - pipeline.AppendStep (new FixLegacyResourceDesignerStep ()); - pipeline.AppendStep (new FixAbstractMethodsStep (cache)); - pipeline.AppendStep (new MonoDroidMarkStep (cache)); - pipeline.AppendStep (new SweepStep ()); - pipeline.AppendStep (new CleanStep ()); - // monodroid tuner steps - if (!string.IsNullOrWhiteSpace (options.ProguardConfiguration)) - pipeline.AppendStep (new GenerateProguardConfiguration (options.ProguardConfiguration)); - pipeline.AppendStep (new StripEmbeddedLibraries ()); - if (options.AddKeepAlives) - pipeline.AppendStep (new AddKeepAlivesStep (cache)); - - if (options.LinkResources) { - pipeline.AppendStep (new GetAssembliesStep ()); - pipeline.AppendStep (new RemoveResourceDesignerStep ()); - } - // end monodroid specific - pipeline.AppendStep (new RegenerateGuidStep ()); - pipeline.AppendStep (new OutputStepWithTimestamps ()); - - return pipeline; - } - - static List ListAssemblies (LinkContext context) - { - var list = new List (); - foreach (var assembly in context.GetAssemblies ()) { - if (context.Annotations.GetAction (assembly) == AssemblyAction.Delete) - continue; - - list.Add (GetFullyQualifiedName (assembly)); - } - - return list; - } - - static string GetFullyQualifiedName (AssemblyDefinition assembly) - { - return assembly.MainModule.FullyQualifiedName; - } - - public static I18nAssemblies ParseI18nAssemblies (string i18n) - { - if (string.IsNullOrWhiteSpace (i18n)) - return I18nAssemblies.None; - - var assemblies = I18nAssemblies.None; - - foreach (var part in i18n.Split (new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries)) { - var assembly = part.Trim (); - if (string.IsNullOrEmpty (assembly)) - continue; - - try { - assemblies |= (I18nAssemblies) Enum.Parse (typeof (I18nAssemblies), assembly, true); - } catch { - throw new FormatException ("Unknown value for i18n: " + assembly); - } - } - - return assemblies; - } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkerOptions.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkerOptions.cs deleted file mode 100644 index 1886d50915e..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkerOptions.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Mono.Cecil; -using Mono.Linker; - -namespace MonoDroid.Tuner -{ - class LinkerOptions - { - public AssemblyDefinition MainAssembly { get; set; } - public IEnumerable RetainAssemblies { get; set; } - public string OutputDirectory { get; set; } - public bool LinkSdkOnly { get; set; } - public bool LinkNone { get; set; } - public string [] LinkDescriptions { get; set; } - public AssemblyResolver Resolver { get; set; } - public IEnumerable SkippedAssemblies { get; set; } - public I18nAssemblies I18nAssemblies { get; set; } - public string ProguardConfiguration { get; set; } - public bool DumpDependencies { get; set; } - public string HttpClientHandlerType { get; set; } - public string TlsProvider { get; set; } - public bool AddKeepAlives { get; set; } - public bool PreserveJniMarshalMethods { get; set; } - public bool DeterministicOutput { get; set; } - public bool LinkResources { get; set; } - public bool UseDesignerAssembly { get; set; } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs deleted file mode 100644 index dfc7f16adb1..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs +++ /dev/null @@ -1,587 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Mono.Cecil; -using Mono.Cecil.Cil; - -using Java.Interop.Tools.Cecil; - -using Mono.Linker; -using Mono.Linker.Steps; -using Mono.Tuner; - -namespace MonoDroid.Tuner -{ - class MonoDroidMarkStep : MarkStep - { - const string ICustomMarshalerName = "System.Runtime.InteropServices.ICustomMarshaler"; - HashSet marshalTypes = new HashSet (); - readonly TypeDefinitionCache cache; - - public MonoDroidMarkStep (TypeDefinitionCache cache) - { - this.cache = cache; - } - - public override void Process (LinkContext context) - { - marshalTypes.Clear (); - base.Process (context); - - if (PreserveJniMarshalMethods () && UpdateMarshalTypes ()) - base.Process (context); - } - - bool UpdateMarshalTypes () - { - MethodDefinition registerMethod; - HashSet markedMethods = new HashSet (); - var updated = false; - - var typeName = "Java.Interop.TypeManager/JavaTypeManager/__<$>_jni_marshal_methods"; - var javaTypeManager = _context.GetType ("Mono.Android", typeName); - if (javaTypeManager == null) - throw new InvalidOperationException ($"Unable to find '{typeName}' in Mono.Android.dll!"); - marshalTypes.Add (javaTypeManager); - - foreach (var type in marshalTypes) { - registerMethod = null; - markedMethods.Clear (); - - foreach (var method in type.Methods) { - if (method.Name == "__RegisterNativeMembers") { - registerMethod = method; - - continue; - } - - if (method.IsConstructor) - continue; - - if (_context.Annotations.IsMarked (method)) - markedMethods.Add (method.Name); - } - - if (registerMethod == null || markedMethods.Count <= 0) - continue; - - updated |= UpdateMarshalRegisterMethod (registerMethod, markedMethods); - } - - UpdateMagicRegistration (); - - return updated; - } - - MethodReference CreateGenericMethodReference (MethodReference method, GenericInstanceType type) - { - var genericMethod = new MethodReference (method.Name, method.ReturnType) { - DeclaringType = type, - HasThis = method.HasThis, - ExplicitThis = method.ExplicitThis, - CallingConvention = method.CallingConvention, - }; - - for (int i = 0; i < method.Parameters.Count; i++) - genericMethod.Parameters.Add (method.Parameters [i]); - - return genericMethod; - } - - void UpdateRegistrationSwitch (MethodDefinition method, MethodReference[] switchMethods) - { - var instructions = method.Body.Instructions; - var module = method.DeclaringType.Module; - var switchInstructions = new Instruction [switchMethods.Length]; - - instructions.Clear (); - - var typeNullable = _context.GetType ("mscorlib", "System.Nullable`1"); - var methodGetValueOrDefault = Extensions.GetMethod (typeNullable, "GetValueOrDefault"); - var genericTypeNullable = new GenericInstanceType (typeNullable); - genericTypeNullable.GenericArguments.Add (_context.GetType ("mscorlib", "System.Int32")); - - var typeIdxVariable = new VariableDefinition (module.ImportReference (genericTypeNullable)); - method.Body.Variables.Clear (); - method.Body.Variables.Add (typeIdxVariable); - - instructions.Add (Instruction.Create (OpCodes.Ldarg_1)); - instructions.Add (Instruction.Create (OpCodes.Stloc_0)); - instructions.Add (Instruction.Create (OpCodes.Ldloca_S, typeIdxVariable)); - - var genericMethodGetValueOrDefault = CreateGenericMethodReference (methodGetValueOrDefault, genericTypeNullable); - instructions.Add (Instruction.Create (OpCodes.Call, module.ImportReference (genericMethodGetValueOrDefault))); - - for (var i = 0; i < switchMethods.Length; i++) - switchInstructions [i] = Instruction.Create (OpCodes.Ldtoken, switchMethods [i].DeclaringType); - - var typeType = _context.GetType ("mscorlib", "System.Type"); - var methodGetTypeFromHandle = _context.GetMethod ("mscorlib", "System.Type", "GetTypeFromHandle", new string[] { "System.RuntimeTypeHandle" }); - var callDelegateStart = Instruction.Create (OpCodes.Call, module.ImportReference (methodGetTypeFromHandle)); - - instructions.Add (Instruction.Create (OpCodes.Switch, switchInstructions)); - - for (var i = 0; i < switchMethods.Length; i++) { - instructions.Add (switchInstructions [i]); - instructions.Add (Instruction.Create (OpCodes.Br, callDelegateStart)); - } - - instructions.Add (Instruction.Create (OpCodes.Ldc_I4_0)); - instructions.Add (Instruction.Create (OpCodes.Ret)); - - var actionType = _context.GetType ("mscorlib", "System.Action`1"); - - var genericActionType = new GenericInstanceType (actionType); - var argsType = _context.GetType ("Java.Interop", "Java.Interop.JniNativeMethodRegistrationArguments"); - - genericActionType.GenericArguments.Add (argsType); - - MarkType (genericActionType); - - var actionInvoke = Extensions.GetMethod (actionType, "Invoke", new string[] { "T" }); - var methodGetMethod = _context.GetMethod ("mscorlib", "System.Type", "GetMethod", new string[] { "System.String" }); - var typeMethodInfo = _context.GetType ("mscorlib", "System.Reflection.MethodInfo"); - var methodCreateDelegate = _context.GetMethod ("mscorlib", "System.Reflection.MethodInfo", "CreateDelegate", new string[] { "System.Type" }); - - instructions.Add (callDelegateStart); - - instructions.Add (Instruction.Create (OpCodes.Ldstr, "__RegisterNativeMembers")); - instructions.Add (Instruction.Create (OpCodes.Call, module.ImportReference (methodGetMethod))); - - instructions.Add (Instruction.Create (OpCodes.Ldtoken, module.ImportReference (genericActionType))); - instructions.Add (Instruction.Create (OpCodes.Call, module.ImportReference (methodGetTypeFromHandle))); - - instructions.Add (Instruction.Create (OpCodes.Callvirt, module.ImportReference (methodCreateDelegate))); - - instructions.Add (Instruction.Create (OpCodes.Castclass, module.ImportReference (genericActionType))); - - var genericActionInvoke = CreateGenericMethodReference (actionInvoke, genericActionType); - - instructions.Add (Instruction.Create (OpCodes.Ldarg_0)); - instructions.Add (Instruction.Create (OpCodes.Callvirt, module.ImportReference (genericActionInvoke))); - - instructions.Add (Instruction.Create (OpCodes.Ldc_I4_1)); - instructions.Add (Instruction.Create (OpCodes.Ret)); - } - - void UpdateMagicPrefill (TypeDefinition magicType) - { - var fieldTypesMap = magicType.Fields.FirstOrDefault (f => f.Name == "typesMap"); - if (fieldTypesMap == null) - return; - - var methodPrefill = Extensions.GetMethod (magicType, "Prefill"); - if (methodPrefill == null) - return; - - var typeDictionary = _context.GetType ("mscorlib", "System.Collections.Generic.Dictionary`2"); - var ctorDictionary = Extensions.GetMethod (typeDictionary, ".ctor", new string[] { "System.Int32" }); - var methodSetItem = Extensions.GetMethod (typeDictionary, "set_Item", new string[] { "TKey", "TValue" }); - var genericTypeDictionary = new GenericInstanceType (typeDictionary); - genericTypeDictionary.GenericArguments.Add (_context.GetType ("mscorlib", "System.String")); - genericTypeDictionary.GenericArguments.Add (_context.GetType ("mscorlib", "System.Int32")); - - var genericMethodDictionaryCtor = CreateGenericMethodReference (ctorDictionary, genericTypeDictionary); - var genericMethodDictionarySetItem = CreateGenericMethodReference (methodSetItem, genericTypeDictionary); - var importedMethodSetItem = magicType.Module.ImportReference (genericMethodDictionarySetItem); - - var instructions = methodPrefill.Body.Instructions; - instructions.Clear (); - - instructions.Add (Extensions.CreateLoadArraySizeOrOffsetInstruction (marshalTypes.Count)); - instructions.Add (Instruction.Create (OpCodes.Newobj, magicType.Module.ImportReference (genericMethodDictionaryCtor))); - instructions.Add (Instruction.Create (OpCodes.Stsfld, fieldTypesMap)); - - int idx = 0; - - foreach (var type in marshalTypes) { - instructions.Add (Instruction.Create (OpCodes.Ldsfld, fieldTypesMap)); - instructions.Add (Instruction.Create (OpCodes.Ldstr, type.FullName.Replace ("/__<$>_jni_marshal_methods", "").Replace ("/","+"))); - instructions.Add (Extensions.CreateLoadArraySizeOrOffsetInstruction (idx++)); - instructions.Add (Instruction.Create (OpCodes.Callvirt, importedMethodSetItem)); - } - - instructions.Add (Instruction.Create (OpCodes.Ret)); - } - - void UpdateMagicRegistration () - { - TypeDefinition magicType = _context.GetType ("Mono.Android", "Android.Runtime.AndroidTypeManager/MagicRegistrationMap"); - if (magicType == null) - return; - - MethodDefinition magicCall = Extensions.GetMethod (magicType, "CallRegisterMethodByIndex"); - if (magicCall == null) - return; - - var switchMethods = new MethodReference [marshalTypes.Count]; - var module = magicType.Module; - int idx = 0; - foreach (var type in marshalTypes) { - var md = Extensions.GetMethod (type, "__RegisterNativeMembers"); - if (md == null) - return; - - var resolved = md.Resolve (); - if (resolved == null) - return; - - switchMethods [idx++] = module.ImportReference (resolved); - } - - UpdateMagicPrefill (magicType); - UpdateRegistrationSwitch (magicCall, switchMethods); - } - - static bool IsLdcI4 (Instruction instruction, out int intValue) - { - intValue = 0; - - if (instruction.OpCode == OpCodes.Ldc_I4_0) - intValue = 0; - else if (instruction.OpCode == OpCodes.Ldc_I4_1) - intValue = 1; - else if (instruction.OpCode == OpCodes.Ldc_I4_2) - intValue = 2; - else if (instruction.OpCode == OpCodes.Ldc_I4_3) - intValue = 3; - else if (instruction.OpCode == OpCodes.Ldc_I4_4) - intValue = 4; - else if (instruction.OpCode == OpCodes.Ldc_I4_5) - intValue = 5; - else if (instruction.OpCode == OpCodes.Ldc_I4_6) - intValue = 6; - else if (instruction.OpCode == OpCodes.Ldc_I4_7) - intValue = 7; - else if (instruction.OpCode == OpCodes.Ldc_I4_8) - intValue = 8; - else if (instruction.OpCode == OpCodes.Ldc_I4) - intValue = (int) instruction.Operand; - else if (instruction.OpCode == OpCodes.Ldc_I4_S) - intValue = (sbyte) instruction.Operand; - else - return false; - - return true; - } - - bool UpdateMarshalRegisterMethod (MethodDefinition method, HashSet markedMethods) - { - var instructions = method.Body.Instructions; - var arraySizeUpdated = false; - var idx = 0; - var arrayOffset = 0; - - while (idx < instructions.Count) { - if (!arraySizeUpdated && idx + 1 < instructions.Count) { - int length; - if (IsLdcI4 (instructions [idx++], out length) && instructions [idx].OpCode == OpCodes.Newarr) { - instructions [idx - 1] = Extensions.CreateLoadArraySizeOrOffsetInstruction (markedMethods.Count); - idx++; - arraySizeUpdated = true; - continue; - } - } else if (idx + 9 < instructions.Count) { - var chunkStart = idx; - if (instructions [idx++].OpCode != OpCodes.Dup) - continue; - - int offset; - var offsetIdx = idx; - if (!IsLdcI4 (instructions [idx++], out offset)) - continue; - - if (instructions [idx++].OpCode != OpCodes.Ldstr) - continue; - - if (instructions [idx++].OpCode != OpCodes.Ldstr) - continue; - - if (instructions [idx++].OpCode != OpCodes.Ldnull) - continue; - - if (instructions [idx++].OpCode != OpCodes.Ldftn) - continue; - - if (!(instructions [idx - 1].Operand is MethodReference mr)) - continue; - - if (instructions [idx++].OpCode != OpCodes.Newobj) - continue; - - if (instructions [idx++].OpCode != OpCodes.Newobj) - continue; - - var chunkEnd = idx; - if (instructions [idx++].OpCode != OpCodes.Stelem_Any) - continue; - - if (markedMethods.Contains (mr.Name)) { - instructions [offsetIdx] = Extensions.CreateLoadArraySizeOrOffsetInstruction (arrayOffset++); - continue; - } - - for (int i = 0; i <= chunkEnd - chunkStart; i++) - instructions.RemoveAt (chunkStart); - - idx = chunkStart; - } else - break; - } - - if (!arraySizeUpdated || arrayOffset != markedMethods.Count) { - _context.LogMessage ($"Unable to update {method} size updated {arraySizeUpdated} counts {arrayOffset} {markedMethods.Count}"); - return false; - } - - MarkMethod (method); - - return true; - } - - bool PreserveJniMarshalMethods () - { - if (_context is AndroidLinkContext ac) - return ac.PreserveJniMarshalMethods; - - return false; - } - - // If this is one of our infrastructure methods that has [Register], like: - // [Register ("hasWindowFocus", "()Z", "GetHasWindowFocusHandler")], - // we need to preserve the "GetHasWindowFocusHandler" method as well. - protected override void DoAdditionalMethodProcessing (MethodDefinition method) - { - string member, nativeMethod, signature; - - bool preserveJniMarshalMethodOnly = false; - if (!method.TryGetRegisterMember (out member, out nativeMethod, out signature)) { - if (PreserveJniMarshalMethods () && - method.DeclaringType.GetMarshalMethodsType () != null && - method.TryGetBaseOrInterfaceRegisterMember (cache, out member, out nativeMethod, out signature)) { - preserveJniMarshalMethodOnly = true; - } else { - return; - } - } - - MethodDefinition marshalMethod; - if (PreserveJniMarshalMethods () && method.TryGetMarshalMethod (nativeMethod, signature, out marshalMethod)) { - MarkMethod (marshalMethod); - marshalTypes.Add (marshalMethod.DeclaringType); - } - - if (preserveJniMarshalMethodOnly) - return; - - PreserveRegisteredMethod (method.DeclaringType, member); - } - - protected override bool ShouldMarkInterfaceImplementation (TypeDefinition type, InterfaceImplementation iface, TypeDefinition resolvedInterfaceType) - { - if (Annotations.IsMarked (iface)) - return false; - - if (base.ShouldMarkInterfaceImplementation (type, iface, resolvedInterfaceType)) - return true; - - return resolvedInterfaceType.ImplementsIJavaObject () || resolvedInterfaceType.ImplementsIJavaPeerable (); - } - - protected override void DoAdditionalTypeProcessing (TypeDefinition type) - { - // If we are preserving a Mono.Android interface, - // preserve all members on the interface. - if (!type.IsInterface) - return; - - // Mono.Android interfaces will always inherit IJavaObject - if (!type.ImplementsIJavaObject ()) - return; - - foreach (MethodReference method in type.Methods) - MarkMethod (method); - } - - private void PreserveRegisteredMethod (TypeDefinition type, string member) - { - var type_ptr = type; - var pos = member.IndexOf (':'); - - if (pos > 0) { - var type_name = member.Substring (pos + 1); - member = member.Substring (0, pos); - type_ptr = type_ptr.Module.Types.FirstOrDefault (t => t.FullName == type_name); - } - - if (type_ptr == null) - return; - - while (MarkNamedMethod (type, member) == 0 && type.BaseType != null) - type = type.BaseType.Resolve (); - } - - protected override TypeDefinition MarkType (TypeReference reference) - { - TypeDefinition type = base.MarkType (reference); - if (type == null) - return null; - - switch (type.Module.Assembly.Name.Name) { - case "mscorlib": - ProcessCorlib (type); - break; - case "System.Core": - ProcessSystemCore (type); - break; - case "System.Data": - ProcessSystemData (type); - break; - case "System": - ProcessSystem (type); - break; - } - - if (type.HasMethods && type.HasInterfaces && type.Implements (ICustomMarshalerName)) { - foreach (MethodDefinition method in type.Methods) { - if (method.Name == "GetInstance" && method.IsStatic && method.HasParameters && method.Parameters.Count == 1 && method.ReturnType.FullName == ICustomMarshalerName && method.Parameters.First ().ParameterType.FullName == "System.String") { - MarkMethod (method); - break; - } - } - } - - return type; - } - - bool DebugBuild { - get { return _context.LinkSymbols; } - } - - void ProcessCorlib (TypeDefinition type) - { - switch (type.Namespace) { - case "System.Runtime.CompilerServices": - switch (type.Name) { - case "AsyncTaskMethodBuilder": - if (DebugBuild) { - MarkNamedMethod (type, "SetNotificationForWaitCompletion"); - MarkNamedMethod (type, "get_ObjectIdForDebugger"); - } - break; - case "AsyncTaskMethodBuilder`1": - if (DebugBuild) { - MarkNamedMethod (type, "SetNotificationForWaitCompletion"); - MarkNamedMethod (type, "get_ObjectIdForDebugger"); - } - break; - } - break; - case "System.Threading.Tasks": - switch (type.Name) { - case "Task": - if (DebugBuild) - MarkNamedMethod (type, "NotifyDebuggerOfWaitCompletion"); - break; - } - break; - } - } - - void ProcessSystemCore (TypeDefinition type) - { - switch (type.Namespace) { - case "System.Linq.Expressions": - switch (type.Name) { - case "LambdaExpression": - var expr_t = type.Module.GetType ("System.Linq.Expressions.Expression`1"); - if (expr_t != null) - MarkNamedMethod (expr_t, "Create"); - break; - } - break; - case "System.Linq.Expressions.Compiler": - switch (type.Name) { - case "LambdaCompiler": - MarkNamedMethod (type.Module.GetType ("System.Runtime.CompilerServices.RuntimeOps"), "Quote"); - break; - } - break; - } - } - - void ProcessSystemData (TypeDefinition type) - { - switch (type.Namespace) { - case "System.Data.SqlTypes": - switch (type.Name) { - case "SqlXml": - // TODO: Needed only if CreateSqlReaderDelegate is used - TypeDefinition xml_reader = _context.GetType ("System.Xml", "System.Xml.XmlReader"); - MarkNamedMethod (xml_reader, "CreateSqlReader"); - break; - } - break; - } - } - - void ProcessSystem (TypeDefinition type) - { - switch (type.Namespace) { - case "System.Diagnostics": - switch (type.Name) { - // see mono/metadata/process.c - case "FileVersionInfo": - case "ProcessModule": - // fields are initialized by the runtime, if the type is here then all (instance) fields must be present - MarkFields (type, false); - break; - } - break; - case "System.Net.Sockets": - switch (type.Name) { - case "IPAddress": - // mono/metadata/socket-io.c directly access 'm_Address' and 'm_Numbers' - MarkFields (type, false); - break; - case "IPv6MulticastOption": - // mono/metadata/socket-io.c directly access 'group' and 'ifIndex' private instance fields - MarkFields (type, false); - break; - case "LingerOption": - // mono/metadata/socket-io.c directly access 'enabled' and 'seconds' private instance fields - MarkFields (type, false); - break; - case "MulticastOption": - // mono/metadata/socket-io.c directly access 'group' and 'local' private instance fields - MarkFields (type, false); - break; - case "Socket": - // mono/metadata/socket-io.c directly access 'ipv4Supported', 'ipv6Supported' (static) and 'socket' (instance) - MarkFields (type, true); - break; - case "SocketAddress": - // mono/metadata/socket-io.c directly access 'data' - MarkFields (type, false); - break; - } - break; - case "": - if (!type.IsNested) - break; - - switch (type.Name) { - case "SocketAsyncResult": - // mono/metadata/socket-io.h defines this structure (MonoSocketAsyncResult) for the runtime usage - MarkFields (type, false); - break; - case "ProcessAsyncReader": - // mono/metadata/socket-io.h defines this structure (MonoSocketAsyncResult) for the runtime usage - MarkFields (type, false); - break; - } - break; - } - } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/OutputStepWithTimestamps.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/OutputStepWithTimestamps.cs deleted file mode 100644 index bd137612f90..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/OutputStepWithTimestamps.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.IO; -using Mono.Cecil; -using Mono.Cecil.Cil; -using Mono.Linker.Steps; -using Xamarin.Android.Tools; -using Microsoft.Android.Build.Tasks; - -namespace MonoDroid.Tuner -{ - /// - /// A subclass of OutputStep that overrides CopyAssembly and timestamps files properly with Files.CopyIfChanged - /// * original source from: https://github.com/mono/linker/blob/aa65acca5e41fbc1f8f597799381b853049704ff/src/linker/Linker.Steps/OutputStep.cs#L198-L231 - /// - class OutputStepWithTimestamps : OutputStep - { - static FileInfo GetOriginalAssemblyFileInfo (AssemblyDefinition assembly) - { - return new FileInfo (assembly.MainModule.FileName); - } - - protected override void CopyAssembly (AssemblyDefinition assembly, string directory) - { - // Special case. When an assembly has embedded pdbs, link symbols is not enabled, and the assembly's action is copy, - // we want to match the behavior of assemblies with the other symbol types and end up with an assembly that does not have symbols. - // In order to do that, we can't simply copy files. We need to write the assembly without symbols - if (assembly.MainModule.HasSymbols && !Context.LinkSymbols && assembly.MainModule.SymbolReader is EmbeddedPortablePdbReader) { - WriteAssembly (assembly, directory, new WriterParameters ()); - return; - } - - FileInfo fi = GetOriginalAssemblyFileInfo (assembly); - string target = Path.GetFullPath (Path.Combine (directory, fi.Name)); - string source = fi.FullName; - if (source == target) - return; - - Files.CopyIfChanged (source, target); - - if (!Context.LinkSymbols) - return; - - var mdb = source + ".mdb"; - if (File.Exists (mdb)) - Files.CopyIfChanged (mdb, target + ".mdb"); - - var pdb = Path.ChangeExtension (source, "pdb"); - if (File.Exists (pdb)) - Files.CopyIfChanged (pdb, Path.ChangeExtension (target, "pdb")); - } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveCode.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveCode.cs deleted file mode 100644 index b54c84de76e..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveCode.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Linq; - -using Mono.Linker; -using Mono.Linker.Steps; - -using Mono.Tuner; -using Mobile.Tuner; - -using Mono.Cecil; - -namespace MonoTouch.Tuner { - - public class PreserveCode : IStep { - - LinkContext context; - - public void Process (LinkContext context) - { - this.context = context; - - PreserveDictionaryConstructor (); - PreserveQueryableEnumerable (); - PreserveResourceSet (); - } - - void PreserveDictionaryConstructor () - { - AssemblyDefinition corlib; - if (!context.TryGetLinkedAssembly ("mscorlib", out corlib)) - return; - - var dictionary = corlib.MainModule.Types.FirstOrDefault (t => t.FullName == "System.Collections.Generic.Dictionary`2"); - if (dictionary == null || !dictionary.Methods.Any (m => m.IsConstructor)) - return; - - foreach (MethodDefinition ctor in dictionary.Methods.Where (m => m.IsConstructor)) - if (ctor.HasParameters && ctor.Parameters [0].ParameterType.FullName == "System.Int32") - context.Annotations.AddPreservedMethod (dictionary, ctor); - } - - void PreserveQueryableEnumerable () - { - AssemblyDefinition core; - if (!context.TryGetLinkedAssembly ("System.Core", out core)) - return; - - var enumerable = core.MainModule.Types.FirstOrDefault (t => t.FullName == "System.Linq.Enumerable"); - - var queryable_enumerable = core.MainModule.Types.FirstOrDefault (t => t.FullName == "System.Linq.QueryableEnumerable`1"); - - if (enumerable != null && queryable_enumerable != null) - foreach (MethodDefinition method in enumerable.Methods) - context.Annotations.AddPreservedMethod (queryable_enumerable, method); - - if (queryable_enumerable != null) - foreach (MethodDefinition method in queryable_enumerable.Methods.Where (m => m.IsConstructor)) - context.Annotations.AddPreservedMethod (queryable_enumerable, method); - } - - void PreserveResourceSet () - { - AssemblyDefinition corlib; - if (!context.TryGetLinkedAssembly ("mscorlib", out corlib)) - return; - - var resource_set = corlib.MainModule.Types.FirstOrDefault (t => t.FullName == "System.Resources.RuntimeResourceSet"); - if (resource_set == null || !resource_set.Methods.Any (m => m.IsConstructor)) - return; - - foreach (MethodDefinition ctor in resource_set.Methods.Where (m => m.IsConstructor)) - context.Annotations.AddPreservedMethod (resource_set, ctor); - } - } -} - diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveDynamicTypes.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveDynamicTypes.cs deleted file mode 100644 index 18ced568b35..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveDynamicTypes.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; - -using Mono.Linker; -using Mono.Linker.Steps; - -using Mono.Cecil; - -namespace Mono.Tuner { - - public class PreserveDynamicTypes : BaseSubStep { - - public override SubStepTargets Targets { - get { return SubStepTargets.Assembly ; } - } - - bool preserve_dynamic; - List saved = new List (); - - void PreserveLibrary (AssemblyDefinition assembly) - { - var action = Annotations.GetAction (assembly); - ResolveFromAssemblyStep.ProcessLibrary (context, assembly); - if (action == AssemblyAction.Link) - Annotations.SetAction (assembly, action); - } - - public override void ProcessAssembly (AssemblyDefinition assembly) - { - // Preserve dynamic dependencies only when Microsoft.CSharp is referenced. - switch (assembly.Name.Name) { - case "Microsoft.CSharp": - preserve_dynamic = true; - foreach (var savedAssembly in saved) - PreserveLibrary (savedAssembly); - PreserveLibrary (assembly); - break; - case "Mono.CSharp": - case "System.Core": - if (preserve_dynamic) - PreserveLibrary (assembly); - else - saved.Add (assembly); - break; - } - } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveHttpAndroidClientHandler.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveHttpAndroidClientHandler.cs deleted file mode 100644 index bc3c012acaf..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveHttpAndroidClientHandler.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using Mono.Cecil; -using Mono.Tuner; - -namespace MonoDroid.Tuner -{ - public class PreserveHttpAndroidClientHandler : BaseSubStep - { - public string HttpClientHandlerType { get; set; } - - public override bool IsActiveFor (Mono.Cecil.AssemblyDefinition assembly) - { - return HttpClientHandlerType != null && (assembly.Name.Name == "System.Net.Http" || assembly.Name.Name == "Mono.Android"); - } - - public override SubStepTargets Targets { - get { return SubStepTargets.Method; } - } - - public override void ProcessMethod (MethodDefinition method) - { - if (method.Name == "CreateDefaultHandler" && method.DeclaringType.FullName == "System.Net.Http.HttpClient") - Mark (); - } - - protected AssemblyDefinition GetAssembly (string assemblyName) - { - AssemblyDefinition ad; - context.TryGetLinkedAssembly (assemblyName, out ad); - return ad; - } - - protected TypeDefinition GetType (AssemblyDefinition assembly, string typeName) - { - return assembly.MainModule.GetType (typeName); - } - - protected TypeDefinition GetType (string assemblyName, string typeName) - { - AssemblyDefinition ad = GetAssembly (assemblyName); - return ad == null ? null : GetType (ad, typeName); - } - - bool MarkType (string assemblyName, string typeName) - { - var type = GetType (assemblyName, typeName); - if (type != null) { - context.Annotations.Mark (type); - context.Annotations.SetPreserve (type, Mono.Linker.TypePreserve.All); - return true; - } - return false; - } - - string GetAssemblyNameFromTypeName (string typeName, out string simpleTypeName) - { - simpleTypeName = null; - var parts = typeName.Split (new char [] { ',' }, 2); - if (parts.Length != 2) - return null; - - var anr = AssemblyNameReference.Parse (parts [1].Trim ()); - if (anr == null) - return null; - - simpleTypeName = parts [0].Trim (); - return anr.Name; - } - - void Mark () - { - var androidEnvironmentType = GetType ("Mono.Android", "Android.Runtime.AndroidEnvironment"); - if (androidEnvironmentType != null) { - foreach (var method in androidEnvironmentType.Methods) { - if (method.Name == "GetHttpMessageHandler") { - context.Annotations.AddPreservedMethod (androidEnvironmentType, method); - break; - } - } - } - - if (MarkType ("Mono.Android", HttpClientHandlerType)) - return; - - string simpleTypeName; - var assemblyName = GetAssemblyNameFromTypeName (HttpClientHandlerType, out simpleTypeName); - if (assemblyName != null && MarkType (assemblyName, simpleTypeName)) - return; - - foreach (var assembly in context.GetAssemblies ()) { - var clientTypeRef = assembly.MainModule.GetType (HttpClientHandlerType, true); - if (clientTypeRef == null) - continue; - - var clientTypeDef = clientTypeRef.Resolve (); - if (clientTypeDef == null) - continue; - - context.Annotations.Mark (clientTypeDef); - context.Annotations.SetPreserve (clientTypeDef, Mono.Linker.TypePreserve.All); - break; - } - } - } -} - diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveJavaTypeRegistrations.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveJavaTypeRegistrations.cs deleted file mode 100644 index 7444aab5a1f..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveJavaTypeRegistrations.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections; -using System.Linq; - -using Mono.Linker; -using Mono.Linker.Steps; - -using Mono.Tuner; -using Mobile.Tuner; - -using Mono.Cecil; - -namespace MonoDroid.Tuner { - - public class PreserveJavaTypeRegistrations : BaseSubStep { - - public override SubStepTargets Targets { - get { return SubStepTargets.Type; } - } - - public override void ProcessType (TypeDefinition type) - { - if (type.FullName == "Java.Interop.__TypeRegistrations") - PreserveJavaTypeRegistration (type); - } - - void PreserveJavaTypeRegistration (TypeDefinition type) - { - Annotations.Mark (type); - Annotations.SetPreserve (type, TypePreserve.All); - } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveLinqExpressions.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveLinqExpressions.cs deleted file mode 100644 index 7cc6baad984..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveLinqExpressions.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Linq; - -using Mono.Linker; - -using Mono.Cecil; - -namespace Mono.Tuner { - - // WARNING: this link substep is placed after marking all required stuff. - public class PreserveLinqExpressions : BaseSubStep { - - public override SubStepTargets Targets { - get { return SubStepTargets.Type; } - } - - public override bool IsActiveFor (AssemblyDefinition assembly) - { - // scan all user assemblies even if it is not linked. - return !Xamarin.Android.Tasks.MonoAndroidHelper.IsFrameworkAssembly (assembly.Name.Name); - } - - bool already_marked; - - public override void ProcessType (TypeDefinition type) - { - if (already_marked) - return; - if (IsLinqProvider (type)) { - already_marked = true; - AssemblyDefinition core; - if (!context.TryGetLinkedAssembly ("System.Core", out core)) - return; - foreach (var t in core.MainModule.Types.Where (t => t.Namespace == "System.Linq" || t.Namespace == "System.Linq.Expressions")) - Annotations.SetPreserve (t, TypePreserve.All); - } - } - - bool IsLinqProvider (TypeDefinition type) - { - // skip unmarked types. - if (!Annotations.IsMarked (type)) - return false; - if (type.Namespace == "System.Linq") - return false; // we are not looking for default system types. - if (!type.HasInterfaces) - return false; - return type.Interfaces.Any (i => i.InterfaceType.FullName == "System.Linq.IQueryProvider") - || type.Interfaces.Select (t => t.InterfaceType.Resolve ()).Any (t => t != null && IsLinqProvider (t)); - } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveRuntimeSerialization.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveRuntimeSerialization.cs deleted file mode 100644 index 78a0e159695..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveRuntimeSerialization.cs +++ /dev/null @@ -1,177 +0,0 @@ -using System; -using Mono.Tuner; -using Mono.Cecil; - -namespace MonoDroid.Tuner -{ - public class PreserveRuntimeSerialization : BaseSubStep - { - public override SubStepTargets Targets { - get { return SubStepTargets.Type; } - } - - public override bool IsActiveFor (Mono.Cecil.AssemblyDefinition assembly) - { - return assembly.Name.Name == "System.Runtime.Serialization" || assembly.Name.Name == "System.Xml"; - } - - bool system_runtime_serialization = false; - bool system_xml_serialization = false; - - public override void ProcessType (TypeDefinition type) - { - switch (type.Namespace) { - case "System.Runtime.Serialization.Json": - switch (type.Name) { - case "JsonFormatWriterInterpreter": - TypeDefinition jwd = GetType ("System.Runtime.Serialization", "System.Runtime.Serialization.Json.JsonWriterDelegator"); - PreserveMethods (jwd); - break; - } - break; - case "System.Runtime.Serialization": - // MS referencesource use reflection to call the required methods to serialize each PrimitiveDataContract subclasses - // this goes thru XmlFormatGeneratorStatics and it's a better candidate (than PrimitiveDataContract) as there are other callers - switch (type.Name) { - case "XmlFormatGeneratorStatics": - TypeDefinition xwd = GetType ("System.Runtime.Serialization", "System.Runtime.Serialization.XmlWriterDelegator"); - PreserveMethods (xwd); - TypeDefinition xoswc = GetType ("System.Runtime.Serialization", "System.Runtime.Serialization.XmlObjectSerializerWriteContext"); - PreserveMethods (xoswc); - TypeDefinition xosrc = GetType ("System.Runtime.Serialization", "System.Runtime.Serialization.XmlObjectSerializerReadContext"); - PreserveMethods (xosrc); - TypeDefinition xrd = GetType ("System.Runtime.Serialization", "System.Runtime.Serialization.XmlReaderDelegator"); - PreserveMethods (xrd); - break; - case "CollectionDataContract": - // ensure the nested type, DictionaryEnumerator and GenericDictionaryEnumerator`2, can be created thru reflection - foreach (var nt in type.NestedTypes) - PreserveConstructors (nt); - break; - } - - if (system_runtime_serialization) - break; - system_runtime_serialization = true; - // if we're keeping this assembly and use the Serialization namespace inside user code then we - // must bring the all the members decorated with [Data[Contract|Member]] attributes from the SDK - var members = ApplyPreserveAttribute.DataContract; - foreach (var member in members) - MarkMetadata (member); - members.Clear (); - break; - case "System.Xml.Serialization": - if (system_xml_serialization) - break; - switch (type.Name) { - case "XmlIgnoreAttribute": - break; - default: - // if we're keeping this assembly and use the Serialization namespace inside user code - // then we must bring the all the members decorated with [Xml*] attributes from the SDK - system_xml_serialization = true; - members = ApplyPreserveAttribute.XmlSerialization; - foreach (var member in members) - MarkMetadata (member); - members.Clear (); - break; - } - break; - } - } - - protected virtual IMetadataTokenProvider FilterExtraSerializationMembers (IMetadataTokenProvider provider) - { - return provider; - } - - void MarkMetadata (IMetadataTokenProvider tp) - { - var provider = FilterExtraSerializationMembers (tp); - if (provider == null) - return; - - TypeReference tr = (provider as TypeReference); - if (tr != null) { - PreserveType (tr.Resolve ()); - return; - } - MethodReference mr = (provider as MethodReference); - if (mr != null) { - PreserveMethod (mr.Resolve ()); - return; - } - PropertyDefinition pd = (provider as PropertyDefinition); - if (pd != null) { - if (pd.GetMethod != null) - PreserveMethod (pd.GetMethod); - if (pd.SetMethod != null) - PreserveMethod (pd.SetMethod); - return; - } - // TODO: we should unify this code with xamarin-macios MobileMarkStep - // once we move this code to mark step, we should mark events, fields and properties - } - - protected void PreserveConstructors (TypeDefinition type) - { - if ((type == null) || !type.HasMethods) - return; - foreach (MethodDefinition ctor in type.Methods) { - if (ctor.IsConstructor) - PreserveMethod (type, ctor); - } - } - - protected AssemblyDefinition GetAssembly (string assemblyName) - { - AssemblyDefinition ad; - context.TryGetLinkedAssembly (assemblyName, out ad); - return ad; - } - - protected TypeDefinition GetType (string assemblyName, string typeName) - { - AssemblyDefinition ad = GetAssembly (assemblyName); - return ad == null ? null : GetType (ad, typeName); - } - - protected TypeDefinition GetType (AssemblyDefinition assembly, string typeName) - { - return assembly.MainModule.GetType (typeName); - } - - void PreserveMethods (TypeDefinition type) - { - if (type == null) - return; - - if (!type.HasMethods) - return; - - foreach (MethodDefinition method in type.Methods) - PreserveMethod (type, method); - } - - void PreserveMethod (TypeDefinition type, MethodDefinition method) - { - Annotations.AddPreservedMethod (type, method); - } - - void PreserveMethod (MethodDefinition md) - { - if (md == null) - return; - if (md.DeclaringType == null) - return; - - PreserveMethod (md.DeclaringType, md); - } - - void PreserveType (TypeDefinition type) - { - if (type != null) - Annotations.SetPreserve (type, Mono.Linker.TypePreserve.All); - } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveTlsProvider.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveTlsProvider.cs deleted file mode 100644 index 043b47805d3..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveTlsProvider.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using Mono.Cecil; -using Mono.Cecil.Cil; -using Mono.Tuner; - -namespace MonoDroid.Tuner -{ - public class PreserveTlsProvider : BaseSubStep - { - public string TlsProvider { get; set; } - - public override bool IsActiveFor (AssemblyDefinition assembly) - { - return TlsProvider != null && assembly.Name.Name == "System"; - } - - public override SubStepTargets Targets { - get { return SubStepTargets.Method; } - } - - public override void ProcessMethod (MethodDefinition method) - { - if (method.Name == "CreateDefaultProviderImpl" && method.DeclaringType.FullName == "Mono.Net.Security.MonoTlsProviderFactory") - ProcessCreateProviderImpl (method); - } - - TypeDefinition GetTlsProvider (ModuleDefinition module) - { - string provider; - if (string.IsNullOrEmpty (TlsProvider)) - provider = "default"; - else - provider = TlsProvider; - - TypeDefinition type; - switch (provider) { - case "legacy": - case "default": - case "btls": - type = module.GetType ("Mono.Btls.MonoBtlsProvider"); - break; - default: - throw new InvalidOperationException (string.Format ("Unknown TlsProvider `{0}`.", provider)); - } - if (type == null) - throw new InvalidOperationException (string.Format ("Cannot load TlsProvider `{0}`.", provider)); - return type; - } - - MethodDefinition FindDefaultCtor (TypeDefinition type) - { - foreach (var m in type.Methods) { - if (m.IsStatic || !m.IsConstructor || m.HasParameters) - continue; - return m; - } - return null; - } - - MethodReference FindProviderConstructor (ModuleDefinition module) - { - var providerType = GetTlsProvider (module); - if (providerType == null) - return null; - - var ctor = FindDefaultCtor (providerType); - if (ctor == null) - throw new InvalidOperationException (); - - return module.ImportReference (ctor); - } - - void ProcessCreateProviderImpl (MethodDefinition method) - { - var providerCtor = FindProviderConstructor (method.Module); - if (providerCtor == null) - return; - - // re-write MonoTlsProviderFactory.CreateDefaultProviderImpl() - var body = new MethodBody (method); - var il = body.GetILProcessor (); - if (providerCtor != null) - il.Emit (OpCodes.Newobj, providerCtor); - else - il.Emit (OpCodes.Ldnull); - il.Emit (OpCodes.Ret); - method.Body = body; - } - } -} - diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveTypeConverters.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveTypeConverters.cs deleted file mode 100644 index 5aebdeb809e..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveTypeConverters.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Linq; - -using Mono.Linker; - -using Mono.Cecil; - -namespace Mono.Tuner { - - public class PreserveTypeConverters : BaseSubStep { - - public override SubStepTargets Targets { - get { return SubStepTargets.Type; } - } - - public override bool IsActiveFor (AssemblyDefinition assembly) - { - return Annotations.GetAction (assembly) == AssemblyAction.Link; - } - - public override void ProcessType (TypeDefinition type) - { - if (IsTypeConverter (type)) - PreserveTypeConverter (type); - } - - void PreserveTypeConverter (TypeDefinition type) - { - if (!type.HasMethods) - return; - - foreach (MethodDefinition ctor in type.Methods.Where (m => m.IsConstructor)) { - // We only care about ctors with 0 or 1 params. - if (ctor.HasParameters && ctor.Parameters.Count > 1) - continue; - - Annotations.AddPreservedMethod (type, ctor); - } - } - - static bool IsTypeConverter (TypeDefinition type) - { - return type.Inherits ("System.ComponentModel", "TypeConverter"); - } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/RemoveAttributes.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/RemoveAttributes.cs deleted file mode 100644 index 6dd75b8fee7..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/RemoveAttributes.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; - -using Mono.Linker; -using Mono.Linker.Steps; - -using Mono.Tuner; -using Mobile.Tuner; - -using Mono.Cecil; - -namespace MonoDroid.Tuner { - - public class RemoveAttributes : RemoveAttributesBase { - - protected virtual bool DebugBuild { - get { -#if ILLINK - return true; -#else - return context.LinkSymbols; -#endif - } - } - - protected override bool IsRemovedAttribute (CustomAttribute attribute) - { - // note: this also avoid calling FullName (which allocates a string) - var attr_type = attribute.Constructor.DeclaringType; - switch (attr_type.Name) { - case "IntDefinitionAttribute": - return attr_type.Namespace == "Android.Runtime"; - case "ObsoleteAttribute": - // System.Mono*Attribute from mono/mcs/build/common/MonoTODOAttribute.cs - case "MonoDocumentationNoteAttribute": - case "MonoExtensionAttribute": - case "MonoInternalNoteAttribute": - case "MonoLimitationAttribute": - case "MonoNotSupportedAttribute": - case "MonoTODOAttribute": - return attr_type.Namespace == "System"; - case "MonoFIXAttribute": - return attr_type.Namespace == "System.Xml"; - // remove debugging-related attributes if we're not linking symbols (i.e. we're building release builds) - case "DebuggableAttribute": - case "DebuggerBrowsableAttribute": - case "DebuggerDisplayAttribute": - case "DebuggerHiddenAttribute": - case "DebuggerNonUserCodeAttribute": - case "DebuggerStepperBoundaryAttribute": - case "DebuggerStepThroughAttribute": - case "DebuggerTypeProxyAttribute": - case "DebuggerVisualizerAttribute": - return !DebugBuild && attr_type.Namespace == "System.Diagnostics"; - case "NullableContextAttribute": - case "NullableAttribute": - return attr_type.Namespace == "System.Runtime.CompilerServices"; - case "AllowNullAttribute": - case "MaybeNullAttribute": - case "NotNullAttribute": - case "NotNullWhenAttribute": - case "NotNullIfNotNullAttribute": - return attr_type.Namespace == "System.Diagnostics.CodeAnalysis"; - default: - return false; - } - } - } -} diff --git a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/Java.Interop.xml b/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/Java.Interop.xml deleted file mode 100644 index bfb2cfa1802..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/Java.Interop.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/Mono.Android.xml b/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/Mono.Android.xml deleted file mode 100644 index dbcd130d347..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/Mono.Android.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/OpenTK.xml b/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/OpenTK.xml deleted file mode 100644 index 9628ddfb3d7..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/OpenTK.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/System.Data.Services.Client.xml b/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/System.Data.Services.Client.xml deleted file mode 100644 index 680504f600a..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/System.Data.Services.Client.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/System.ServiceModel.xml b/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/System.ServiceModel.xml deleted file mode 100644 index 122a4f7d7db..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/System.ServiceModel.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/mscorlib.xml b/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/mscorlib.xml deleted file mode 100644 index 81eb96a882d..00000000000 --- a/src/Xamarin.Android.Build.Tasks/Linker/PreserveLists/mscorlib.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj index 5943aba404e..00ba3040e32 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj @@ -192,24 +192,6 @@ MonoRuntimeProvider.Bundled.20.java - - Java.Interop.xml - - - mscorlib.xml - - - System.Data.Services.Client.xml - - - System.ServiceModel.xml - - - OpenTK.xml - - - Mono.Android.xml - proguard_xamarin.cfg