私はこれに長い間苦労してきました。誰でも私を助けてくれることを願っています。これが私の状況です:
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 ストア経由でアップグレードできるようになりました。これは、エラーから示されるものでもあります。
DexPathList[[zip file "/system/app/webview/webview.apk"],nativeLibraryDirectories=[/system/app/webview/lib/x86_64, /vendor/lib64, /system/lib64]]
リリース ノートを調べて、WebView と addJavaScriptInterface に関して別のことを行う必要があるかどうかを確認しましたが、何も見つからないようです。
失敗する理由は何ですか?