diff --git a/src/Mono.Android/ILLink/ILLink.Substitutions.xml b/src/Mono.Android/ILLink/ILLink.Substitutions.xml new file mode 100644 index 00000000000..8259197e735 --- /dev/null +++ b/src/Mono.Android/ILLink/ILLink.Substitutions.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/Mono.Android/Java.Interop/TypeManager.cs b/src/Mono.Android/Java.Interop/TypeManager.cs index 2a8be4c2f81..83efa9f6ee5 100644 --- a/src/Mono.Android/Java.Interop/TypeManager.cs +++ b/src/Mono.Android/Java.Interop/TypeManager.cs @@ -212,6 +212,10 @@ static Exception CreateJavaLocationException () [MethodImplAttribute(MethodImplOptions.InternalCall)] static extern Type monodroid_typemap_java_to_managed (string java_type_name); + static bool TypeRegistrationFallbackIsEnabled { get; } = InitializeTypeRegistrationFallbackIsEnabled (); + static bool InitializeTypeRegistrationFallbackIsEnabled () => + !AppContext.TryGetSwitch ("Java.Interop.TypeManager.TypeRegistrationFallbackIsEnabled", out bool isEnabled) || isEnabled; + internal static Type? GetJavaToManagedType (string class_name) { Type? type = monodroid_typemap_java_to_managed (class_name); @@ -225,10 +229,18 @@ static Exception CreateJavaLocationException () return null; } + if (TypeRegistrationFallbackIsEnabled) + return TypeRegistrationFallback (class_name); + + return null; + } + + internal static Type? TypeRegistrationFallback (string class_name) + { __TypeRegistrations.RegisterPackages (); - type = null; - int ls = class_name.LastIndexOf ('/'); + Type? type = null; + int ls = class_name.LastIndexOf ('/'); var package = ls >= 0 ? class_name.Substring (0, ls) : ""; if (packageLookup.TryGetValue (package, out var mappers)) { foreach (Converter c in mappers) { @@ -353,10 +365,18 @@ public static void RegisterType (string java_class, Type t) } } - static Dictionary>> packageLookup = new Dictionary>> (); + static Dictionary>>? packageLookup; + + static void LazyInitPackageLookup () + { + if (packageLookup == null) + packageLookup = new Dictionary>> (StringComparer.Ordinal); + } public static void RegisterPackage (string package, Converter lookup) { + LazyInitPackageLookup (); + lock (packageLookup) { if (!packageLookup.TryGetValue (package, out var lookups)) packageLookup.Add (package, lookups = new List> ()); @@ -366,6 +386,8 @@ public static void RegisterPackage (string package, Converter look public static void RegisterPackages (string[] packages, Converter[] lookups) { + LazyInitPackageLookup (); + if (packages == null) throw new ArgumentNullException ("packages"); if (lookups == null) diff --git a/src/Mono.Android/Mono.Android.csproj b/src/Mono.Android/Mono.Android.csproj index b9d9a31829d..de41c74ec0c 100644 --- a/src/Mono.Android/Mono.Android.csproj +++ b/src/Mono.Android/Mono.Android.csproj @@ -97,6 +97,9 @@ ILLink.LinkAttributes.xml + + ILLink.Substitutions.xml + diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets index 1eff7609be6..902ab5222ce 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.ILLink.targets @@ -22,6 +22,7 @@ This file contains the .NET 5-specific targets to customize ILLink true false false + false +