Подтвердить что ты не робот

Сбой интерфейса Javascript для Android Proguard

В моем проекте я использую фрагмент кода, описанный здесь

http://lexandera.com/2009/01/extracting-html-from-a-webview/

Я создаю файл .apk, устанавливаю его на свое устройство, и он корректно работает. Если я попытаюсь использовать obfuscation с proguard, проект провалится, метод showHTML (String html) MyJavaScriptInterface не будет достигнут.

Моя конфигурация proguard относительно этого

-keep public class com.mypackage.MyClass.MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass.MyJavaScriptInterface
-keepclassmembers class * implements com.mypackage.MyClass.MyJavaScriptInterface { 
    <methods>; 
}

в соответствии с этим ответом Проблема с Javascript для Android proguard.

решаемые.

Как предложил Эрик, я изменил конфигурационный файл Proguard следующим образом:

-keep public class com.mypackage.MyClass$MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { 
    <methods>; 
}

Теперь мой проект отлично работает.

Для API 17+ вам также необходимо сохранить аннотации @JavascriptInterface:

-keepattributes JavascriptInterface

http://developer.android.com/reference/android/webkit/JavascriptInterface.html

4b9b3361

Ответ 1

Если MyJavaScriptInterface является внутренним классом MyClass, ProGuard ожидает полное имя com.mypackage.MyClass$MyJavaScriptInterface. Соглашение об именах с $ используется в файлах скомпилированных классов, на которых работает ProGuard. Обратите внимание, что ProGuard упоминает имена классов в конфигурации, которые она не может найти во входной банке, что указывает на то, что эти имена могут быть написаны с ошибкой.

Ответ 2

    -keepclassmembers class com.mypackage.MyClass$JavaScriptInterface {    
public *;
     }

Используйте только это. Это работает для меня.

Ответ 3

Те, кому нелегко предоставить весь путь пакета.

-keepclassmembers class **.*$PaymentJavaScriptInterface{
public *;
}

Ответ 4

Как было предложено в результате редактирования, из этих предложений, используя только

-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { public *; }

с Важным -

Для API 17+ для сохранения аннотаций @JavascriptInterface:

-keepattributes JavascriptInterface

(что останавливало мое приложение для работы над Marshmallow)