Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[linker] preserve interfaces on Java types #7204

Merged
merged 3 commits into from
Sep 13, 2022

Conversation

jonathanpeppers
Copy link
Member

@jonathanpeppers jonathanpeppers commented Jul 25, 2022

Fixes: #7097
Context: https://github.com/xamarin/monodroid/commit/a619cbea33e1b7cd8ffd0352bb37ac551d324f67

Usage of a Google.Android.Material.TextField.TextInputEditText:

var filterBox = FindViewById<TextInputEditText>(Resource.Id.filterBox);
filterBox.TextChanged += (s, e) => { };

Crashes at runtime with:

android.runtime.JavaProxyThrowable: System.TypeLoadException: Could not load type '{0}' from assembly '{1}'., Android.Text.ITextWatcherInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
    at System.RuntimeTypeHandle.GetTypeByName(String , Boolean , Boolean , StackCrawlMark& , Boolean )
    at System.RuntimeType.GetType(String , Boolean , Boolean , StackCrawlMark& )
    at System.Type.GetType(String , Boolean )
    at Android.Runtime.AndroidTypeManager.RegisterNativeMembers(JniType , Type , ReadOnlySpan`1 )
--- End of stack trace from previous location ---
    at Java.Interop.JniEnvironment.StaticMethods.CallStaticObjectMethod(JniObjectReference , JniMethodInfo , JniArgumentValue* )
    at Android.Runtime.JNIEnv.FindClass(String )
    at Android.Runtime.JNIEnv.AllocObject(String )
    at Android.Runtime.JNIEnv.StartCreateInstance(String , String , JValue* )
    at Android.Runtime.JNIEnv.StartCreateInstance(String , String , JValue[] )
    at Android.Text.TextWatcherImplementor..ctor(Object , EventHandler`1 , EventHandler`1 , EventHandler`1 )
    at Android.Widget.TextView.add_TextChanged(EventHandler`1 )
    at AndroidApp1.MainActivity.OnCreate(Bundle savedInstanceState)
    at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(IntPtr , IntPtr , IntPtr )
    at Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPL_V(_JniMarshal_PPL_V , IntPtr , IntPtr , IntPtr )
    at crc64a6e0c00971f6cd91.MainActivity.n_onCreate(Native Method)
    at crc64a6e0c00971f6cd91.MainActivity.onCreate(MainActivity.java:29)

The problem being that the linker completely removed the
ITextWatcher interface, and the
Android.Text.TextWatcherImplementor type no longer implemented that
interface.

It appears we should preserve interfaces in .NET 6 for Java types
except if the type defines:

[Android.Runtime.Register (DoNotGenerateAcw = true)]

This is on types like Android.App.Activity where we would not need
to preserve all the interfaces.

However, types like TextWatcherImplementor would get their
interfaces preserved appropriately.

@jonpryor
Copy link
Member

I'm still confused, overall. What is so special about Google.Android.Material.TextField.TextInputEditText that it breaks things, while "just" using EditText appears to work (4d8c28f)?

How did 4d8c28f manage to fix the original issue #3263 when it now looks like the problem is around *Implementor types, which were not changed in 4d8c28f?

@jonathanpeppers jonathanpeppers force-pushed the MaterialTextChanged branch 2 times, most recently from 91efce1 to ffaa55e Compare August 1, 2022 16:42
@jonpryor
Copy link
Member

@jonathanpeppers wrote:

So perhaps this is marking "too many" interfaces? Like maybe it's preserving ones that aren't used at all?

A diff would be useful. What types are now preserved after this change?

@jonpryor
Copy link
Member

@jonathanpeppers did the wonderful work to get the output of monodis --typedef for the linked Mono.Android.dll from BuildReleaseArm64SimpleDotNet for a main build (types_main.txt) and a build with this PR applied (types.txt):

types_main.txt
Typedef Table
1: (null) (flist=1, mlist=1, flags=0x0, extends=0x0)
2: _JniMarshal_PP_I (flist=1, mlist=1, flags=0x100, extends=0x5)
3: _JniMarshal_PP_J (flist=1, mlist=3, flags=0x100, extends=0x5)
4: _JniMarshal_PP_L (flist=1, mlist=5, flags=0x100, extends=0x5)
5: _JniMarshal_PP_V (flist=1, mlist=7, flags=0x100, extends=0x5)
6: _JniMarshal_PP_Z (flist=1, mlist=9, flags=0x100, extends=0x5)
7: _JniMarshal_PPI_I (flist=1, mlist=11, flags=0x100, extends=0x5)
8: _JniMarshal_PPI_J (flist=1, mlist=13, flags=0x100, extends=0x5)
9: _JniMarshal_PPI_L (flist=1, mlist=15, flags=0x100, extends=0x5)
10: _JniMarshal_PPI_V (flist=1, mlist=17, flags=0x100, extends=0x5)
11: _JniMarshal_PPII_V (flist=1, mlist=19, flags=0x100, extends=0x5)
12: _JniMarshal_PPIII_V (flist=1, mlist=21, flags=0x100, extends=0x5)
13: _JniMarshal_PPIIII_V (flist=1, mlist=23, flags=0x100, extends=0x5)
14: _JniMarshal_PPIIL_V (flist=1, mlist=25, flags=0x100, extends=0x5)
15: _JniMarshal_PPIL_Z (flist=1, mlist=27, flags=0x100, extends=0x5)
16: _JniMarshal_PPILL_V (flist=1, mlist=29, flags=0x100, extends=0x5)
17: _JniMarshal_PPJ_L (flist=1, mlist=31, flags=0x100, extends=0x5)
18: _JniMarshal_PPJ_Z (flist=1, mlist=33, flags=0x100, extends=0x5)
19: _JniMarshal_PPL_I (flist=1, mlist=35, flags=0x100, extends=0x5)
20: _JniMarshal_PPL_L (flist=1, mlist=37, flags=0x100, extends=0x5)
21: _JniMarshal_PPL_V (flist=1, mlist=39, flags=0x100, extends=0x5)
22: _JniMarshal_PPL_Z (flist=1, mlist=41, flags=0x100, extends=0x5)
23: _JniMarshal_PPLF_V (flist=1, mlist=43, flags=0x100, extends=0x5)
24: _JniMarshal_PPLI_L (flist=1, mlist=45, flags=0x100, extends=0x5)
25: _JniMarshal_PPLI_V (flist=1, mlist=47, flags=0x100, extends=0x5)
26: _JniMarshal_PPLII_I (flist=1, mlist=49, flags=0x100, extends=0x5)
27: _JniMarshal_PPLII_V (flist=1, mlist=51, flags=0x100, extends=0x5)
28: _JniMarshal_PPLII_Z (flist=1, mlist=53, flags=0x100, extends=0x5)
29: _JniMarshal_PPLIIII_V (flist=1, mlist=55, flags=0x100, extends=0x5)
30: _JniMarshal_PPLIIIIIIII_V (flist=1, mlist=57, flags=0x100, extends=0x5)
31: _JniMarshal_PPLIL_Z (flist=1, mlist=59, flags=0x100, extends=0x5)
32: _JniMarshal_PPLL_L (flist=1, mlist=61, flags=0x100, extends=0x5)
33: _JniMarshal_PPLL_V (flist=1, mlist=63, flags=0x100, extends=0x5)
34: _JniMarshal_PPLL_Z (flist=1, mlist=65, flags=0x100, extends=0x5)
35: _JniMarshal_PPLLJ_Z (flist=1, mlist=67, flags=0x100, extends=0x5)
36: _JniMarshal_PPLLL_L (flist=1, mlist=69, flags=0x100, extends=0x5)
37: _JniMarshal_PPLLL_V (flist=1, mlist=71, flags=0x100, extends=0x5)
38: _JniMarshal_PPLLL_Z (flist=1, mlist=73, flags=0x100, extends=0x5)
39: _JniMarshal_PPLLLL_V (flist=1, mlist=75, flags=0x100, extends=0x5)
40: _JniMarshal_PPLZ_V (flist=1, mlist=77, flags=0x100, extends=0x5)
41: _JniMarshal_PPLZZL_Z (flist=1, mlist=79, flags=0x100, extends=0x5)
42: _JniMarshal_PPZIIII_V (flist=1, mlist=81, flags=0x100, extends=0x5)
43: Android.Views.ContextThemeWrapper (flist=1, mlist=83, flags=0x100001, extends=0xdc)
44: Android.OS.BaseBundle (flist=2, mlist=88, flags=0x100001, extends=0x1a0)
45: Android.OS.Bundle (flist=3, mlist=93, flags=0x100101, extends=0xb0)
46: Android.OS.Handler (flist=4, mlist=98, flags=0x100001, extends=0x1a0)
47: Android.OS.Looper (flist=5, mlist=106, flags=0x100001, extends=0x1a0)
48: Android.App.ActivityAttribute (flist=6, mlist=113, flags=0x102101, extends=0x41)
49: Android.App.Activity (flist=9, mlist=117, flags=0x100001, extends=0xac)
50: Android.App.Application (flist=12, mlist=129, flags=0x100001, extends=0xdc)
51: Android.App.SyncContext (flist=14, mlist=135, flags=0x100000, extends=0x55)
52: Android.App.SyncContext/<>c__DisplayClass3_0 (flist=14, mlist=138, flags=0x100103, extends=0x31)
53: Android.Content.Context (flist=17, mlist=140, flags=0x100081, extends=0x1a0)
54: Android.Content.ContextInvoker (flist=18, mlist=145, flags=0x100000, extends=0xd4)
55: Android.Content.ContextWrapper (flist=19, mlist=149, flags=0x100001, extends=0xd4)
56: Android.Runtime.DynamicMethodNameCounter (flist=20, mlist=154, flags=0x100000, extends=0x31)
57: Android.Runtime.IJavaObjectValueMarshaler (flist=21, mlist=155, flags=0x100100, extends=0x6)
58: Android.Runtime.RegisterAttribute (flist=21, mlist=158, flags=0x100101, extends=0x41)
59: Android.Runtime.AndroidEnvironment (flist=26, mlist=170, flags=0x100181, extends=0x31)
60: Android.Runtime.AndroidRuntime (flist=29, mlist=176, flags=0x100000, extends=0xad)
61: Android.Runtime.AndroidRuntimeOptions (flist=29, mlist=179, flags=0x100000, extends=0xb1)
62: Android.Runtime.AndroidObjectReferenceManager (flist=29, mlist=180, flags=0x100000, extends=0xc5)
63: Android.Runtime.AndroidTypeManager (flist=29, mlist=193, flags=0x100000, extends=0xc9)
64: Android.Runtime.AndroidTypeManager/JniRemappingReplacementMethod (flist=32, mlist=210, flags=0x10010b, extends=0x131)
65: Android.Runtime.AndroidTypeManager/GetCallbackHandler (flist=35, mlist=210, flags=0x103, extends=0x5)
66: Android.Runtime.AndroidTypeManager/MagicRegistrationMap (flist=35, mlist=212, flags=0x3, extends=0x31)
67: Android.Runtime.AndroidTypeManager/<GetTypesForSimpleReference>d__3 (flist=36, mlist=217, flags=0x100103, extends=0x31)
68: Android.Runtime.AndroidValueManager (flist=43, mlist=223, flags=0x100000, extends=0xb5)
69: Android.Runtime.IdentityHashTargets (flist=44, mlist=237, flags=0x100000, extends=0x31)
70: Android.Runtime.AnnotationAttribute (flist=46, mlist=244, flags=0x100001, extends=0x41)
71: Android.Runtime.BoundExceptionType (flist=47, mlist=247, flags=0x100, extends=0x16d)
72: Android.Runtime.IJavaObject (flist=50, mlist=247, flags=0xa1, extends=0x0)
73: Android.Runtime.InputStreamAdapter (flist=50, mlist=248, flags=0x100101, extends=0x1bc)
74: Android.Runtime.InputStreamInvoker (flist=51, mlist=256, flags=0x100001, extends=0x175)
75: Android.Runtime.JavaProxyThrowable (flist=53, mlist=275, flags=0x100000, extends=0x190)
76: Android.Runtime.JnienvInitializeArgs (flist=54, mlist=277, flags=0x100108, extends=0x131)
77: Android.Runtime.JNIEnv (flist=72, mlist=277, flags=0x100181, extends=0x31)
78: Android.Runtime.JNIEnv/<>c (flist=98, mlist=379, flags=0x102103, extends=0x31)
79: Android.Runtime.JniHandleOwnership (flist=126, mlist=408, flags=0x101, extends=0x16d)
80: Android.Runtime.JNINativeWrapper (flist=131, mlist=408, flags=0x100181, extends=0x31)
81: Android.Runtime.JObjectRefType (flist=133, mlist=450, flags=0x100, extends=0x16d)
82: Android.Runtime.JValue (flist=138, mlist=450, flags=0x100111, extends=0x131)
83: Android.Runtime.Logger (flist=148, mlist=461, flags=0x180, extends=0x31)
84: Android.Runtime.LogLevel (flist=150, mlist=474, flags=0x100, extends=0x16d)
85: Android.Runtime.LogCategories (flist=160, mlist=474, flags=0x100, extends=0x16d)
86: Android.Runtime.NamespaceMappingAttribute (flist=172, mlist=474, flags=0x100001, extends=0x41)
87: Android.Runtime.OutputStreamAdapter (flist=174, mlist=479, flags=0x100001, extends=0x1c8)
88: Android.Runtime.OutputStreamInvoker (flist=175, mlist=488, flags=0x100001, extends=0x175)
89: Android.Runtime.PreserveAttribute (flist=176, mlist=506, flags=0x100101, extends=0x41)
90: Android.Runtime.RaiseThrowableEventArgs (flist=178, mlist=507, flags=0x100001, extends=0x229)
91: Android.Runtime.ResourceDesignerAttribute (flist=180, mlist=512, flags=0x100001, extends=0x41)
92: Android.Runtime.ResourceIdManager (flist=182, mlist=517, flags=0x100181, extends=0x31)
93: Android.Runtime.TypeManager (flist=183, mlist=519, flags=0x100181, extends=0x31)
94: Android.Runtime.XAPeerMembers (flist=183, mlist=523, flags=0x100001, extends=0x9)
95: Java.Nio.Channels.FileChannel (flist=184, mlist=529, flags=0x100081, extends=0x184)
96: Java.Nio.Channels.FileChannelInvoker (flist=188, mlist=543, flags=0x100000, extends=0x17c)
97: Java.Nio.Channels.Spi.AbstractInterruptibleChannel (flist=189, mlist=550, flags=0x100081, extends=0x1a0)
98: Java.Nio.Channels.Spi.AbstractInterruptibleChannelInvoker (flist=190, mlist=555, flags=0x100000, extends=0x184)
99: Java.Lang.Class (flist=191, mlist=559, flags=0x101, extends=0x1a0)
100: Java.Lang.Error (flist=196, mlist=565, flags=0x100001, extends=0x1b4)
101: Java.Lang.Exception (flist=197, mlist=571, flags=0x100001, extends=0x1b4)
102: Java.Lang.IRunnable (flist=198, mlist=577, flags=0xa1, extends=0x0)
103: Java.Lang.IRunnableInvoker (flist=198, mlist=578, flags=0x100000, extends=0x1a0)
104: Java.Lang.Object (flist=202, mlist=589, flags=0x102001, extends=0x31)
105: Java.Lang.String (flist=212, mlist=630, flags=0x100101, extends=0x1a0)
106: Java.Lang.String/<GetEnumerator>d__102 (flist=213, mlist=639, flags=0x100103, extends=0x31)
107: Java.Lang.Thread (flist=217, mlist=643, flags=0x100001, extends=0x1a0)
108: Java.Lang.Thread/RunnableImplementor (flist=219, mlist=651, flags=0x100105, extends=0x1a0)
109: Java.Lang.Throwable (flist=222, mlist=654, flags=0x100001, extends=0xa5)
110: Java.IO.FileInputStream (flist=236, mlist=696, flags=0x100001, extends=0x1bc)
111: Java.IO.InputStream (flist=239, mlist=707, flags=0x100081, extends=0x1a0)
112: Java.IO.InputStreamInvoker (flist=244, mlist=724, flags=0x100000, extends=0x1bc)
113: Java.IO.IOException (flist=245, mlist=729, flags=0x100001, extends=0x194)
114: Java.IO.OutputStream (flist=246, mlist=735, flags=0x100081, extends=0x1a0)
115: Java.IO.OutputStreamInvoker (flist=252, mlist=755, flags=0x100000, extends=0x1c8)
116: Java.IO.PrintWriter (flist=253, mlist=760, flags=0x100001, extends=0x1d8)
117: Java.IO.StringWriter (flist=254, mlist=766, flags=0x100001, extends=0x1d8)
118: Java.IO.Writer (flist=255, mlist=772, flags=0x100081, extends=0x1a0)
119: Java.IO.WriterInvoker (flist=256, mlist=777, flags=0x100000, extends=0x1d8)
120: Java.Interop.ExportParameterAttribute (flist=257, mlist=781, flags=0x102001, extends=0x41)
121: Java.Interop.ExportParameterKind (flist=257, mlist=782, flags=0x101, extends=0x16d)
122: Java.Interop.IJniNameProviderAttribute (flist=263, mlist=782, flags=0xa1, extends=0x0)
123: Java.Interop.IJavaObjectEx (flist=263, mlist=783, flags=0xa0, extends=0x0)
124: Java.Interop.JavaLocationException (flist=263, mlist=789, flags=0x100000, extends=0xa5)
125: Java.Interop.JavaObjectExtensions (flist=264, mlist=791, flags=0x100181, extends=0x31)
126: Java.Interop.Runtime (flist=264, mlist=792, flags=0x100181, extends=0x31)
127: Java.Interop.TypeManagerMapDictionaries (flist=264, mlist=794, flags=0x100180, extends=0x31)
128: Java.Interop.TypeManager (flist=267, mlist=797, flags=0x100181, extends=0x31)
129: Java.Interop.TypeManager/TypeNameComparer (flist=271, mlist=817, flags=0x100003, extends=0x31)
130: Java.Interop.TypeManager/JavaTypeManager (flist=271, mlist=819, flags=0x100005, extends=0x1a0)
131: Java.Interop.Tools.JavaCallableWrappers.Crc64Helper (flist=271, mlist=822, flags=0x100180, extends=0x31)
132: Java.Interop.Tools.TypeNameMappings.PackageNamingPolicy (flist=272, mlist=825, flags=0x100, extends=0x16d)
133: Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager (flist=278, mlist=825, flags=0x100180, extends=0x31)
134: Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager/<>c (flist=279, mlist=847, flags=0x102103, extends=0x31)
135: <PrivateImplementationDetails> (flist=292, mlist=861, flags=0x100100, extends=0x31)
136: <PrivateImplementationDetails>/__StaticArrayInitTypeSize=16384 (flist=293, mlist=862, flags=0x113, extends=0x131)
types.txt
Typedef Table
1: (null) (flist=1, mlist=1, flags=0x0, extends=0x0)
2: _JniMarshal_PP_B (flist=1, mlist=1, flags=0x100, extends=0x5)
3: _JniMarshal_PP_C (flist=1, mlist=3, flags=0x100, extends=0x5)
4: _JniMarshal_PP_D (flist=1, mlist=5, flags=0x100, extends=0x5)
5: _JniMarshal_PP_F (flist=1, mlist=7, flags=0x100, extends=0x5)
6: _JniMarshal_PP_I (flist=1, mlist=9, flags=0x100, extends=0x5)
7: _JniMarshal_PP_J (flist=1, mlist=11, flags=0x100, extends=0x5)
8: _JniMarshal_PP_L (flist=1, mlist=13, flags=0x100, extends=0x5)
9: _JniMarshal_PP_S (flist=1, mlist=15, flags=0x100, extends=0x5)
10: _JniMarshal_PP_V (flist=1, mlist=17, flags=0x100, extends=0x5)
11: _JniMarshal_PP_Z (flist=1, mlist=19, flags=0x100, extends=0x5)
12: _JniMarshal_PPC_L (flist=1, mlist=21, flags=0x100, extends=0x5)
13: _JniMarshal_PPCC_L (flist=1, mlist=23, flags=0x100, extends=0x5)
14: _JniMarshal_PPCCII_L (flist=1, mlist=25, flags=0x100, extends=0x5)
15: _JniMarshal_PPCI_L (flist=1, mlist=27, flags=0x100, extends=0x5)
16: _JniMarshal_PPI_C (flist=1, mlist=29, flags=0x100, extends=0x5)
17: _JniMarshal_PPI_I (flist=1, mlist=31, flags=0x100, extends=0x5)
18: _JniMarshal_PPI_J (flist=1, mlist=33, flags=0x100, extends=0x5)
19: _JniMarshal_PPI_L (flist=1, mlist=35, flags=0x100, extends=0x5)
20: _JniMarshal_PPI_V (flist=1, mlist=37, flags=0x100, extends=0x5)
21: _JniMarshal_PPIF_F (flist=1, mlist=39, flags=0x100, extends=0x5)
22: _JniMarshal_PPII_I (flist=1, mlist=41, flags=0x100, extends=0x5)
23: _JniMarshal_PPII_L (flist=1, mlist=43, flags=0x100, extends=0x5)
24: _JniMarshal_PPII_V (flist=1, mlist=45, flags=0x100, extends=0x5)
25: _JniMarshal_PPII_Z (flist=1, mlist=47, flags=0x100, extends=0x5)
26: _JniMarshal_PPIII_V (flist=1, mlist=49, flags=0x100, extends=0x5)
27: _JniMarshal_PPIIII_L (flist=1, mlist=51, flags=0x100, extends=0x5)
28: _JniMarshal_PPIIII_V (flist=1, mlist=53, flags=0x100, extends=0x5)
29: _JniMarshal_PPIIIL_L (flist=1, mlist=55, flags=0x100, extends=0x5)
30: _JniMarshal_PPIIILLLIL_I (flist=1, mlist=57, flags=0x100, extends=0x5)
31: _JniMarshal_PPIIL_V (flist=1, mlist=59, flags=0x100, extends=0x5)
32: _JniMarshal_PPIIL_Z (flist=1, mlist=61, flags=0x100, extends=0x5)
33: _JniMarshal_PPIL_V (flist=1, mlist=63, flags=0x100, extends=0x5)
34: _JniMarshal_PPIL_Z (flist=1, mlist=65, flags=0x100, extends=0x5)
35: _JniMarshal_PPILI_I (flist=1, mlist=67, flags=0x100, extends=0x5)
36: _JniMarshal_PPILI_Z (flist=1, mlist=69, flags=0x100, extends=0x5)
37: _JniMarshal_PPILL_V (flist=1, mlist=71, flags=0x100, extends=0x5)
38: _JniMarshal_PPILL_Z (flist=1, mlist=73, flags=0x100, extends=0x5)
39: _JniMarshal_PPIZ_V (flist=1, mlist=75, flags=0x100, extends=0x5)
40: _JniMarshal_PPIZ_Z (flist=1, mlist=77, flags=0x100, extends=0x5)
41: _JniMarshal_PPIZI_L (flist=1, mlist=79, flags=0x100, extends=0x5)
42: _JniMarshal_PPIZZ_V (flist=1, mlist=81, flags=0x100, extends=0x5)
43: _JniMarshal_PPJ_L (flist=1, mlist=83, flags=0x100, extends=0x5)
44: _JniMarshal_PPJ_Z (flist=1, mlist=85, flags=0x100, extends=0x5)
45: _JniMarshal_PPL_I (flist=1, mlist=87, flags=0x100, extends=0x5)
46: _JniMarshal_PPL_J (flist=1, mlist=89, flags=0x100, extends=0x5)
47: _JniMarshal_PPL_L (flist=1, mlist=91, flags=0x100, extends=0x5)
48: _JniMarshal_PPL_V (flist=1, mlist=93, flags=0x100, extends=0x5)
49: _JniMarshal_PPL_Z (flist=1, mlist=95, flags=0x100, extends=0x5)
50: _JniMarshal_PPLF_V (flist=1, mlist=97, flags=0x100, extends=0x5)
51: _JniMarshal_PPLFF_Z (flist=1, mlist=99, flags=0x100, extends=0x5)
52: _JniMarshal_PPLFFZ_Z (flist=1, mlist=101, flags=0x100, extends=0x5)
53: _JniMarshal_PPLI_L (flist=1, mlist=103, flags=0x100, extends=0x5)
54: _JniMarshal_PPLI_V (flist=1, mlist=105, flags=0x100, extends=0x5)
55: _JniMarshal_PPLII_I (flist=1, mlist=107, flags=0x100, extends=0x5)
56: _JniMarshal_PPLII_J (flist=1, mlist=109, flags=0x100, extends=0x5)
57: _JniMarshal_PPLII_L (flist=1, mlist=111, flags=0x100, extends=0x5)
58: _JniMarshal_PPLII_V (flist=1, mlist=113, flags=0x100, extends=0x5)
59: _JniMarshal_PPLII_Z (flist=1, mlist=115, flags=0x100, extends=0x5)
60: _JniMarshal_PPLIIII_V (flist=1, mlist=117, flags=0x100, extends=0x5)
61: _JniMarshal_PPLIIIIIIII_V (flist=1, mlist=119, flags=0x100, extends=0x5)
62: _JniMarshal_PPLIIL_V (flist=1, mlist=121, flags=0x100, extends=0x5)
63: _JniMarshal_PPLIL_Z (flist=1, mlist=123, flags=0x100, extends=0x5)
64: _JniMarshal_PPLL_L (flist=1, mlist=125, flags=0x100, extends=0x5)
65: _JniMarshal_PPLL_V (flist=1, mlist=127, flags=0x100, extends=0x5)
66: _JniMarshal_PPLL_Z (flist=1, mlist=129, flags=0x100, extends=0x5)
67: _JniMarshal_PPLLF_F (flist=1, mlist=131, flags=0x100, extends=0x5)
68: _JniMarshal_PPLLI_I (flist=1, mlist=133, flags=0x100, extends=0x5)
69: _JniMarshal_PPLLI_L (flist=1, mlist=135, flags=0x100, extends=0x5)
70: _JniMarshal_PPLLI_V (flist=1, mlist=137, flags=0x100, extends=0x5)
71: _JniMarshal_PPLLI_Z (flist=1, mlist=139, flags=0x100, extends=0x5)
72: _JniMarshal_PPLLJ_V (flist=1, mlist=141, flags=0x100, extends=0x5)
73: _JniMarshal_PPLLJ_Z (flist=1, mlist=143, flags=0x100, extends=0x5)
74: _JniMarshal_PPLLL_L (flist=1, mlist=145, flags=0x100, extends=0x5)
75: _JniMarshal_PPLLL_V (flist=1, mlist=147, flags=0x100, extends=0x5)
76: _JniMarshal_PPLLL_Z (flist=1, mlist=149, flags=0x100, extends=0x5)
77: _JniMarshal_PPLLLI_I (flist=1, mlist=151, flags=0x100, extends=0x5)
78: _JniMarshal_PPLLLL_L (flist=1, mlist=153, flags=0x100, extends=0x5)
79: _JniMarshal_PPLLLL_V (flist=1, mlist=155, flags=0x100, extends=0x5)
80: _JniMarshal_PPLLZ_Z (flist=1, mlist=157, flags=0x100, extends=0x5)
81: _JniMarshal_PPLZ_V (flist=1, mlist=159, flags=0x100, extends=0x5)
82: _JniMarshal_PPLZZL_Z (flist=1, mlist=161, flags=0x100, extends=0x5)
83: _JniMarshal_PPZ_L (flist=1, mlist=163, flags=0x100, extends=0x5)
84: _JniMarshal_PPZ_V (flist=1, mlist=165, flags=0x100, extends=0x5)
85: _JniMarshal_PPZIIII_V (flist=1, mlist=167, flags=0x100, extends=0x5)
86: System.Linq.Extensions (flist=1, mlist=169, flags=0x181, extends=0x9)
87: System.Linq.Extensions/<ToEnumerator_Dispose>d__3 (flist=2, mlist=172, flags=0x100103, extends=0x9)
88: System.Linq.Extensions/<ToEnumerator_Dispose>d__5`1 (flist=6, mlist=178, flags=0x100103, extends=0x9)
89: Android.Window.IOnBackInvokedCallback (flist=10, mlist=184, flags=0xa1, extends=0x0)
90: Android.Window.IOnBackInvokedCallbackInvoker (flist=10, mlist=185, flags=0x100000, extends=0x4dc)
91: Android.Window.IOnBackInvokedDispatcher (flist=14, mlist=196, flags=0xa1, extends=0x0)
92: Android.Window.IOnBackInvokedDispatcherInvoker (flist=14, mlist=198, flags=0x100000, extends=0x4dc)
93: Android.Views.ActionMode (flist=20, mlist=212, flags=0x100081, extends=0x4dc)
94: Android.Views.ActionMode/ICallback (flist=21, mlist=217, flags=0xa2, extends=0x0)
95: Android.Views.ActionMode/ICallbackInvoker (flist=21, mlist=221, flags=0x100005, extends=0x4dc)
96: Android.Views.ActionModeInvoker (flist=31, mlist=241, flags=0x100000, extends=0x174)
97: Android.Views.ActionProvider (flist=32, mlist=245, flags=0x100081, extends=0x4dc)
98: Android.Views.ActionProviderInvoker (flist=33, mlist=250, flags=0x100000, extends=0x184)
99: Android.Views.ContextThemeWrapper (flist=34, mlist=254, flags=0x100001, extends=0x2ec)
100: Android.Views.IContextMenuContextMenuInfo (flist=35, mlist=259, flags=0xa1, extends=0x0)
101: Android.Views.IContextMenuContextMenuInfoInvoker (flist=35, mlist=259, flags=0x100000, extends=0x4dc)
102: Android.Views.IContextMenu (flist=37, mlist=267, flags=0xa1, extends=0x0)
103: Android.Views.IContextMenuInvoker (flist=37, mlist=273, flags=0x100000, extends=0x4dc)
104: Android.Views.IMenu (flist=75, mlist=323, flags=0xa1, extends=0x0)
105: Android.Views.IMenuInvoker (flist=77, mlist=351, flags=0x100000, extends=0x4dc)
106: Android.Views.IMenuItemOnActionExpandListener (flist=127, mlist=431, flags=0xa1, extends=0x0)
107: Android.Views.IMenuItemOnActionExpandListenerInvoker (flist=127, mlist=433, flags=0x100000, extends=0x4dc)
108: Android.Views.IMenuItemOnMenuItemClickListener (flist=133, mlist=447, flags=0xa1, extends=0x0)
109: Android.Views.IMenuItemOnMenuItemClickListenerInvoker (flist=133, mlist=448, flags=0x100000, extends=0x4dc)
110: Android.Views.IMenuItem (flist=137, mlist=459, flags=0xa1, extends=0x0)
111: Android.Views.IMenuItemInvoker (flist=153, mlist=550, flags=0x100000, extends=0x4dc)
112: Android.Views.InputEvent (flist=237, mlist=681, flags=0x100081, extends=0x4dc)
113: Android.Views.InputEventInvoker (flist=240, mlist=692, flags=0x100000, extends=0x1c0)
114: Android.Views.ISubMenu (flist=241, mlist=697, flags=0xa1, extends=0x0)
115: Android.Views.ISubMenuInvoker (flist=241, mlist=706, flags=0x100000, extends=0x4dc)
116: Android.Views.IViewManager (flist=285, mlist=765, flags=0xa1, extends=0x0)
117: Android.Views.IViewManagerInvoker (flist=285, mlist=768, flags=0x100000, extends=0x4dc)
118: Android.Views.IViewParent (flist=293, mlist=785, flags=0xa1, extends=0x0)
119: Android.Views.IViewParentInvoker (flist=296, mlist=836, flags=0x100000, extends=0x4dc)
120: Android.Views.WindowManagerLayoutParams (flist=386, mlist=976, flags=0x100001, extends=0x224)
121: Android.Views.KeyboardShortcutGroup (flist=389, mlist=987, flags=0x100101, extends=0x4dc)
122: Android.Views.KeyEvent (flist=390, mlist=994, flags=0x100001, extends=0x1c0)
123: Android.Views.KeyEvent/ICallback (flist=392, mlist=1002, flags=0xa2, extends=0x0)
124: Android.Views.KeyEvent/ICallbackInvoker (flist=392, mlist=1006, flags=0x100005, extends=0x4dc)
125: Android.Views.LayoutInflater (flist=402, mlist=1026, flags=0x100081, extends=0x4dc)
126: Android.Views.LayoutInflater/IFactory (flist=403, mlist=1031, flags=0xa2, extends=0x0)
127: Android.Views.LayoutInflater/IFactoryInvoker (flist=403, mlist=1032, flags=0x100005, extends=0x4dc)
128: Android.Views.LayoutInflater/IFactory2 (flist=407, mlist=1043, flags=0xa2, extends=0x0)
129: Android.Views.LayoutInflater/IFactory2Invoker (flist=407, mlist=1044, flags=0x100005, extends=0x4dc)
130: Android.Views.LayoutInflaterInvoker (flist=412, mlist=1056, flags=0x100000, extends=0x1f4)
131: Android.Views.MotionEvent (flist=413, mlist=1060, flags=0x100101, extends=0x1c0)
132: Android.Views.SearchEvent (flist=414, mlist=1066, flags=0x100001, extends=0x4dc)
133: Android.Views.View (flist=415, mlist=1071, flags=0x100001, extends=0x4dc)
134: Android.Views.View/IOnCreateContextMenuListener (flist=440, mlist=1151, flags=0xa2, extends=0x0)
135: Android.Views.View/IOnCreateContextMenuListenerInvoker (flist=440, mlist=1152, flags=0x100005, extends=0x4dc)
136: Android.Views.ViewGroup (flist=444, mlist=1163, flags=0x100081, extends=0x214)
137: Android.Views.ViewGroup/LayoutParams (flist=477, mlist=1267, flags=0x100002, extends=0x4dc)
138: Android.Views.ViewGroupInvoker (flist=478, mlist=1273, flags=0x100000, extends=0x220)
139: Android.Views.Window (flist=479, mlist=1277, flags=0x100081, extends=0x4dc)
140: Android.Views.Window/ICallback (flist=480, mlist=1282, flags=0xa2, extends=0x0)
141: Android.Views.Window/ICallbackInvoker (flist=483, mlist=1312, flags=0x100005, extends=0x4dc)
142: Android.Views.WindowInvoker (flist=531, mlist=1389, flags=0x100000, extends=0x22c)
143: Android.Views.ActionModeType (flist=532, mlist=1393, flags=0x101, extends=0x5d)
144: Android.Views.FocusSearchDirection (flist=535, mlist=1393, flags=0x101, extends=0x5d)
145: Android.Views.Keycode (flist=542, mlist=1393, flags=0x101, extends=0x5d)
146: Android.Views.LayoutDirection (flist=848, mlist=1393, flags=0x101, extends=0x5d)
147: Android.Views.MenuAppendFlags (flist=853, mlist=1393, flags=0x101, extends=0x5d)
148: Android.Views.MenuPerformFlags (flist=856, mlist=1393, flags=0x101, extends=0x5d)
149: Android.Views.ScrollAxis (flist=860, mlist=1393, flags=0x101, extends=0x5d)
150: Android.Views.ShowAsAction (flist=864, mlist=1393, flags=0x101, extends=0x5d)
151: Android.Views.TextAlignment (flist=870, mlist=1393, flags=0x101, extends=0x5d)
152: Android.Views.TextDirection (flist=879, mlist=1393, flags=0x101, extends=0x5d)
153: Android.Views.Accessibility.AccessibilityEvent (flist=888, mlist=1393, flags=0x100101, extends=0x268)
154: Android.Views.Accessibility.AccessibilityRecord (flist=889, mlist=1400, flags=0x100001, extends=0x4dc)
155: Android.Views.Accessibility.IAccessibilityEventSource (flist=890, mlist=1405, flags=0xa1, extends=0x0)
156: Android.Views.Accessibility.IAccessibilityEventSourceInvoker (flist=890, mlist=1407, flags=0x100000, extends=0x4dc)
157: Android.Views.Accessibility.Action (flist=896, mlist=1421, flags=0x101, extends=0x5d)
158: Android.Views.Accessibility.ContentChangeTypes (flist=919, mlist=1421, flags=0x101, extends=0x5d)
159: Android.Views.Accessibility.EventTypes (flist=931, mlist=1421, flags=0x101, extends=0x5d)
160: Android.Util.IAttributeSet (flist=959, mlist=1421, flags=0xa1, extends=0x0)
161: Android.Util.IAttributeSetInvoker (flist=961, mlist=1447, flags=0x100000, extends=0x4dc)
162: Android.OS.BaseBundle (flist=1007, mlist=1521, flags=0x100001, extends=0x4dc)
163: Android.OS.Bundle (flist=1008, mlist=1526, flags=0x100101, extends=0x288)
164: Android.OS.Handler (flist=1009, mlist=1533, flags=0x100001, extends=0x4dc)
165: Android.OS.IParcelable (flist=1010, mlist=1541, flags=0xa1, extends=0x0)
166: Android.OS.IParcelableInvoker (flist=1010, mlist=1543, flags=0x100000, extends=0x4dc)
167: Android.OS.Looper (flist=1016, mlist=1557, flags=0x100001, extends=0x4dc)
168: Android.OS.Parcel (flist=1017, mlist=1564, flags=0x100101, extends=0x4dc)
169: Android.OS.ParcelableWriteFlags (flist=1018, mlist=1569, flags=0x101, extends=0x5d)
170: Android.Graphics.BlendMode (flist=1021, mlist=1569, flags=0x100101, extends=0x47c)
171: Android.Graphics.Point (flist=1022, mlist=1574, flags=0x100001, extends=0x4dc)
172: Android.Graphics.PorterDuff (flist=1025, mlist=1585, flags=0x100001, extends=0x4dc)
173: Android.Graphics.PorterDuff/Mode (flist=1026, mlist=1590, flags=0x100102, extends=0x47c)
174: Android.Graphics.Rect (flist=1027, mlist=1595, flags=0x100101, extends=0x4dc)
175: Android.Graphics.Drawables.Drawable (flist=1028, mlist=1602, flags=0x100081, extends=0x4dc)
176: Android.Graphics.Drawables.Drawable/ICallback (flist=1029, mlist=1607, flags=0xa2, extends=0x0)
177: Android.Graphics.Drawables.Drawable/ICallbackInvoker (flist=1029, mlist=1610, flags=0x100005, extends=0x4dc)
178: Android.Graphics.Drawables.DrawableInvoker (flist=1037, mlist=1627, flags=0x100000, extends=0x2bc)
179: Android.App.ActivityAttribute (flist=1038, mlist=1631, flags=0x102101, extends=0x6d)
180: Android.App.Activity (flist=1041, mlist=1635, flags=0x100001, extends=0x18c)
181: Android.App.Application (flist=1078, mlist=1749, flags=0x100001, extends=0x2ec)
182: Android.App.SyncContext (flist=1083, mlist=1764, flags=0x100000, extends=0x79)
183: Android.App.SyncContext/<>c__DisplayClass3_0 (flist=1083, mlist=1767, flags=0x100103, extends=0x9)
184: Android.Content.ComponentName (flist=1086, mlist=1769, flags=0x100101, extends=0x4dc)
185: Android.Content.Context (flist=1087, mlist=1778, flags=0x100081, extends=0x4dc)
186: Android.Content.ContextInvoker (flist=1088, mlist=1783, flags=0x100000, extends=0x2e4)
187: Android.Content.ContextWrapper (flist=1089, mlist=1787, flags=0x100001, extends=0x2e4)
188: Android.Content.IComponentCallbacks (flist=1090, mlist=1792, flags=0xa1, extends=0x0)
189: Android.Content.IComponentCallbacksInvoker (flist=1090, mlist=1794, flags=0x100000, extends=0x4dc)
190: Android.Content.IComponentCallbacks2 (flist=1096, mlist=1808, flags=0xa1, extends=0x0)
191: Android.Content.IComponentCallbacks2Invoker (flist=1096, mlist=1809, flags=0x100000, extends=0x4dc)
192: Android.Content.Intent (flist=1102, mlist=1822, flags=0x100001, extends=0x4dc)
193: Android.Content.TrimMemory (flist=1105, mlist=1833, flags=0x101, extends=0x5d)
194: Android.Content.Res.ColorStateList (flist=1113, mlist=1833, flags=0x100001, extends=0x4dc)
195: Android.Content.Res.Configuration (flist=1116, mlist=1844, flags=0x100101, extends=0x4dc)
196: Android.Runtime.DynamicMethodNameCounter (flist=1117, mlist=1853, flags=0x100000, extends=0x9)
197: Android.Runtime.IJavaObjectValueMarshaler (flist=1118, mlist=1854, flags=0x100100, extends=0x2e)
198: Android.Runtime.RegisterAttribute (flist=1118, mlist=1857, flags=0x100101, extends=0x6d)
199: Android.Runtime.AndroidEnvironment (flist=1123, mlist=1869, flags=0x100181, extends=0x9)
200: Android.Runtime.AndroidRuntime (flist=1126, mlist=1875, flags=0x100000, extends=0xcd)
201: Android.Runtime.AndroidRuntimeOptions (flist=1126, mlist=1878, flags=0x100000, extends=0xd1)
202: Android.Runtime.AndroidObjectReferenceManager (flist=1126, mlist=1879, flags=0x100000, extends=0xe5)
203: Android.Runtime.AndroidTypeManager (flist=1126, mlist=1892, flags=0x100000, extends=0xe9)
204: Android.Runtime.AndroidTypeManager/JniRemappingReplacementMethod (flist=1129, mlist=1909, flags=0x10010b, extends=0x149)
205: Android.Runtime.AndroidTypeManager/GetCallbackHandler (flist=1132, mlist=1909, flags=0x103, extends=0x5)
206: Android.Runtime.AndroidTypeManager/MagicRegistrationMap (flist=1132, mlist=1911, flags=0x3, extends=0x9)
207: Android.Runtime.AndroidTypeManager/<GetTypesForSimpleReference>d__3 (flist=1133, mlist=1916, flags=0x100103, extends=0x9)
208: Android.Runtime.AndroidValueManager (flist=1140, mlist=1924, flags=0x100000, extends=0xd5)
209: Android.Runtime.IdentityHashTargets (flist=1141, mlist=1938, flags=0x100000, extends=0x9)
210: Android.Runtime.AnnotationAttribute (flist=1143, mlist=1945, flags=0x100001, extends=0x6d)
211: Android.Runtime.BoundExceptionType (flist=1144, mlist=1948, flags=0x100, extends=0x5d)
212: Android.Runtime.CharSequence (flist=1147, mlist=1948, flags=0x100181, extends=0x9)
213: Android.Runtime.IJavaObject (flist=1147, mlist=1949, flags=0xa1, extends=0x0)
214: Android.Runtime.InputStreamAdapter (flist=1147, mlist=1950, flags=0x100101, extends=0x53c)
215: Android.Runtime.InputStreamInvoker (flist=1148, mlist=1958, flags=0x100001, extends=0x185)
216: Android.Runtime.IntDefAttribute (flist=1150, mlist=1977, flags=0x100001, extends=0x6d)
217: Android.Runtime.JavaCollection (flist=1152, mlist=1980, flags=0x100001, extends=0x4dc)
218: Android.Runtime.JavaCollection`1 (flist=1157, mlist=1993, flags=0x100101, extends=0x364)
219: Android.Runtime.JavaDictionary (flist=1160, mlist=2008, flags=0x100001, extends=0x4dc)
220: Android.Runtime.JavaDictionary/DictionaryEnumerator (flist=1169, mlist=2037, flags=0x100003, extends=0x9)
221: Android.Runtime.JavaDictionary/<>c__DisplayClass13_0 (flist=1170, mlist=2040, flags=0x100103, extends=0x9)
222: Android.Runtime.JavaDictionary/<>c__DisplayClass13_1 (flist=1172, mlist=2042, flags=0x100103, extends=0x9)
223: Android.Runtime.JavaDictionary/<System-Collections-IEnumerable-GetEnumerator>d__38 (flist=1174, mlist=2044, flags=0x100103, extends=0x9)
224: Android.Runtime.JavaDictionary`2 (flist=1178, mlist=2050, flags=0x100001, extends=0x36c)
225: Android.Runtime.JavaDictionary`2/<>c__DisplayClass4_0 (flist=1178, mlist=2074, flags=0x100103, extends=0x9)
226: Android.Runtime.JavaDictionary`2/<>c__DisplayClass4_1 (flist=1180, mlist=2076, flags=0x100103, extends=0x9)
227: Android.Runtime.JavaDictionary`2/<GetEnumerator>d__18 (flist=1182, mlist=2078, flags=0x100103, extends=0x9)
228: Android.Runtime.JavaList (flist=1186, mlist=2084, flags=0x100001, extends=0x4dc)
229: Android.Runtime.JavaList`1 (flist=1187, mlist=2129, flags=0x100001, extends=0x390)
230: Android.Runtime.JavaObject (flist=1187, mlist=2146, flags=0x100100, extends=0x4dc)
231: Android.Runtime.JavaProxyThrowable (flist=1188, mlist=2151, flags=0x100000, extends=0x484)
232: Android.Runtime.JavaSet (flist=1189, mlist=2153, flags=0x100001, extends=0x4dc)
233: Android.Runtime.JavaSet`1 (flist=1192, mlist=2158, flags=0x100001, extends=0x3a0)
234: Android.Runtime.JnienvInitializeArgs (flist=1192, mlist=2162, flags=0x100108, extends=0x149)
235: Android.Runtime.JNIEnv (flist=1210, mlist=2162, flags=0x100181, extends=0x9)
236: Android.Runtime.JNIEnv/<>c (flist=1238, mlist=2309, flags=0x102103, extends=0x9)
237: Android.Runtime.JniHandleOwnership (flist=1288, mlist=2360, flags=0x101, extends=0x5d)
238: Android.Runtime.JNINativeWrapper (flist=1293, mlist=2360, flags=0x100181, extends=0x9)
239: Android.Runtime.JObjectRefType (flist=1295, mlist=2403, flags=0x100, extends=0x5d)
240: Android.Runtime.JValue (flist=1300, mlist=2403, flags=0x100111, extends=0x149)
241: Android.Runtime.Logger (flist=1310, mlist=2414, flags=0x180, extends=0x9)
242: Android.Runtime.LogLevel (flist=1312, mlist=2427, flags=0x100, extends=0x5d)
243: Android.Runtime.LogCategories (flist=1322, mlist=2427, flags=0x100, extends=0x5d)
244: Android.Runtime.NamespaceMappingAttribute (flist=1334, mlist=2427, flags=0x100001, extends=0x6d)
245: Android.Runtime.OutputStreamAdapter (flist=1336, mlist=2432, flags=0x100001, extends=0x550)
246: Android.Runtime.OutputStreamInvoker (flist=1337, mlist=2441, flags=0x100001, extends=0x185)
247: Android.Runtime.PreserveAttribute (flist=1338, mlist=2459, flags=0x100101, extends=0x6d)
248: Android.Runtime.RaiseThrowableEventArgs (flist=1340, mlist=2460, flags=0x100001, extends=0x255)
249: Android.Runtime.ResourceDesignerAttribute (flist=1342, mlist=2465, flags=0x100001, extends=0x6d)
250: Android.Runtime.ResourceIdManager (flist=1344, mlist=2470, flags=0x100181, extends=0x9)
251: Android.Runtime.TypeManager (flist=1345, mlist=2472, flags=0x100181, extends=0x9)
252: Android.Runtime.XAPeerMembers (flist=1345, mlist=2476, flags=0x100001, extends=0x29)
253: Java.Util.IIterator (flist=1346, mlist=2483, flags=0xa1, extends=0x0)
254: Java.Util.IIteratorInvoker (flist=1348, mlist=2490, flags=0x100000, extends=0x4dc)
255: Java.Util.Functions.IConsumer (flist=1356, mlist=2507, flags=0xa1, extends=0x0)
256: Java.Util.Functions.IConsumerInvoker (flist=1358, mlist=2512, flags=0x100000, extends=0x4dc)
257: Java.Nio.Buffer (flist=1362, mlist=2523, flags=0x100081, extends=0x4dc)
258: Java.Nio.BufferInvoker (flist=1363, mlist=2528, flags=0x100000, extends=0x404)
259: Java.Nio.ByteBuffer (flist=1364, mlist=2532, flags=0x100081, extends=0x404)
260: Java.Nio.ByteBufferInvoker (flist=1366, mlist=2541, flags=0x100000, extends=0x40c)
261: Java.Nio.Channels.FileChannel (flist=1367, mlist=2545, flags=0x100081, extends=0x45c)
262: Java.Nio.Channels.FileChannelInvoker (flist=1376, mlist=2578, flags=0x100000, extends=0x414)
263: Java.Nio.Channels.IByteChannel (flist=1377, mlist=2590, flags=0xa1, extends=0x0)
264: Java.Nio.Channels.IByteChannelInvoker (flist=1377, mlist=2590, flags=0x100000, extends=0x4dc)
265: Java.Nio.Channels.IChannel (flist=1383, mlist=2602, flags=0xa1, extends=0x0)
266: Java.Nio.Channels.IChannelInvoker (flist=1383, mlist=2604, flags=0x100000, extends=0x4dc)
267: Java.Nio.Channels.IGatheringByteChannel (flist=1389, mlist=2618, flags=0xa1, extends=0x0)
268: Java.Nio.Channels.IGatheringByteChannelInvoker (flist=1389, mlist=2620, flags=0x100000, extends=0x4dc)
269: Java.Nio.Channels.IInterruptibleChannel (flist=1398, mlist=2637, flags=0xa1, extends=0x0)
270: Java.Nio.Channels.IInterruptibleChannelInvoker (flist=1398, mlist=2638, flags=0x100000, extends=0x4dc)
271: Java.Nio.Channels.IReadableByteChannel (flist=1403, mlist=2650, flags=0xa1, extends=0x0)
272: Java.Nio.Channels.IReadableByteChannelInvoker (flist=1403, mlist=2651, flags=0x100000, extends=0x4dc)
273: Java.Nio.Channels.IScatteringByteChannel (flist=1409, mlist=2664, flags=0xa1, extends=0x0)
274: Java.Nio.Channels.IScatteringByteChannelInvoker (flist=1409, mlist=2666, flags=0x100000, extends=0x4dc)
275: Java.Nio.Channels.ISeekableByteChannel (flist=1418, mlist=2683, flags=0xa1, extends=0x0)
276: Java.Nio.Channels.ISeekableByteChannelInvoker (flist=1418, mlist=2689, flags=0x100000, extends=0x4dc)
277: Java.Nio.Channels.IWritableByteChannel (flist=1434, mlist=2717, flags=0xa1, extends=0x0)
278: Java.Nio.Channels.IWritableByteChannelInvoker (flist=1434, mlist=2718, flags=0x100000, extends=0x4dc)
279: Java.Nio.Channels.Spi.AbstractInterruptibleChannel (flist=1440, mlist=2731, flags=0x100081, extends=0x4dc)
280: Java.Nio.Channels.Spi.AbstractInterruptibleChannelInvoker (flist=1441, mlist=2738, flags=0x100000, extends=0x45c)
281: Java.Lang.Boolean (flist=1442, mlist=2742, flags=0x100101, extends=0x4dc)
282: Java.Lang.Byte (flist=1443, mlist=2768, flags=0x100101, extends=0x4d4)
283: Java.Lang.Character (flist=1444, mlist=2797, flags=0x100101, extends=0x4dc)
284: Java.Lang.Class (flist=1445, mlist=2823, flags=0x101, extends=0x4dc)
285: Java.Lang.ClassCastException (flist=1450, mlist=2837, flags=0x100001, extends=0x4e0)
286: Java.Lang.Double (flist=1451, mlist=2843, flags=0x100101, extends=0x4d4)
287: Java.Lang.Enum (flist=1452, mlist=2872, flags=0x100081, extends=0x4dc)
288: Java.Lang.EnumInvoker (flist=1453, mlist=2880, flags=0x100000, extends=0x47c)
289: Java.Lang.Error (flist=1454, mlist=2884, flags=0x100001, extends=0x4f8)
290: Java.Lang.Exception (flist=1455, mlist=2890, flags=0x100001, extends=0x4f8)
291: Java.Lang.Float (flist=1456, mlist=2896, flags=0x100101, extends=0x4d4)
292: Java.Lang.IAppendable (flist=1457, mlist=2925, flags=0xa1, extends=0x0)
293: Java.Lang.IAppendableInvoker (flist=1457, mlist=2928, flags=0x100000, extends=0x4dc)
294: Java.Lang.ICharSequence (flist=1465, mlist=2945, flags=0xa1, extends=0x0)
295: Java.Lang.ICharSequenceInvoker (flist=1465, mlist=2949, flags=0x100000, extends=0x4dc)
296: Java.Lang.ICharSequenceInvoker/<GetEnumerator>d__35 (flist=1475, mlist=2971, flags=0x100103, extends=0x9)
297: Java.Lang.ICloneable (flist=1479, mlist=2976, flags=0xa1, extends=0x0)
298: Java.Lang.ICloneableInvoker (flist=1479, mlist=2976, flags=0x100000, extends=0x4dc)
299: Java.Lang.IComparable (flist=1481, mlist=2984, flags=0xa1, extends=0x0)
300: Java.Lang.IComparableInvoker (flist=1481, mlist=2985, flags=0x100000, extends=0x4dc)
301: Java.Lang.IllegalArgumentException (flist=1485, mlist=2996, flags=0x100001, extends=0x4e0)
302: Java.Lang.IllegalStateException (flist=1486, mlist=3002, flags=0x100001, extends=0x4e0)
303: Java.Lang.IndexOutOfBoundsException (flist=1487, mlist=3008, flags=0x100001, extends=0x4e0)
304: Java.Lang.Integer (flist=1488, mlist=3014, flags=0x100101, extends=0x4d4)
305: Java.Lang.IRunnable (flist=1489, mlist=3043, flags=0xa1, extends=0x0)
306: Java.Lang.IRunnableInvoker (flist=1489, mlist=3044, flags=0x100000, extends=0x4dc)
307: Java.Lang.Long (flist=1493, mlist=3055, flags=0x100101, extends=0x4d4)
308: Java.Lang.NullPointerException (flist=1494, mlist=3084, flags=0x100001, extends=0x4e0)
309: Java.Lang.Number (flist=1495, mlist=3090, flags=0x100081, extends=0x4dc)
310: Java.Lang.NumberInvoker (flist=1502, mlist=3113, flags=0x100000, extends=0x4d4)
311: Java.Lang.Object (flist=1503, mlist=3121, flags=0x102001, extends=0x9)
312: Java.Lang.RuntimeException (flist=1514, mlist=3214, flags=0x100001, extends=0x488)
313: Java.Lang.Short (flist=1515, mlist=3220, flags=0x100101, extends=0x4d4)
314: Java.Lang.String (flist=1516, mlist=3232, flags=0x100101, extends=0x4dc)
315: Java.Lang.String/<GetEnumerator>d__102 (flist=1517, mlist=3246, flags=0x100103, extends=0x9)
316: Java.Lang.Thread (flist=1521, mlist=3251, flags=0x100001, extends=0x4dc)
317: Java.Lang.Thread/RunnableImplementor (flist=1523, mlist=3259, flags=0x100105, extends=0x4dc)
318: Java.Lang.Throwable (flist=1526, mlist=3262, flags=0x100001, extends=0xc5)
319: Java.Lang.UnsupportedOperationException (flist=1540, mlist=3304, flags=0x100001, extends=0x4e0)
320: Java.Lang.Reflect.IAnnotatedElement (flist=1541, mlist=3310, flags=0xa1, extends=0x0)
321: Java.Lang.Reflect.IAnnotatedElementInvoker (flist=1545, mlist=3324, flags=0x100000, extends=0x4dc)
322: Java.Lang.Reflect.IGenericDeclaration (flist=1555, mlist=3344, flags=0xa1, extends=0x0)
323: Java.Lang.Reflect.IGenericDeclarationInvoker (flist=1555, mlist=3345, flags=0x100000, extends=0x4dc)
324: Java.Lang.Reflect.IType (flist=1563, mlist=3360, flags=0xa1, extends=0x0)
325: Java.Lang.Reflect.ITypeInvoker (flist=1565, mlist=3364, flags=0x100000, extends=0x4dc)
326: Java.Lang.Reflect.ITypeVariable (flist=1567, mlist=3372, flags=0xa1, extends=0x0)
327: Java.Lang.Reflect.ITypeVariableInvoker (flist=1567, mlist=3375, flags=0x100000, extends=0x4dc)
328: Java.Lang.Annotation.IAnnotation (flist=1575, mlist=3392, flags=0xa1, extends=0x0)
329: Java.Lang.Annotation.IAnnotationInvoker (flist=1575, mlist=3396, flags=0x100000, extends=0x4dc)
330: Java.IO.FileInputStream (flist=1585, mlist=3416, flags=0x100001, extends=0x53c)
331: Java.IO.ICloseable (flist=1588, mlist=3427, flags=0xa1, extends=0x0)
332: Java.IO.ICloseableInvoker (flist=1588, mlist=3428, flags=0x100000, extends=0x4dc)
333: Java.IO.IFlushable (flist=1592, mlist=3439, flags=0xa1, extends=0x0)
334: Java.IO.IFlushableInvoker (flist=1592, mlist=3440, flags=0x100000, extends=0x4dc)
335: Java.IO.InputStream (flist=1596, mlist=3451, flags=0x100081, extends=0x4dc)
336: Java.IO.InputStreamInvoker (flist=1601, mlist=3468, flags=0x100000, extends=0x53c)
337: Java.IO.IOException (flist=1602, mlist=3473, flags=0x100001, extends=0x488)
338: Java.IO.ISerializable (flist=1603, mlist=3479, flags=0xa1, extends=0x0)
339: Java.IO.ISerializableInvoker (flist=1603, mlist=3479, flags=0x100000, extends=0x4dc)
340: Java.IO.OutputStream (flist=1605, mlist=3487, flags=0x100081, extends=0x4dc)
341: Java.IO.OutputStreamInvoker (flist=1611, mlist=3507, flags=0x100000, extends=0x550)
342: Java.IO.PrintWriter (flist=1612, mlist=3512, flags=0x100001, extends=0x560)
343: Java.IO.StringWriter (flist=1615, mlist=3524, flags=0x100001, extends=0x560)
344: Java.IO.Writer (flist=1618, mlist=3536, flags=0x100081, extends=0x4dc)
345: Java.IO.WriterInvoker (flist=1624, mlist=3556, flags=0x100000, extends=0x560)
346: Java.Interop.ExportParameterAttribute (flist=1625, mlist=3562, flags=0x102001, extends=0x6d)
347: Java.Interop.ExportParameterKind (flist=1625, mlist=3563, flags=0x101, extends=0x5d)
348: Java.Interop.IJniNameProviderAttribute (flist=1631, mlist=3563, flags=0xa1, extends=0x0)
349: Java.Interop.IJavaObjectEx (flist=1631, mlist=3564, flags=0xa0, extends=0x0)
350: Java.Interop.JavaConvert (flist=1631, mlist=3570, flags=0x100180, extends=0x9)
351: Java.Interop.JavaConvert/<>c (flist=1635, mlist=3583, flags=0x102103, extends=0x9)
352: Java.Interop.JavaConvert/<>c__DisplayClass1_0 (flist=1639, mlist=3620, flags=0x100103, extends=0x9)
353: Java.Interop.JavaLocationException (flist=1640, mlist=3622, flags=0x100000, extends=0xc5)
354: Java.Interop.JavaObjectExtensions (flist=1641, mlist=3624, flags=0x100181, extends=0x9)
355: Java.Interop.Runtime (flist=1641, mlist=3629, flags=0x100181, extends=0x9)
356: Java.Interop.TypeManagerMapDictionaries (flist=1641, mlist=3631, flags=0x100180, extends=0x9)
357: Java.Interop.TypeManager (flist=1644, mlist=3634, flags=0x100181, extends=0x9)
358: Java.Interop.TypeManager/TypeNameComparer (flist=1648, mlist=3654, flags=0x100003, extends=0x9)
359: Java.Interop.TypeManager/JavaTypeManager (flist=1648, mlist=3656, flags=0x100005, extends=0x4dc)
360: Java.Interop.Tools.JavaCallableWrappers.Crc64Helper (flist=1648, mlist=3659, flags=0x100180, extends=0x9)
361: Java.Interop.Tools.TypeNameMappings.PackageNamingPolicy (flist=1649, mlist=3662, flags=0x100, extends=0x5d)
362: Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager (flist=1655, mlist=3662, flags=0x100180, extends=0x9)
363: Java.Interop.Tools.TypeNameMappings.JavaNativeTypeManager/<>c (flist=1656, mlist=3684, flags=0x102103, extends=0x9)
364: <PrivateImplementationDetails> (flist=1669, mlist=3698, flags=0x100100, extends=0x9)
365: <PrivateImplementationDetails>/__StaticArrayInitTypeSize=16384 (flist=1670, mlist=3699, flags=0x113, extends=0x149)

Through the glory that is awk, we can easily see which types were added by this PR:

awk '{print $2}' types.txt | sort > types-s.txt
awk '{print $2}' types_main.txt | sort > types_main-s.txt
diff -u types_main-s.txt types-s.txt
--- types_main-s.txt	2022-08-31 16:06:46.000000000 -0400
+++ types-s.txt	2022-08-31 16:06:26.000000000 -0400
@@ -7,13 +7,35 @@
 Android.App.Application
 Android.App.SyncContext
 Android.App.SyncContext/<>c__DisplayClass3_0
+Android.Content.ComponentName
 Android.Content.Context
 Android.Content.ContextInvoker
 Android.Content.ContextWrapper
+Android.Content.IComponentCallbacks
+Android.Content.IComponentCallbacks2
+Android.Content.IComponentCallbacks2Invoker
+Android.Content.IComponentCallbacksInvoker
+Android.Content.Intent
+Android.Content.Res.ColorStateList
+Android.Content.Res.Configuration
+Android.Content.TrimMemory
+Android.Graphics.BlendMode
+Android.Graphics.Drawables.Drawable
+Android.Graphics.Drawables.Drawable/ICallback
+Android.Graphics.Drawables.Drawable/ICallbackInvoker
+Android.Graphics.Drawables.DrawableInvoker
+Android.Graphics.Point
+Android.Graphics.PorterDuff
+Android.Graphics.PorterDuff/Mode
+Android.Graphics.Rect
 Android.OS.BaseBundle
 Android.OS.Bundle
 Android.OS.Handler
+Android.OS.IParcelable
+Android.OS.IParcelableInvoker
 Android.OS.Looper
+Android.OS.Parcel
+Android.OS.ParcelableWriteFlags
 Android.Runtime.AndroidEnvironment
 Android.Runtime.AndroidObjectReferenceManager
 Android.Runtime.AndroidRuntime
@@ -26,18 +48,36 @@
 Android.Runtime.AndroidValueManager
 Android.Runtime.AnnotationAttribute
 Android.Runtime.BoundExceptionType
+Android.Runtime.CharSequence
 Android.Runtime.DynamicMethodNameCounter
 Android.Runtime.IJavaObject
 Android.Runtime.IJavaObjectValueMarshaler
 Android.Runtime.IdentityHashTargets
 Android.Runtime.InputStreamAdapter
 Android.Runtime.InputStreamInvoker
+Android.Runtime.IntDefAttribute
 Android.Runtime.JNIEnv
 Android.Runtime.JNIEnv/<>c
 Android.Runtime.JNINativeWrapper
 Android.Runtime.JObjectRefType
 Android.Runtime.JValue
+Android.Runtime.JavaCollection
+Android.Runtime.JavaCollection`1
+Android.Runtime.JavaDictionary
+Android.Runtime.JavaDictionary/<>c__DisplayClass13_0
+Android.Runtime.JavaDictionary/<>c__DisplayClass13_1
+Android.Runtime.JavaDictionary/<System-Collections-IEnumerable-GetEnumerator>d__38
+Android.Runtime.JavaDictionary/DictionaryEnumerator
+Android.Runtime.JavaDictionary`2
+Android.Runtime.JavaDictionary`2/<>c__DisplayClass4_0
+Android.Runtime.JavaDictionary`2/<>c__DisplayClass4_1
+Android.Runtime.JavaDictionary`2/<GetEnumerator>d__18
+Android.Runtime.JavaList
+Android.Runtime.JavaList`1
+Android.Runtime.JavaObject
 Android.Runtime.JavaProxyThrowable
+Android.Runtime.JavaSet
+Android.Runtime.JavaSet`1
 Android.Runtime.JniHandleOwnership
 Android.Runtime.JnienvInitializeArgs
 Android.Runtime.LogCategories
@@ -53,9 +93,87 @@
 Android.Runtime.ResourceIdManager
 Android.Runtime.TypeManager
 Android.Runtime.XAPeerMembers
+Android.Util.IAttributeSet
+Android.Util.IAttributeSetInvoker
+Android.Views.Accessibility.AccessibilityEvent
+Android.Views.Accessibility.AccessibilityRecord
+Android.Views.Accessibility.Action
+Android.Views.Accessibility.ContentChangeTypes
+Android.Views.Accessibility.EventTypes
+Android.Views.Accessibility.IAccessibilityEventSource
+Android.Views.Accessibility.IAccessibilityEventSourceInvoker
+Android.Views.ActionMode
+Android.Views.ActionMode/ICallback
+Android.Views.ActionMode/ICallbackInvoker
+Android.Views.ActionModeInvoker
+Android.Views.ActionModeType
+Android.Views.ActionProvider
+Android.Views.ActionProviderInvoker
 Android.Views.ContextThemeWrapper
+Android.Views.FocusSearchDirection
+Android.Views.IContextMenu
+Android.Views.IContextMenuContextMenuInfo
+Android.Views.IContextMenuContextMenuInfoInvoker
+Android.Views.IContextMenuInvoker
+Android.Views.IMenu
+Android.Views.IMenuInvoker
+Android.Views.IMenuItem
+Android.Views.IMenuItemInvoker
+Android.Views.IMenuItemOnActionExpandListener
+Android.Views.IMenuItemOnActionExpandListenerInvoker
+Android.Views.IMenuItemOnMenuItemClickListener
+Android.Views.IMenuItemOnMenuItemClickListenerInvoker
+Android.Views.ISubMenu
+Android.Views.ISubMenuInvoker
+Android.Views.IViewManager
+Android.Views.IViewManagerInvoker
+Android.Views.IViewParent
+Android.Views.IViewParentInvoker
+Android.Views.InputEvent
+Android.Views.InputEventInvoker
+Android.Views.KeyEvent
+Android.Views.KeyEvent/ICallback
+Android.Views.KeyEvent/ICallbackInvoker
+Android.Views.KeyboardShortcutGroup
+Android.Views.Keycode
+Android.Views.LayoutDirection
+Android.Views.LayoutInflater
+Android.Views.LayoutInflater/IFactory
+Android.Views.LayoutInflater/IFactory2
+Android.Views.LayoutInflater/IFactory2Invoker
+Android.Views.LayoutInflater/IFactoryInvoker
+Android.Views.LayoutInflaterInvoker
+Android.Views.MenuAppendFlags
+Android.Views.MenuPerformFlags
+Android.Views.MotionEvent
+Android.Views.ScrollAxis
+Android.Views.SearchEvent
+Android.Views.ShowAsAction
+Android.Views.TextAlignment
+Android.Views.TextDirection
+Android.Views.View
+Android.Views.View/IOnCreateContextMenuListener
+Android.Views.View/IOnCreateContextMenuListenerInvoker
+Android.Views.ViewGroup
+Android.Views.ViewGroup/LayoutParams
+Android.Views.ViewGroupInvoker
+Android.Views.Window
+Android.Views.Window/ICallback
+Android.Views.Window/ICallbackInvoker
+Android.Views.WindowInvoker
+Android.Views.WindowManagerLayoutParams
+Android.Window.IOnBackInvokedCallback
+Android.Window.IOnBackInvokedCallbackInvoker
+Android.Window.IOnBackInvokedDispatcher
+Android.Window.IOnBackInvokedDispatcherInvoker
 Java.IO.FileInputStream
+Java.IO.ICloseable
+Java.IO.ICloseableInvoker
+Java.IO.IFlushable
+Java.IO.IFlushableInvoker
 Java.IO.IOException
+Java.IO.ISerializable
+Java.IO.ISerializableInvoker
 Java.IO.InputStream
 Java.IO.InputStreamInvoker
 Java.IO.OutputStream
@@ -68,6 +186,9 @@
 Java.Interop.ExportParameterKind
 Java.Interop.IJavaObjectEx
 Java.Interop.IJniNameProviderAttribute
+Java.Interop.JavaConvert
+Java.Interop.JavaConvert/<>c
+Java.Interop.JavaConvert/<>c__DisplayClass1_0
 Java.Interop.JavaLocationException
 Java.Interop.JavaObjectExtensions
 Java.Interop.Runtime
@@ -79,60 +200,168 @@
 Java.Interop.TypeManager/JavaTypeManager
 Java.Interop.TypeManager/TypeNameComparer
 Java.Interop.TypeManagerMapDictionaries
+Java.Lang.Annotation.IAnnotation
+Java.Lang.Annotation.IAnnotationInvoker
+Java.Lang.Boolean
+Java.Lang.Byte
+Java.Lang.Character
 Java.Lang.Class
+Java.Lang.ClassCastException
+Java.Lang.Double
+Java.Lang.Enum
+Java.Lang.EnumInvoker
 Java.Lang.Error
 Java.Lang.Exception
+Java.Lang.Float
+Java.Lang.IAppendable
+Java.Lang.IAppendableInvoker
+Java.Lang.ICharSequence
+Java.Lang.ICharSequenceInvoker
+Java.Lang.ICharSequenceInvoker/<GetEnumerator>d__35
+Java.Lang.ICloneable
+Java.Lang.ICloneableInvoker
+Java.Lang.IComparable
+Java.Lang.IComparableInvoker
 Java.Lang.IRunnable
 Java.Lang.IRunnableInvoker
+Java.Lang.IllegalArgumentException
+Java.Lang.IllegalStateException
+Java.Lang.IndexOutOfBoundsException
+Java.Lang.Integer
+Java.Lang.Long
+Java.Lang.NullPointerException
+Java.Lang.Number
+Java.Lang.NumberInvoker
 Java.Lang.Object
+Java.Lang.Reflect.IAnnotatedElement
+Java.Lang.Reflect.IAnnotatedElementInvoker
+Java.Lang.Reflect.IGenericDeclaration
+Java.Lang.Reflect.IGenericDeclarationInvoker
+Java.Lang.Reflect.IType
+Java.Lang.Reflect.ITypeInvoker
+Java.Lang.Reflect.ITypeVariable
+Java.Lang.Reflect.ITypeVariableInvoker
+Java.Lang.RuntimeException
+Java.Lang.Short
 Java.Lang.String
 Java.Lang.String/<GetEnumerator>d__102
 Java.Lang.Thread
 Java.Lang.Thread/RunnableImplementor
 Java.Lang.Throwable
+Java.Lang.UnsupportedOperationException
+Java.Nio.Buffer
+Java.Nio.BufferInvoker
+Java.Nio.ByteBuffer
+Java.Nio.ByteBufferInvoker
 Java.Nio.Channels.FileChannel
 Java.Nio.Channels.FileChannelInvoker
+Java.Nio.Channels.IByteChannel
+Java.Nio.Channels.IByteChannelInvoker
+Java.Nio.Channels.IChannel
+Java.Nio.Channels.IChannelInvoker
+Java.Nio.Channels.IGatheringByteChannel
+Java.Nio.Channels.IGatheringByteChannelInvoker
+Java.Nio.Channels.IInterruptibleChannel
+Java.Nio.Channels.IInterruptibleChannelInvoker
+Java.Nio.Channels.IReadableByteChannel
+Java.Nio.Channels.IReadableByteChannelInvoker
+Java.Nio.Channels.IScatteringByteChannel
+Java.Nio.Channels.IScatteringByteChannelInvoker
+Java.Nio.Channels.ISeekableByteChannel
+Java.Nio.Channels.ISeekableByteChannelInvoker
+Java.Nio.Channels.IWritableByteChannel
+Java.Nio.Channels.IWritableByteChannelInvoker
 Java.Nio.Channels.Spi.AbstractInterruptibleChannel
 Java.Nio.Channels.Spi.AbstractInterruptibleChannelInvoker
+Java.Util.Functions.IConsumer
+Java.Util.Functions.IConsumerInvoker
+Java.Util.IIterator
+Java.Util.IIteratorInvoker
+System.Linq.Extensions
+System.Linq.Extensions/<ToEnumerator_Dispose>d__3
+System.Linq.Extensions/<ToEnumerator_Dispose>d__5`1
 Table
+_JniMarshal_PPCCII_L
+_JniMarshal_PPCC_L
+_JniMarshal_PPCI_L
+_JniMarshal_PPC_L
+_JniMarshal_PPIF_F
+_JniMarshal_PPIIII_L
 _JniMarshal_PPIIII_V
+_JniMarshal_PPIIILLLIL_I
+_JniMarshal_PPIIIL_L
 _JniMarshal_PPIII_V
 _JniMarshal_PPIIL_V
+_JniMarshal_PPIIL_Z
+_JniMarshal_PPII_I
+_JniMarshal_PPII_L
 _JniMarshal_PPII_V
+_JniMarshal_PPII_Z
+_JniMarshal_PPILI_I
+_JniMarshal_PPILI_Z
 _JniMarshal_PPILL_V
+_JniMarshal_PPILL_Z
+_JniMarshal_PPIL_V
 _JniMarshal_PPIL_Z
+_JniMarshal_PPIZI_L
+_JniMarshal_PPIZZ_V
+_JniMarshal_PPIZ_V
+_JniMarshal_PPIZ_Z
+_JniMarshal_PPI_C
 _JniMarshal_PPI_I
 _JniMarshal_PPI_J
 _JniMarshal_PPI_L
 _JniMarshal_PPI_V
 _JniMarshal_PPJ_L
 _JniMarshal_PPJ_Z
+_JniMarshal_PPLFFZ_Z
+_JniMarshal_PPLFF_Z
 _JniMarshal_PPLF_V
 _JniMarshal_PPLIIIIIIII_V
 _JniMarshal_PPLIIII_V
+_JniMarshal_PPLIIL_V
 _JniMarshal_PPLII_I
+_JniMarshal_PPLII_J
+_JniMarshal_PPLII_L
 _JniMarshal_PPLII_V
 _JniMarshal_PPLII_Z
 _JniMarshal_PPLIL_Z
 _JniMarshal_PPLI_L
 _JniMarshal_PPLI_V
+_JniMarshal_PPLLF_F
+_JniMarshal_PPLLI_I
+_JniMarshal_PPLLI_L
+_JniMarshal_PPLLI_V
+_JniMarshal_PPLLI_Z
+_JniMarshal_PPLLJ_V
 _JniMarshal_PPLLJ_Z
+_JniMarshal_PPLLLI_I
+_JniMarshal_PPLLLL_L
 _JniMarshal_PPLLLL_V
 _JniMarshal_PPLLL_L
 _JniMarshal_PPLLL_V
 _JniMarshal_PPLLL_Z
+_JniMarshal_PPLLZ_Z
 _JniMarshal_PPLL_L
 _JniMarshal_PPLL_V
 _JniMarshal_PPLL_Z
 _JniMarshal_PPLZZL_Z
 _JniMarshal_PPLZ_V
 _JniMarshal_PPL_I
+_JniMarshal_PPL_J
 _JniMarshal_PPL_L
 _JniMarshal_PPL_V
 _JniMarshal_PPL_Z
 _JniMarshal_PPZIIII_V
+_JniMarshal_PPZ_L
+_JniMarshal_PPZ_V
+_JniMarshal_PP_B
+_JniMarshal_PP_C
+_JniMarshal_PP_D
+_JniMarshal_PP_F
 _JniMarshal_PP_I
 _JniMarshal_PP_J
 _JniMarshal_PP_L
+_JniMarshal_PP_S
 _JniMarshal_PP_V
 _JniMarshal_PP_Z

@jonpryor
Copy link
Member

Now that we know what types are added, we can better understand what is going in. What first jumps out to me is:

+Android.Content.IComponentCallbacks
+Android.Content.IComponentCallbacks2

These come from android.app.Activity; our generated binding is:

public partial class Activity : Android.Views.ContextThemeWrapper,
    Android.Content.IComponentCallbacks,
    Android.Content.IComponentCallbacks2,
    Android.Views.KeyEvent.ICallback,
    Android.Views.LayoutInflater.IFactory,
    Android.Views.LayoutInflater.IFactory2,
    Android.Views.View.IOnCreateContextMenuListener,
    Android.Views.Window.ICallback {
}

I had previously suggested:

Why not just preserve all the interfaces that the *Implementor type implements?

which then morphed into "why not preserve all interfaces on all preserved types?". (I can't find a comment on this PR making that suggestion, but I think I made that suggestion verbally…?)

Here we see the problem with not constraining to "just *Implementor" types: we wind up preserving all interfaces implemented by Android.App.Activity, which is a lot more than we actually wanted.

This is also more than we need; when we subclass Android.App.Activity, we don't need to preserve Android.Content.IComponentCallbacks, because the base class already implements that for us. We don't need to preserve all the binding-related infrastructure for it in this case.

When would we need to preserve Android.Content.IComponentCallbacks and Android.Content.IComponentCallbacksInvoker? When it's implemented in C# code, not a bound type:

partial class MyComponentsCallback : Java.Lang.Object, Android.Content.IComponentCallbacks {
    // …
}

This is also the issue with TextWatcherImplementor: it's a "normal" C# type which implements a Java interface ITextWatcher, but ITextWatcher wasn't preserved.

Preserving everything is "valid", but results in "larger than necessary" applications.

Thus, we should instead preserve all implemented interfaces on non-bound types. If a type has [Register("…", DoNotGenerateAcw=true)], then we do not need to preserve all interfaces it implements. Otherwise, we should preserve all interfaces it implements.

This should allow us to remove interfaces implemented by Android.App.Activity (DoNotGenerateAcw=true), while preserving all interfaces implemented by TextWatcherImplementor (DoNotGenerateAcw not set).

@jonathanpeppers jonathanpeppers changed the title [linker] preserve interfaces on *Implementor types [linker] preserve interfaces on Java types Sep 7, 2022
@jonathanpeppers jonathanpeppers marked this pull request as ready for review September 8, 2022 21:13
@jonpryor
Copy link
Member

jonpryor commented Sep 9, 2022

Commit message?

Fixes: https://github.com/xamarin/xamarin-android/issues/7097

Context: https://github.com/xamarin/monodroid/commit/a619cbea33e1b7cd8ffd0352bb37ac551d324f67
Context: http://github.com/xamarin/Java.Interop/commit/4787e0179b349ab5ee0d0dd03d08b694acea4971

Usage of a [`Google.Android.Material.TextField.TextInputEditText`][0]:

        var filterBox = FindViewById<TextInputEditText>(Resource.Id.filterBox);
        filterBox.TextChanged += (s, e) => { };

may crash at runtime with:

        android.runtime.JavaProxyThrowable: System.TypeLoadException: Could not load type '{0}' from assembly '{1}'., Android.Text.ITextWatcherInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
            at System.RuntimeTypeHandle.GetTypeByName(String , Boolean , Boolean , StackCrawlMark& , Boolean )
            at System.RuntimeType.GetType(String , Boolean , Boolean , StackCrawlMark& )
            at System.Type.GetType(String , Boolean )
            at Android.Runtime.AndroidTypeManager.RegisterNativeMembers(JniType , Type , ReadOnlySpan`1 )
        --- End of stack trace from previous location ---
            at Java.Interop.JniEnvironment.StaticMethods.CallStaticObjectMethod(JniObjectReference , JniMethodInfo , JniArgumentValue* )
            at Android.Runtime.JNIEnv.FindClass(String )
            at Android.Runtime.JNIEnv.AllocObject(String )
            at Android.Runtime.JNIEnv.StartCreateInstance(String , String , JValue* )
            at Android.Runtime.JNIEnv.StartCreateInstance(String , String , JValue[] )
            at Android.Text.TextWatcherImplementor..ctor(Object , EventHandler`1 , EventHandler`1 , EventHandler`1 )
            at Android.Widget.TextView.add_TextChanged(EventHandler`1 )
            at AndroidApp1.MainActivity.OnCreate(Bundle savedInstanceState)
            at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(IntPtr , IntPtr , IntPtr )
            at Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPL_V(_JniMarshal_PPL_V , IntPtr , IntPtr , IntPtr )
            at crc64a6e0c00971f6cd91.MainActivity.n_onCreate(Native Method)
            at crc64a6e0c00971f6cd91.MainActivity.onCreate(MainActivity.java:29)

The problem is that the .NET 6 linker *completely* removed the
`Android.Text.ITextWatcher` interface, which involved updating the
post-linked `Android.Text.TextWatcherImplementor` type to no longer
implement the `ITextWatcher` interface.

[`Android.Text.TextWatcherImplementor`][1] in turn is a hand-written
type within `Mono.Android.dll` which we expected (required!) to
always implement the `ITextWatcher` interface, so that we could pass
instances of it to Java code.

The *cause* of the `TypeLoadException` is through the confluence of
multiple factors:

 1. Java Callable Wrappers for `Mono.Android.dll` are generated at
    *xamarin-android* build time, *not* App build time.  This was
    originally done to reduce App build times, but also means that
    the Java Callable Wrapper for `TextWatcherImplementor` mentions
    the `ITextWatcherInvoker` type, which is only preserved if the
    `ITextWatcher` interface is preserved.

        /* partial */ class TextWatcherImplementor {
            static {
                __md_methods = 
                    "n_afterTextChanged:(Landroid/text/Editable;)V:GetAfterTextChanged_Landroid_text_Editable_Handler:Android.Text.ITextWatcherInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null\n" +
                    "n_beforeTextChanged:(Ljava/lang/CharSequence;III)V:GetBeforeTextChanged_Ljava_lang_CharSequence_IIIHandler:Android.Text.ITextWatcherInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null\n" +
                    "n_onTextChanged:(Ljava/lang/CharSequence;III)V:GetOnTextChanged_Ljava_lang_CharSequence_IIIHandler:Android.Text.ITextWatcherInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null\n" +
                    "";
                mono.android.Runtime.register ("Android.Text.TextWatcherImplementor, Mono.Android", TextWatcherImplementor.class, __md_methods);
            }
        }

 2. The .NET linker determines that the `ITextWatcher` interface is
    not actually used, and removes it from `Mono.Android.dll`.
    Without `ITextWatcher`, the `ITextWatcherInvoker` type is also
    removed from `Mono.Android.dll`.

 3. At runtime when subscribing to the `TextView.TextChanged` event,
    an instance of `TextWatcherImplementor` is created.  This in turn
    cases the Java peer `TextWatcherImplementor` type to be created,
    triggering the [Java Type Registration process][2], which
    includes the `Runtime.register()` invocation mentioning a method
    which involves the `ITextWatcherInvoker` type, e.g.

        "n_afterTextChanged:(Landroid/text/Editable;)V:GetAfterTextChanged_Landroid_text_Editable_Handler:Android.Text.ITextWatcherInvoker, Mono.Android\n" 

 4. `AndroidTypeManager.RegisterNativeMembers()` eventually attempts
    `Type.GetType("Android.Text.ITextWatcherInvoker, Mono.Android")`.
    This throws the `TypeLoadException`, as that type doesn't exist.

Commits 4d8c28f6 and d762aa99 fixed a very similar scenario in
Classic Xamarin.Android.  The difference now is that the .NET 6+
linker is getting *so* good that more types are now eligible for
removal by the linker.

Oversimplifying, the "real" cause of the crash is that when:

 1. We have a "non-bound" type which implements a Java interface,
    such as `TextWatcherImplementor`, *and*

 2. The linker decides that no IL-visible code uses that Java
    interface, and decides to remove that interface

then we're going to be in a world of hurt.

The fix is to update `MonoDroid.Tuner.MarkJavaObject` so that if
we're preserving a type, we also explicitly preserve all Java
interfaces implemented by the type as well, *if the type is not bound*.
This allows a linked `TextWatcherImplementor` to continue to implement
`ITextWatcher`, which in turn causes `ITextWatcherInvoker` to be
preserved, which prevents the `TypeLoadException` from occurring.

We determine that a type is "bound" by looking for:

  * `[Android.Runtime.RegisterAttribute (…, DoNotGenerateAcw=true)]`, or
  * `[Java.Interop.JniTypeSignatureAttribute (…, GenerateJavaPeer=false)]`

A `Java.Lang.Object` subclass which *isn't* "bound" is considered to
be "non-bound").

We don't want to preserve all Java interfaces for all types,
including bound types, because that isn't necessary and causes app
sizes to balloon.

[0]: https://developer.android.com/reference/com/google/android/material/textfield/TextInputEditText
[1]: https://github.com/xamarin/xamarin-android/blob/619420ae1d77d0ff3ec1b59afd156bfdd63c5c26/src/Mono.Android/Android.Text/ITextWatcher.cs#L52-L93
[2]: https://github.com/xamarin/xamarin-android/wiki/Blueprint#java-type-registration

@jonpryor
Copy link
Member

jonpryor commented Sep 9, 2022

While pondering that commit message, it occurs to me that there might be an "alternate" fix; cause (2) is:

  1. The .NET linker determines that the ITextWatcher interface is
    not actually used, and removes it from Mono.Android.dll.
    Without ITextWatcher, the ITextWatcherInvoker type is also
    removed from Mono.Android.dll.

Why isn't ITextWatcher used?

Because we're hand-writing our JNI invocations!

https://github.com/xamarin/xamarin-android/blob/accefa5925614ba8c53965eba091665ca973cfb2/src/Mono.Android/Android.Widget/TextView.cs#L10-L16

Conjecture: if that method instead used ITextWatcher instead of TextWatcherImplementor, the linker might never have removed ITextWatcher in the first place!

Would this be a better fix?

@jonpryor
Copy link
Member

jonpryor commented Sep 9, 2022

@jonpryor asked

Would this be a better fix?

After some discussion on Discord, the answer is "maybe, but we should preserve Java interfaces anyway."

The hypothetical example is this: imagine a Java library which utilizes optional interfaces:

public interface Fooable {
    void foo();
}
public interface Barable {
    void bar();
}

public class Lib {
    public static void doSomething(Object o) {
        if (o instanceof Fooable) { ((Fooable)o).foo(); }
        if (o instanceof Barable) { ((Barable)o).bar(); }
        // …
    }
}

This would result in a binding a'la:

[Register()]
public interface IFooable : IJavaPeerable {
    [Register()] void Foo(); 
}

[Register()]
public interface IBarable : IJavaPeerable {
    [Register()] void Bar(); 
}

[Register()]
public class Lib {
    public static void DoSomething(Java.Lang.Object o) {}
}

So far so good. But to use that lib:

class MySomething : Java.Lang.Object, IFooable, IBarable {
    public void Foo() {}
    public void Bar() {}
}

// …
Lib.DoSomething(new MySomething());

The expectation is that both MySomething.Foo() and MySomething.Bar() will be invoked, and most of the time that'll be the case!

However, if the linker is run, and the linker processes the assembly containing MySomething ("link all assemblies"), then the linked MySomething won't implement any interfaces, which means the Java Callable Wrapper won't implement any interfaces, which means the optional type checks done in Lib.doSomething() won't find anything.

Therefore, we should do as this PR currently does: preserve all Java interfaces on all "hand-written" Java.Lang.Object subclasses. This will allow MySomething to work as intended, even if the linker processes all assemblies.

Fixes: dotnet#7097
Context: xamarin/monodroid@a619cbe

Usage of a `Google.Android.Material.TextField.TextInputEditText`:

    var filterBox = FindViewById<TextInputEditText>(Resource.Id.filterBox);
    filterBox.TextChanged += (s, e) => { };

Crashes at runtime with:

    android.runtime.JavaProxyThrowable: System.TypeLoadException: Could not load type '{0}' from assembly '{1}'., Android.Text.ITextWatcherInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
        at System.RuntimeTypeHandle.GetTypeByName(String , Boolean , Boolean , StackCrawlMark& , Boolean )
        at System.RuntimeType.GetType(String , Boolean , Boolean , StackCrawlMark& )
        at System.Type.GetType(String , Boolean )
        at Android.Runtime.AndroidTypeManager.RegisterNativeMembers(JniType , Type , ReadOnlySpan`1 )
    --- End of stack trace from previous location ---
        at Java.Interop.JniEnvironment.StaticMethods.CallStaticObjectMethod(JniObjectReference , JniMethodInfo , JniArgumentValue* )
        at Android.Runtime.JNIEnv.FindClass(String )
        at Android.Runtime.JNIEnv.AllocObject(String )
        at Android.Runtime.JNIEnv.StartCreateInstance(String , String , JValue* )
        at Android.Runtime.JNIEnv.StartCreateInstance(String , String , JValue[] )
        at Android.Text.TextWatcherImplementor..ctor(Object , EventHandler`1 , EventHandler`1 , EventHandler`1 )
        at Android.Widget.TextView.add_TextChanged(EventHandler`1 )
        at AndroidApp1.MainActivity.OnCreate(Bundle savedInstanceState)
        at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(IntPtr , IntPtr , IntPtr )
        at Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPL_V(_JniMarshal_PPL_V , IntPtr , IntPtr , IntPtr )
        at crc64a6e0c00971f6cd91.MainActivity.n_onCreate(Native Method)
        at crc64a6e0c00971f6cd91.MainActivity.onCreate(MainActivity.java:29)

The problem being that the linker completely removed the
`ITextWatcher` interface, and the
`Android.Text.TextWatcherImplementor` type no longer implemented that
interface.

It appears we should preserve interfaces in .NET 6 for Java types
*except* if the type defines:

    [Android.Runtime.Register (DoNotGenerateAcw = true)]

This is on types like `Android.App.Activity` where we would *not* need
to preserve all the interfaces.

However, types like `TextWatcherImplementor` would get their
interfaces preserved appropriately.
@jonpryor jonpryor merged commit 1526df0 into dotnet:main Sep 13, 2022
@jonathanpeppers jonathanpeppers deleted the MaterialTextChanged branch September 13, 2022 18:58
grendello added a commit to grendello/xamarin-android that referenced this pull request Sep 14, 2022
* main:
  [Xamarin.Android.Build.Tasks] Add AndroidPackagingOptionsExclude (dotnet#7356)
  [linker] preserve Java interfaces on non-bound Java types (dotnet#7204)
  [Xamarin.Android.Build.Tasks] AndroidLinkResources and Styleables (dotnet#7306)
jonathanpeppers added a commit that referenced this pull request Sep 27, 2022
Fixes: #7097

Context: xamarin/monodroid@a619cbe
Context: http://github.com/xamarin/Java.Interop/commit/4787e0179b349ab5ee0d0dd03d08b694acea4971

Usage of a [`Google.Android.Material.TextField.TextInputEditText`][0]:

        var filterBox = FindViewById<TextInputEditText>(Resource.Id.filterBox);
        filterBox.TextChanged += (s, e) => { };

may crash at runtime with:

        android.runtime.JavaProxyThrowable: System.TypeLoadException: Could not load type '{0}' from assembly '{1}'., Android.Text.ITextWatcherInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
            at System.RuntimeTypeHandle.GetTypeByName(String , Boolean , Boolean , StackCrawlMark& , Boolean )
            at System.RuntimeType.GetType(String , Boolean , Boolean , StackCrawlMark& )
            at System.Type.GetType(String , Boolean )
            at Android.Runtime.AndroidTypeManager.RegisterNativeMembers(JniType , Type , ReadOnlySpan`1 )
        --- End of stack trace from previous location ---
            at Java.Interop.JniEnvironment.StaticMethods.CallStaticObjectMethod(JniObjectReference , JniMethodInfo , JniArgumentValue* )
            at Android.Runtime.JNIEnv.FindClass(String )
            at Android.Runtime.JNIEnv.AllocObject(String )
            at Android.Runtime.JNIEnv.StartCreateInstance(String , String , JValue* )
            at Android.Runtime.JNIEnv.StartCreateInstance(String , String , JValue[] )
            at Android.Text.TextWatcherImplementor..ctor(Object , EventHandler`1 , EventHandler`1 , EventHandler`1 )
            at Android.Widget.TextView.add_TextChanged(EventHandler`1 )
            at AndroidApp1.MainActivity.OnCreate(Bundle savedInstanceState)
            at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(IntPtr , IntPtr , IntPtr )
            at Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPL_V(_JniMarshal_PPL_V , IntPtr , IntPtr , IntPtr )
            at crc64a6e0c00971f6cd91.MainActivity.n_onCreate(Native Method)
            at crc64a6e0c00971f6cd91.MainActivity.onCreate(MainActivity.java:29)

The problem is that the .NET 6 linker *completely* removed the
`Android.Text.ITextWatcher` interface, which involved updating the
post-linked `Android.Text.TextWatcherImplementor` type to no longer
implement the `ITextWatcher` interface.

[`Android.Text.TextWatcherImplementor`][1] in turn is a hand-written
type within `Mono.Android.dll` which we expected (required!) to
always implement the `ITextWatcher` interface, so that we could pass
instances of it to Java code.

The *cause* of the `TypeLoadException` is through the confluence of
multiple factors:

 1. Java Callable Wrappers for `Mono.Android.dll` are generated at
    *xamarin-android* build time, *not* App build time.  This was
    originally done to reduce App build times, but also means that
    the Java Callable Wrapper for `TextWatcherImplementor` mentions
    the `ITextWatcherInvoker` type, which is only preserved if the
    `ITextWatcher` interface is preserved.

        /* partial */ class TextWatcherImplementor {
            static {
                __md_methods = 
                    "n_afterTextChanged:(Landroid/text/Editable;)V:GetAfterTextChanged_Landroid_text_Editable_Handler:Android.Text.ITextWatcherInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null\n" +
                    "n_beforeTextChanged:(Ljava/lang/CharSequence;III)V:GetBeforeTextChanged_Ljava_lang_CharSequence_IIIHandler:Android.Text.ITextWatcherInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null\n" +
                    "n_onTextChanged:(Ljava/lang/CharSequence;III)V:GetOnTextChanged_Ljava_lang_CharSequence_IIIHandler:Android.Text.ITextWatcherInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null\n" +
                    "";
                mono.android.Runtime.register ("Android.Text.TextWatcherImplementor, Mono.Android", TextWatcherImplementor.class, __md_methods);
            }
        }

 2. The .NET linker determines that the `ITextWatcher` interface is
    not actually used, and removes it from `Mono.Android.dll`.
    Without `ITextWatcher`, the `ITextWatcherInvoker` type is also
    removed from `Mono.Android.dll`.

 3. At runtime when subscribing to the `TextView.TextChanged` event,
    an instance of `TextWatcherImplementor` is created.  This in turn
    cases the Java peer `TextWatcherImplementor` type to be created,
    triggering the [Java Type Registration process][2], which
    includes the `Runtime.register()` invocation mentioning a method
    which involves the `ITextWatcherInvoker` type, e.g.

        "n_afterTextChanged:(Landroid/text/Editable;)V:GetAfterTextChanged_Landroid_text_Editable_Handler:Android.Text.ITextWatcherInvoker, Mono.Android\n" 

 4. `AndroidTypeManager.RegisterNativeMembers()` eventually attempts
    `Type.GetType("Android.Text.ITextWatcherInvoker, Mono.Android")`.
    This throws the `TypeLoadException`, as that type doesn't exist.

Commits 4d8c28f and d762aa9 fixed a very similar scenario in
Classic Xamarin.Android.  The difference now is that the .NET 6+
linker is getting *so* good that more types are now eligible for
removal by the linker.

Oversimplifying, the "real" cause of the crash is that when:

 1. We have a "non-bound" type which implements a Java interface,
    such as `TextWatcherImplementor`, *and*

 2. The linker decides that no IL-visible code uses that Java
    interface, and decides to remove that interface

then we're going to be in a world of hurt.

The fix is to update `MonoDroid.Tuner.MarkJavaObject` so that if
we're preserving a type, we also explicitly preserve all Java
interfaces implemented by the type as well, *if the type is not bound*.
This allows a linked `TextWatcherImplementor` to continue to implement
`ITextWatcher`, which in turn causes `ITextWatcherInvoker` to be
preserved, which prevents the `TypeLoadException` from occurring.

We determine that a type is "bound" by looking for:

  * `[Android.Runtime.RegisterAttribute (…, DoNotGenerateAcw=true)]`, or
  * `[Java.Interop.JniTypeSignatureAttribute (…, GenerateJavaPeer=false)]`

A `Java.Lang.Object` subclass which *isn't* "bound" is considered to
be "non-bound").

We don't want to preserve all Java interfaces for all types,
including bound types, because that isn't necessary and causes app
sizes to balloon.

[0]: https://developer.android.com/reference/com/google/android/material/textfield/TextInputEditText
[1]: https://github.com/xamarin/xamarin-android/blob/619420ae1d77d0ff3ec1b59afd156bfdd63c5c26/src/Mono.Android/Android.Text/ITextWatcher.cs#L52-L93
[2]: https://github.com/xamarin/xamarin-android/wiki/Blueprint#java-type-registration
@github-actions github-actions bot locked and limited conversation to collaborators Jan 24, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

TypeLoadException when registering TextChanged event on TextView
2 participants