WebView 找不到通过 Lollipop 中的 addJavascriptinterface 公开的对象
WebView cannot find objects exposed via addJavascriptinterface in Lollipop
我已经为此苦苦挣扎了太久。我希望任何人都可以帮助我。这是我的情况:
在我们的 Android 应用程序中,我们通过 Java/Android 从 WebView 路由 XMLHttpRequests,因此我们可以添加 OAuth2 令牌并跟踪请求。在 Android 5 发布之前,这一切都很好。
从 Android 5 开始,每当 WebView 尝试与 JavaScript 中公开的对象交互时,都会引发以下异常:
java.lang.ClassNotFoundException: Didn't find class "com/company/android/AndroidXMLHttpRequest$AjaxRequest" on path: DexPathList[[zip file "/system/app/webview/webview.apk"],nativeLibraryDirectories=[/system/app/webview/lib/x86_64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:53)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
Suppressed: java.lang.ClassNotFoundException: Invalid name: com/company/android/AndroidXMLHttpRequest$AjaxRequest
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 6 more
不同配置的结果:
- 此代码在 物理和虚拟设备上运行良好 运行 Android < 5.
- 此代码在 物理设备上中断 运行 Android 5 和 5.1
- 此代码在 虚拟设备 运行 Android 5.0
上运行良好
- 此代码在 虚拟设备上中断 运行 Android 5.1
- 运行调试或生产构建之间没有区别
关于代码的一些信息:
* WebViewFragment 在 MainActivity.onCreate
中启动。
* WebViewFragment.onCreateView
创建要暴露给 WebView 的对象
* JavaScript 接口添加到 WebViewClient.onPageFinished
* 暴露的class是Public
* 公开的class的所有方法都是public并且有@JavascriptInterface
注解
启动 Lollipop,WebView 已与 Android 分离,因此可以通过 Play 商店升级。这也是从错误中显示的内容:
DexPathList[[zip file "/system/app/webview/webview.apk"],nativeLibraryDirectories=[/system/app/webview/lib/x86_64, /vendor/lib64, /system/lib64]]
我查看了发行说明以了解我们是否必须对 WebView 和添加JavaScript接口做一些不同的事情,但我似乎找不到任何东西。
有人知道它失败的原因是什么吗?
抱歉,WebView 中存在错误:http://crbug.com/491800
该错误已在 Android 5.1 中引入,因此原始 5.0 可以正常工作(模拟器)。但是在带有 Play Store 的物理 Lollipop 设备上,WebView 会更新到更高版本 (43),但仍然存在问题。该修复程序随 WebView 版本 44 一起发布,我认为它刚刚推出。
但是,有一个解决方法。在接受AjaxRequest
实例的注入方法中,需要将参数类型替换为Object
,然后在函数后面转换为AjaxRequest
(参见this comment一个例子)。这样,WebView 将停止尝试查找此时无法访问的 class。
我已经为此苦苦挣扎了太久。我希望任何人都可以帮助我。这是我的情况:
在我们的 Android 应用程序中,我们通过 Java/Android 从 WebView 路由 XMLHttpRequests,因此我们可以添加 OAuth2 令牌并跟踪请求。在 Android 5 发布之前,这一切都很好。
从 Android 5 开始,每当 WebView 尝试与 JavaScript 中公开的对象交互时,都会引发以下异常:
java.lang.ClassNotFoundException: Didn't find class "com/company/android/AndroidXMLHttpRequest$AjaxRequest" on path: DexPathList[[zip file "/system/app/webview/webview.apk"],nativeLibraryDirectories=[/system/app/webview/lib/x86_64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:53)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
Suppressed: java.lang.ClassNotFoundException: Invalid name: com/company/android/AndroidXMLHttpRequest$AjaxRequest
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 6 more
不同配置的结果:
- 此代码在 物理和虚拟设备上运行良好 运行 Android < 5.
- 此代码在 物理设备上中断 运行 Android 5 和 5.1
- 此代码在 虚拟设备 运行 Android 5.0 上运行良好
- 此代码在 虚拟设备上中断 运行 Android 5.1
- 运行调试或生产构建之间没有区别
关于代码的一些信息:
* WebViewFragment 在 MainActivity.onCreate
中启动。
* WebViewFragment.onCreateView
创建要暴露给 WebView 的对象
* JavaScript 接口添加到 WebViewClient.onPageFinished
* 暴露的class是Public
* 公开的class的所有方法都是public并且有@JavascriptInterface
注解
启动 Lollipop,WebView 已与 Android 分离,因此可以通过 Play 商店升级。这也是从错误中显示的内容:
DexPathList[[zip file "/system/app/webview/webview.apk"],nativeLibraryDirectories=[/system/app/webview/lib/x86_64, /vendor/lib64, /system/lib64]]
我查看了发行说明以了解我们是否必须对 WebView 和添加JavaScript接口做一些不同的事情,但我似乎找不到任何东西。
有人知道它失败的原因是什么吗?
抱歉,WebView 中存在错误:http://crbug.com/491800
该错误已在 Android 5.1 中引入,因此原始 5.0 可以正常工作(模拟器)。但是在带有 Play Store 的物理 Lollipop 设备上,WebView 会更新到更高版本 (43),但仍然存在问题。该修复程序随 WebView 版本 44 一起发布,我认为它刚刚推出。
但是,有一个解决方法。在接受AjaxRequest
实例的注入方法中,需要将参数类型替换为Object
,然后在函数后面转换为AjaxRequest
(参见this comment一个例子)。这样,WebView 将停止尝试查找此时无法访问的 class。