Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[HybridWebView] fix trimmer warnings on Android (#24744)
Context: #23769 Context: dotnet/android#9300 026e046 introduced `HybridWebView`, which unfortunately introduces trimmer warnings in the `dotnet new maui` project template: > dotnet new maui > dotnet build -f net9.0-android -c Release -p:TrimMode=Full ... hellomaui succeeded with 1 warning(s) (7.9s) /_/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Android.cs(53,5): Trim analysis warning IL2026: Microsoft.Maui.Handlers.HybridWebViewHandler.HybridWebViewJavaScriptInterface.SendMessage(String): Using member 'Java.Interop.ExportAttribute.ExportAttribute(String)' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. [ExportAttribute] uses dynamic features. This is due to usage of `Java.Interop.ExportAttribute`: private sealed class HybridWebViewJavaScriptInterface : Java.Lang.Object { //... [JavascriptInterface] [Export("sendMessage")] public void SendMessage(string message) `Java.Interop.ExportAttribute` makes heavy usage of unbounded System.Reflection, System.Reflection.Emit, etc. for it to be able to work. It brings in an additional assembly `Mono.Android.Export.dll` as well. It is inherently trimming unsafe, but how did it get through these tests? https://github.com/dotnet/maui/blob/08ff1246383ed4fdaef84a40d5b2ae8e6096bb56/src/TestUtils/src/Microsoft.Maui.IntegrationTests/AndroidTemplateTests.cs#L50-L61 This slipped through, unfortunately, as we had missed solving all the trimmer warnings in `Mono.Android.Export.dll`! dotnet/android#9300 aims to fix that. After dotnet/android#9300, new trimming warnings specific to .NET MAUI will surface such as the one above. But we can easily replace `[Export]` by: * Define a Java interface & create a binding for it in C#, we already have `maui.aar` setup for this. * We can simply implement the interface in C# and remove `[Export]`. Lastly, I fixed some of the defaults in `Metadata.xml`, it didn't look like we were automatically making Java interfaces `internal`. It looks like we probably made `ImageLoaderCallback` public by mistake.
- Loading branch information