WebView无法在Lollipop中找到通过addJavascript接口公开的对象

时间:2015-07-21 00:14:41

标签: android webview android-5.0-lollipop android-5.1.1-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的物理和虚拟设备 <&lt; 5。
  • 此代码在运行Android 5和5.1
  • 物理设备上中断
  • 此代码适用于运行Android 5.0的虚拟设备
  • 此代码在虚拟设备上运行Android 5.1
  • 运行调试或生成构建之间没有区别

有关代码的一些信息:  * WebViewFragment在MainActivity.onCreate中启动。  * WebViewFragment.onCreateView创建要向WebView公开的对象  * WebViewClient.onPageFinished中添加了JavaScript界面  *公开的类是公共的  *公开的类的所有方法都是公共的,并且具有@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和addJavaScriptInterface做一些不同的事情,但我似乎找不到任何东西。

任何人都有任何想法可能是它失败的原因吗?

1 个答案:

答案 0 :(得分:2)

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

该错误已在Android 5.1中引入,因此原始5.0工作正常(模拟器)。但是在使用Play Store的物理Lollipop设备上,WebView会更新到更高版本(43),但仍然存在损坏。这个修复程序出现在WebView版本44中,我认为它刚刚推出。

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