Skip to content

Commit

Permalink
[Microsoft.Android.Sdk.IlLink] preserve methods in Android.Runtime cl…
Browse files Browse the repository at this point in the history
…asses (dotnet#6675)

Fixes: dotnet/maui#2246
Fixes: dotnet/maui#4262
Fixes: https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1447865

Context: b7a368a

Revert "[One .NET] Do not preserve IO stream adapter/invoker (dotnet#5449)"

This reverts commit 051cad7.

If you run the `maui-blazor` template in a Release build:

	dotnet build -t:Run -c Release

it crashes at runtime:

	Android.Runtime.JavaProxyThrowable: Exception_WasThrown, Android.Runtime.JavaProxyThrowable
	--- End of managed Android.Runtime.JavaProxyThrowable stack trace ---
	android.runtime.JavaProxyThrowable: System.ArgumentException: Arg_DlgtTargMeth
	  at System.Delegate.CreateDelegate(Type , Type , String , Boolean , Boolean )
	  at System.Delegate.CreateDelegate(Type , Type , String )
	  at Android.Runtime.AndroidTypeManager.RegisterNativeMembers(JniType , Type , String )
	--- End of stack trace from previous location ---
	  at Java.Interop.JniEnvironment.StaticMethods.CallStaticObjectMethod(JniObjectReference , JniMethodInfo , JniArgumentValue* )
	  at Android.Runtime.JNIEnv.CallStaticObjectMethod(IntPtr , IntPtr , JValue* )
	  at Android.Runtime.JNIEnv.CallStaticObjectMethod(IntPtr , IntPtr , JValue[] )
	  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.Runtime.InputStreamAdapter..ctor(Stream )
	  at Android.Runtime.InputStreamAdapter.ToLocalJniHandle(Stream )
	  at Android.Webkit.WebResourceResponse..ctor(String , String , Int32 , String , IDictionary`2 , Stream )
	  at Microsoft.AspNetCore.Components.WebView.Maui.WebKitWebViewClient.ShouldInterceptRequest(WebView view, IWebResourceRequest request)
	  at Android.Webkit.WebViewClient.n_ShouldInterceptRequest_Landroid_webkit_WebView_Landroid_webkit_WebResourceRequest_(IntPtr , IntPtr , IntPtr , IntPtr )
	  at crc64d693e2d9159537db.WebKitWebViewClient.n_shouldInterceptRequest(Native Method)
	  at crc64d693e2d9159537db.WebKitWebViewClient.shouldInterceptRequest(WebKitWebViewClient.java:39)
	  at Rr.a(chromium-TrichromeWebViewGoogle.apk-stable-410410686:16)
	  at org.chromium.android_webview.AwContentsBackgroundThreadClient.shouldInterceptRequestFromNative(chromium-TrichromeWebViewGoogle.apk-stable-410410686:2)
	--- End of managed Android.Runtime.JavaProxyThrowable stack trace ---
	android.runtime.JavaProxyThrowable: System.ArgumentException: Arg_DlgtTargMeth
	  at System.Delegate.CreateDelegate(Type , Type , String , Boolean , Boolean )
	  at System.Delegate.CreateDelegate(Type , Type , String )
	  at Android.Runtime.AndroidTypeManager.RegisterNativeMembers(JniType , Type , String )
	--- End of stack trace from previous location ---
	  at Java.Interop.JniEnvironment.StaticMethods.CallStaticObjectMethod(JniObjectReference , JniMethodInfo , JniArgumentValue* )
	  at Android.Runtime.JNIEnv.CallStaticObjectMethod(IntPtr , IntPtr , JValue* )
	  at Android.Runtime.JNIEnv.CallStaticObjectMethod(IntPtr , IntPtr , JValue[] )
	  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.Runtime.InputStreamAdapter..ctor(Stream )
	  at Android.Runtime.InputStreamAdapter.ToLocalJniHandle(Stream )
	  at Android.Webkit.WebResourceResponse..ctor(String , String , Int32 , String , IDictionary`2 , Stream )
	  at Microsoft.AspNetCore.Components.WebView.Maui.WebKitWebViewClient.ShouldInterceptRequest(WebView view, IWebResourceRequest request)
	  at Android.Webkit.WebViewClient.n_ShouldInterceptRequest_Landroid_webkit_WebView_Landroid_webkit_WebResourceRequest_(IntPtr , IntPtr , IntPtr , IntPtr )
	  at crc64d693e2d9159537db.WebKitWebViewClient.n_shouldInterceptRequest(Native Method)
	  at crc64d693e2d9159537db.WebKitWebViewClient.shouldInterceptRequest(WebKitWebViewClient.java:39)
	  at Rr.a(chromium-TrichromeWebViewGoogle.apk-stable-410410686:16)
	  at org.chromium.android_webview.AwContentsBackgroundThreadClient.shouldInterceptRequestFromNative(chromium-TrichromeWebViewGoogle.apk-stable-410410686:2)

It turns out that `Java.IO.InputStream.GetReadHandler()` was
linked away.

So we need to preserve:

	<linker>
	    <assembly fullname="Mono.Android">
	        <type fullname="Android.Runtime.InputStreamAdapter" preserve="methods" />
	        <type fullname="Android.Runtime.InputStreamInvoker" preserve="methods" />

Long-term, we should consider reworking `mono.android.jar`, so that
the linker *knows* about any C# methods called from Java from this
library, or *drop* `mono.android.jar` & `mono.android.dex` and treat
`Mono.Android.dll` as a "normal user assembly"…

This regresses `.apk` size by ~16KB:

	--"PackageSize": 2680724
	++"PackageSize": 2697108

I considered adding:

	<type fullname="Android.Runtime.XmlResourceParserReader" />
	<type fullname="Android.Runtime.XmlPullParserReader" />
	<type fullname="Android.Runtime.XmlReaderResourceParser" />
	<type fullname="Android.Runtime.XmlReaderPullParser" />

But this regressed app size by too much!

	1,141,062 Package size difference 42.57% (of 2,680,724)
  • Loading branch information
jonathanpeppers authored Jan 28, 2022
1 parent d582b80 commit f61cd81
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
<assembly fullname="Mono.Android">
<type fullname="Android.Runtime.AnnotationAttribute" />
<type fullname="Android.Runtime.IJavaObject" />
<type fullname="Android.Runtime.InputStreamAdapter" preserve="methods" />
<type fullname="Android.Runtime.InputStreamInvoker" preserve="methods" />
<type fullname="Android.Runtime.JNIEnv">
<method name="Exit" />
<method name="Initialize" />
Expand All @@ -17,6 +19,8 @@
<type fullname="Android.Runtime.LogLevel" />
<type fullname="Android.Runtime.LogCategories" />
<type fullname="Android.Runtime.NamespaceMappingAttribute" />
<type fullname="Android.Runtime.OutputStreamAdapter" preserve="methods" />
<type fullname="Android.Runtime.OutputStreamInvoker" preserve="methods" />
<type fullname="Android.Runtime.PreserveAttribute" />
<type fullname="Android.Runtime.RaiseThrowableEventArgs" />
<type fullname="Android.Runtime.RegisterAttribute" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,31 @@
"Size": 3032
},
"assemblies/Java.Interop.dll": {
"Size": 54720
"Size": 55086
},
"assemblies/Mono.Android.dll": {
"Size": 78995
"Size": 83182
},
"assemblies/rc.bin": {
"Size": 1045
},
"assemblies/System.Linq.dll": {
"Size": 10152
"Size": 10157
},
"assemblies/System.Private.CoreLib.dll": {
"Size": 508217
"Size": 520945
},
"assemblies/System.Runtime.dll": {
"Size": 2404
"Size": 2410
},
"assemblies/UnnamedProject.dll": {
"Size": 3545
"Size": 3551
},
"classes.dex": {
"Size": 345328
},
"lib/arm64-v8a/libmonodroid.so": {
"Size": 382576
"Size": 382680
},
"lib/arm64-v8a/libmonosgen-2.0.so": {
"Size": 3176048
Expand All @@ -44,7 +44,7 @@
"Size": 150024
},
"lib/arm64-v8a/libxamarin-app.so": {
"Size": 12424
"Size": 12384
},
"META-INF/BNDLTOOL.RSA": {
"Size": 1213
Expand Down Expand Up @@ -80,5 +80,5 @@
"Size": 1904
}
},
"PackageSize": 2680724
"PackageSize": 2697108
}

0 comments on commit f61cd81

Please sign in to comment.