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
+