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.onCreateViewWebView に公開されるオブジェクトを作成します * JavaScript インターフェイスが追加されますWebViewClient.onPageFinished * 公開されるクラスはパブリックです * 公開されるクラスのすべてのメソッドはパブリックであり、@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 に関して別のことを行う必要があるかどうかを確認しましたが、何も見つからないようです。

失敗する理由は何ですか?

4

1 に答える 1

2

申し訳ありませんが、WebView にバグがありました: http://crbug.com/491800

このバグは Android 5.1 で導入されたため、元の 5.0 (エミュレータ) は正常に動作します。ただし、Play ストアを備えた物理 Lollipop デバイスでは、WebView は新しいバージョン (43) に更新されますが、これはまだ壊れていました。この修正は、WebView バージョン 44 で公開されました。これは、現在ロールアウトされていると思います。

ただし、回避策があります。のインスタンスを受け入れる注入されたメソッドではAjaxRequest、引数の型を に置き換えてから、関数の後半で にObject変換する必要があります (例については、このコメントを参照してください)。このようにして、WebView は、その時点でアクセスできないクラスの検索を停止します。AjaxRequest

于 2015-07-21T03:29:32.503 に答える