2013-07-23 14 views
7

Mam klasy JSBridge (wewnętrzna klasy), które jest JavaScript, interfejs:Proguard zatrzymuje Javascript w WebView z pracy

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

Działa to dobrze, dopóki ja uwolnienie zbudować z PROGUARD. Próbowałem po kilku innych odpowiedzi SO i dodałem następujące linie do mojego pliku proguard, ale to nie pomogło. Rezultatem jest wersja debugowania, do którego dostaję wywołania zwrotne, wersja wydania, w której nie otrzymuję wywołań zwrotnych.

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

Odpowiedz

17

Jeśli metody interfejsu JavaScript są opatrzone @JavascriptInterface, można zachować je

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

Ahh tak myślę, że widziałem to w dokumentacji, zamieszanie było, myślałem, że powinienem umieść pakiet w mojej rzeczywistej klasie interfejsu javascript. To działało po raz pierwszy! – serenskye

+0

Mam dziwny przypadek, wyeksportowałem moją aplikację przy użyciu powyższych konfiguracji i działało w systemie Android 2.3.7, ale nie na nexusie 5 (Android 4.2) – StarWars