Сбой интерфейса Javascript в Android Proguard - PullRequest
38 голосов
/ 08 июня 2011

Я использую в своем проекте кусок кода, как описано здесь

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

Я создаю файл .apk, устанавливаю его на свое устройство, и он работает правильно.Если я попытаюсь использовать обфускацию с 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>; 
}

согласно этому этомуответ Android proguard Проблема интерфейса Javascript .

РЕШЕНО.

Как предположил Эрик, я изменил файл конфигурации 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

Ответы [ 4 ]

32 голосов
/ 08 июня 2011

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

4 голосов
/ 17 сентября 2015
    -keepclassmembers class com.mypackage.MyClass$JavaScriptInterface {    
public *;
     }

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

2 голосов
/ 26 мая 2016

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

-keepclassmembers class **.*$PaymentJavaScriptInterface{
public *;
}
1 голос
/ 26 августа 2016

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

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

с Важно -

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

-keepattributes JavascriptInterface

(что мешало моему приложению работать над Зефиром)

...