Intereting Posts
Невозможно одновременно обрабатывать события click и touch Преобразование в формат Dalvik завершилось ошибкой с ошибкой 1, так как facebook SDK Тип ошибки 3: Класс активности {…} не существует Диалоговая проблема: requestFeature () необходимо вызвать перед добавлением содержимого Есть ли способ установить параметр базового запроса для включения в каждый запрос, сделанный с помощью библиотеки Square's Retrofit? Почему память кучи увеличивается при повторном запуске? Как изменить текущий цвет ярлыка вкладки в Android ViewPager? Использование глобальной обработки исключений на Android Как использовать Roboto в XML-макете Как изменить размер значка элемента меню в NavigationView? Сериализовать POJO для JSON с помощью GSON Использование моей собственной предварительно созданной общей библиотеки в проекте Android NDK Почему Android не использует больше перечислений? Создание плавного угасания изображения в андроиде Перенаправить stdout для logcat в Android NDK

Как настроить 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() { ... } } ... }