8

私はjavascriptインターフェースであるクラスJSBridge(内部クラス)を持っています:

private class JsBridge implements JsCallback {

    /**
     * @param handlerName method required
     * @param jsonData    data passed through from javascript
     * @param jsCallback  A callback to trigger when handler specified by handlername has finished, could be null
     */
    @JavascriptInterface
    public void callHandler(final String handlerName, final String jsonData, final String jsCallback) {
        Log.d(App.TAG, "Bridge call from JS,  received " + handlerName);
    }

    @JavascriptInterface
    public void onPageLoad(final String pageName) {
        Log.d(App.TAG, "Bridge call from JS,  received onPageLoad - we have the page name " + pageName);
    }

これは、proguard でリリース ビルドを行うまで問題なく動作します。私は他のいくつかのSOの回答に従ってみましたが、次の行をproguardファイルに追加しましたが、役に立ちませんでした. 結果は、コールバックを取得するデバッグ バージョンと、コールバックを取得しないリリース バージョンです。

-keep public class * implements com.mixcloud.player.view.JsCallback

-keepclassmembers class * implements com.mixcloud.player.view.JsCallback {
    <methods>;
}
-keep public class * implements com.mixcloud.player.view.JsCallback

-keepattributes *Annotation*
-keepattributes JavascriptInterface
-keep public class com.mixcloud.player.view.JSRefreshWebView
-keep public class com.mixcloud.player.view.JSRefreshWebView$JsBridge
-keep public class * implements com.mixcloud.player.view.JSRefreshWebView$JsBridge
-keepclassmembers class * implements com.mixcloud.player.view.JSRefreshWebView$JsBridge {
    <methods>;
}
4

1 に答える 1

19

Javascript インターフェイス メソッドに @JavascriptInterface のアノテーションが付けられている場合は、それらを次のように保持できます。

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}
于 2013-07-28T13:06:45.050 に答える