2013-07-23 2 views
7

ich eine Klasse JSBridge haben (eine innere Klasse), die eine Javascript-Schnittstelle ist:Proguard stoppt Javascript in WebView von der Arbeit

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); 
    } 

Das funktioniert gut, bis ich mit proguard ein Release bauen zu tun. Ich habe versucht, einige andere SO-Antworten zu folgen und die folgenden Zeilen zu meiner Proguard-Datei hinzugefügt, aber es hat nicht geholfen. Das Ergebnis ist die Debug-Version Ich bekomme die Callbacks, die Release-Version bekomme ich keine Callbacks.

-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>; 
} 

Antwort

17

Wenn Ihr Javascript Interface-Methoden mit @JavascriptInterface kommentierten sind, können Sie sie bewahren, mit

-keepclassmembers class * { 
    @android.webkit.JavascriptInterface <methods>; 
} 
+0

Ahh ja, ich denke, dass ich dies in der Dokumentation sah, die Verwirrung war, ich dachte, ich sollte zu Platziere das Paket mit meiner aktuellen Javascript Interface Klasse. Das hat zum ersten Mal geklappt! – serenskye

+0

Ich habe einen seltsamen Fall, ich habe meine App mit obigen Konfigurationen exportiert und es funktionierte in Android 2.3.7, aber nicht auf Nexus 5 (Android 4.2) – StarWars