Функциональность интерфейса Javascript Proguard во время таргетинга SDK в Android Manifest выше 17

У меня есть пользовательский Webview в моем проекте Android, как показано ниже:

public class MyWebView extends WebView { public MyWebView(Context context) { super(context); } public class JsObject { @JavascriptInterface public void show() { //... } @JavascriptInterface public void hide() { //.... } } 

Который включает JavascriptInterface который я использую для связи со стороны JavaScript на стороне Android.

В AndroidManifest у меня было следующее

 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> 

В проекте я использовал proguard, который заявил:

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

И все работает нормально.

Однако, когда я изменил свой AndroidManifest на android:targetSdkVersion=18 или 19 и протестировал на устройствах с 18 и выше, proguard, похоже, каким-то образом испортил методы JavaScript, которые больше не доступны.

Если я вернусь к 16 или что-нибудь меньшее, чем 17, все будет хорошо. Кроме того, это происходит только с proguard. Если я не использую proguard, все работает отлично даже с android:targetSdkVersion=18 или 19. Может ли кто-нибудь помочь заставить его работать при таргетинге в манифесте Android> 17?

Solutions Collecting From Web of "Функциональность интерфейса Javascript Proguard во время таргетинга SDK в Android Manifest выше 17"

Я копирую свой ответ из этой темы для вас: https://stackoverflow.com/a/19994873/1735499

И если вы используете Proguard, не забудьте добавить это

 -keepclassmembers class * { @android.webkit.JavascriptInterface <methods>; } -keepattributes JavascriptInterface -keep public class com.mypackage.MyClass$MyJavaScriptInterface -keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface -keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { <methods>; } 

Если это еще не все, добавьте это

 -keepattributes *Annotation* 

Примечание: ваш MyJavaScriptInterface должен быть открытым классом

Ref #: Ошибка интерфейса Javascript Android Proguard

Br,

Фрэнк

Этих 4 строк обычно достаточно – и нет необходимости публиковать интерфейс.

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

В моем случае, просто:

 -keepclassmembers class com.mypackage.MyJavaScriptInterface { public *; } -keepattributes *Annotation* 

Было достаточно!