Сбой интерфейса 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
Ответы
Ответ 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)