Intereting Posts
Как распечатать изображение на Bluetooth-принтере в Android? GetLastKnownLocation возвращает null Использование GCM на Android и iOS без полезной информации уведомления Как добавить дополнение к WebView Как использовать ThreeTenABP в Android-проекте Не удалось разрешить целевые «Google Inc.: API Google: 15» Можете ли вы запустить IntentService в отдельном процессе? Недопустимое исключение аргумента в диалоговом окне андроида Как вызвать локальный веб-сервис из мобильного приложения Android Как получать уведомления о каждом новом изображении, видимом в приложении галереи? Как получить изображения с устройства в приложении для Android android Определение макета. Msgstr "Вы должны указать атрибут layout_width." Ошибка Android Studio: Ошибка: CreateProcess error = 216, эта версия% 1 несовместима с версией Windows, в которой вы работаете Разница между версиями подписей – V1 (подпись Jar) и V2 (полная подпись APK) при генерации подписанного apk в AndroidStudio? Android Studio 2.3 sdk manager не открывается

Как настроить proguard для интерфейса javascript?

У меня есть Webview, который использует JavascriptInterface. Он отлично работает, когда не запутывает, но сразу Proguard активен, он не работает. Я смотрел здесь на другие ответы, но я все еще не могу заставить его работать.

Некоторые из классов WebView:

public class Activity_Webview { private WebView webView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); webView = (WebView) findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new JavaScriptInterface (), "HTMLOUT"); webView.setWebViewClient(mWebViewClient); } public class JavaScriptInterface implements NonObfuscateable{ @JavascriptInterface public void processHTML(String html) { handleFinishFromWebView(html); } } 

Что я пробовал в Proguard :

 -keep public class * implements com.project.NonObfuscateable -keepclassmembers class * implements NonObfuscateable { public void processHTML(java.lang.String); } 

Я также пробовал это (когда не реализовал интерфейс NonObfuscateable :

 -keep public class com.project.Activity_Webview.JavaScriptInterface -keep public class * implements com.project.Activity_Webview.JavaScriptInterface -keepclassmembers class * implements com.project.Activity_Webview.JavaScriptInterface { <fields>; <methods>; } 

Кто-нибудь знает, что может быть неправильно? заранее спасибо

Solutions Collecting From Web of "Как настроить proguard для интерфейса javascript?"

Обе ваши конфигурации могли бы работать, если бы они не содержали опечаток:

  • ProGuard требует полнофункциональных имен:

    NonObfuscateable -> com.project.NonObfuscateable

  • Скомпилированные классы используют '$' как разделитель для внутренних классов:

    com.project.Activity_Webview.JavaScriptInterface -> com.project.Activity_Webview$JavaScriptInterface

В журнале консоли ProGuard печатает заметки о таких подозрительных опечатках.

Более общее решение для хранения аннотированных методов интерфейса Javascript:

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

Если вы используете обфускацию, в дополнение к ответу Эрика Лафортунэна вам также понадобятся:

 -keepattributes JavascriptInterface 

http://proguard.sourceforge.net/manual/usage.html#obfuscationoptions

В моем случае работает только код:

proguard.cfg:

 -dontwarn -keepattributes Signature -keepattributes SetJavaScriptEnabled -keepattributes JavascriptInterface -keepattributes InlinedApi -keepattributes SourceFile,LineNumberTable -keepattributes *Annotation* -keepclassmembers class * { @android.webkit.JavascriptInterface <methods>; } -keepclassmembers class * { @android.webkit.JavascriptInterface <methods>; } -keepclassmembers class **.*$MyJavascriptInterface { *; } -keepclassmembers class **.*$JavaScriptInterface { *; } -keep public class **.*$MyJavascriptInteface -keep public class **.*$JavaScriptInterface 

Код Java:

 @SuppressLint("SetJavaScriptEnabled") public class ActivityWebView extends Activity { ... webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new MyJavascriptInterface(MyActivity.this), "MyJSI"); .... public class MyJavaScriptInterface { Context context; MyJavascriptInterface(Context context) { this.context = context; } @JavascriptInterface @SuppressWarnings("unused") public void myjavascriptfunction() { ... } } ... }