2012-11-30 1 views
2

У меня проблема с Android 4.2 с proguard.JavascriptInterface не работает с proguard на Android 4.2

В основном я использую JavascriptInterface на WebView так:

public class MyJavascriptInterface { 
    public void doSomething() { ... } 
} 

Теперь я понимаю, что когда ProGuard запутывает код переименовывает имя класса и имя метода, поэтому он не может быть вызван из Javascript больше. Вот почему я должен добавить это к Proguard конфигурации:

-keepclassmembers class mypackage.MyJavascriptInterface { 
    public void doSomething(); 
} 

Когда я поставил цель SDK 17 (Android 4.2) Я должен добавить @JavascriptInterface аннотацию к моему методу Javascript интерфейса по соображениям безопасности:

@JavascriptInterface 
public class MyJavascriptInterface { 
    public void doSomething() { ... } 
} 

Теперь проблема в том, что это не работает, если proguard включен (doSomething не вызывается, как будто класс все еще переименован на этапе обфускации). Если я отключу proguard, код работает нормально.

Как я могу сделать эту работу с целевым sdk 17?

+0

Для меня функция интерфейса javascript не называется, пожалуйста, скажите мне, что мне делать ??? – Ravi

+0

Не могу сказать с этим описанием вашей проблемы ... Вы могли бы открыть новый вопрос и подробно описать свою установку, возможно, разместите соответствующий код андроида и javascript;) – Tim

+0

http://stackoverflow.com/a/17637530/ 9636 и http://stackoverflow.com/a/28034176/9636 - более обобщенные ответы. –

ответ

9

Я нашел решение, я просто должен сказать proguard, чтобы сохранить аннотацию JavascriptInterface. Я добавил это в моей конфигурации Proguard, чтобы заставить его работать:

-keepattributes JavascriptInterface 
3

Чтобы сохранить любые аннотации, вы должны добавить следующие строки в конфигурации ProGuard:

-keepattributes *Annotation* 

Файлы классов представляют аннотацию JavascriptInterface в виде class атрибута типа «RuntimeAnnotation» со значением «android.webkit.JavascriptInterface».

+0

Вам нужны только '-keepattributes * Annotation * ', если вы используете обфускацию. http://proguard.sourceforge.net/manual/usage.html#obfuscationoptions –

3

Через глядя на mapping.txt и dump.txt файлы, созданные и много проб и ошибок (я составил 34 APK-файлы, чтобы понять это), я пришел с этим рабочим раствором:

-keep public class com.yourfullpackagename.Yourapp$JavaScriptInterface 
-keepclassmembers class com.yourfullpackagename.Yourapp$JavaScriptInterface {*;} 
-keepattributes com.yourfullpackagename.Yourapp$JavaScriptInterface 
-keepattributes *Annotation* 

(Предположим, что JavaScriptInterface является внутренним классом в Activity, называемом Yourapp, в пространстве имен com.yourfullpackagename. Соответствующе для вашего приложения.)