3

我已经为此苦苦挣扎了太久了。我希望任何人都可以帮助我。这是我的情况:

在我们的 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 * 暴露的类是公共的 * 暴露的类的所有方法都是公共的并且有@JavascriptInterface注释

从 Lollipop 开始,WebView 已经与 Android 解耦,因此可以通过 Play Store 进行升级。这也是从错误中显示的内容:

DexPathList[[zip file "/system/app/webview/webview.apk"],nativeLibraryDirectories=[/system/app/webview/lib/x86_64, /vendor/lib64, /system/lib64]]

我查看了发行说明以发现我们是否必须对 WebView 和 addJavaScriptInterface 做一些不同的事情,但我似乎找不到任何东西。

任何人都知道它失败的原因是什么?

4

1 回答 1

2

抱歉,WebView 中有一个错误:http: //crbug.com/491800

该错误已在 Android 5.1 中引入,因此原始 5.0 可以正常工作(模拟器)。但是在带有 Play Store 的实体棒棒糖设备上,WebView 会更新到更高版本 (43),但仍然存在问题。该修复程序与 WebView 版本 44 一起发布,我认为该版本刚刚推出。

但是,有一种解决方法。在接受 的实例的注入方法中AjaxRequest,您需要将参数类型替换为Object,然后AjaxRequest在函数的后面转换为 (请参阅此注释以获取示例)。这样,WebView 将停止尝试查找此时无法访问的类。

于 2015-07-21T03:29:32.503 回答