Summary
Opening any module''s WebUI crashes the activity during view attach, before the module content loads. The crash comes from the built-in FileChooserInterface being instantiated by reflection with a constructor signature (WXOptions) that does not exist on the resolved class. It is module-independent — the same modules open fine with the legacy engine ("WebUI MX").
Environment
- WebUI-X-Portable
v537-release (versionCode 537), package com.dergoogler.mmrl.wx.alpha
- Android 16 (SDK 36), Android System WebView 150.0.7871.46
- Device: OnePlus 15 (canoe), OxygenOS CPH2747_16.0.8.300
- Root: KernelSU 4.1.0 (SukiSU/ReSukiSU)
Steps to reproduce
- Install any KernelSU module shipping a
webroot/ WebUI (minimal config.json {"title":"X","icon":"icon.png"} is enough).
- Open its WebUI with WebUI-X (launches
com.dergoogler.mmrl.wx.ui.activity.webui.WebUIActivity).
Expected
The module WebUI renders.
Actual
The activity window dies right after setContentView / onAttachedToWindow ("app died, no saved state", "Channel is unrecoverably broken"). The WebUI never loads. The same module works with the legacy WebUI engine.
Logcat (key stack trace)
E JavaScriptInterfaceImplementation.createNewWX(...): Failed to create WX instance for FileChooserInterface
E JavaScriptInterfaceImplementation.createNewWX(...): java.lang.NoSuchMethodException:
com.dergoogler.mmrl.hybridwebui.interfaces.prebuilt.FileChooserInterface.<init>
[class com.dergoogler.mmrl.webui.interfaces.WXOptions]
at java.lang.Class.getConstructor0(Class.java:3387)
at java.lang.Class.getDeclaredConstructor(Class.java:3069)
at com.dergoogler.mmrl.ext.JavaScriptInterfaceExtKt.createNewWX(JavaScriptInterfaceExt.kt:16)
at com.dergoogler.mmrl.webui.view.WebUIView.addJavascriptInterface(WebUIView.kt:267)
at com.dergoogler.mmrl.wx.ui.activity.webui.WebUIActivity.init$lambda$4$lambda$3$lambda$2(WebUIActivity.kt:219)
at com.dergoogler.mmrl.hybridwebui.HybridWebUI.setupDependencies(HybridWebUI.kt:106)
at com.dergoogler.mmrl.hybridwebui.HybridWebUI.onAttachedToWindow(HybridWebUI.kt:77)
at android.view.View.dispatchAttachedToWindow(View.java:23638)
...
Analysis
JavaScriptInterfaceExtKt.createNewWX reflectively resolves FileChooserInterface.<init>(com.dergoogler.mmrl.webui.interfaces.WXOptions), but the bundled com.dergoogler.mmrl.hybridwebui.interfaces.prebuilt.FileChooserInterface has no such constructor — a version skew between the hybridwebui and webui modules in this build. Since this prebuilt interface is injected for every module, no WebUI can open.
Suggested fixes: align the hybridwebui / webui versions, or guard createNewWX so a missing prebuilt-interface constructor is logged and skipped instead of crashing the activity.
Summary
Opening any module''s WebUI crashes the activity during view attach, before the module content loads. The crash comes from the built-in
FileChooserInterfacebeing instantiated by reflection with a constructor signature(WXOptions)that does not exist on the resolved class. It is module-independent — the same modules open fine with the legacy engine ("WebUI MX").Environment
v537-release(versionCode 537), packagecom.dergoogler.mmrl.wx.alphaSteps to reproduce
webroot/WebUI (minimalconfig.json{"title":"X","icon":"icon.png"}is enough).com.dergoogler.mmrl.wx.ui.activity.webui.WebUIActivity).Expected
The module WebUI renders.
Actual
The activity window dies right after
setContentView/onAttachedToWindow("app died, no saved state", "Channel is unrecoverably broken"). The WebUI never loads. The same module works with the legacy WebUI engine.Logcat (key stack trace)
Analysis
JavaScriptInterfaceExtKt.createNewWXreflectively resolvesFileChooserInterface.<init>(com.dergoogler.mmrl.webui.interfaces.WXOptions), but the bundledcom.dergoogler.mmrl.hybridwebui.interfaces.prebuilt.FileChooserInterfacehas no such constructor — a version skew between thehybridwebuiandwebuimodules in this build. Since this prebuilt interface is injected for every module, no WebUI can open.Suggested fixes: align the
hybridwebui/webuiversions, or guardcreateNewWXso a missing prebuilt-interface constructor is logged and skipped instead of crashing the activity.