38 votes

Échec de l'interface Javascript de Android Proguard

J'utilise dans mon projet un morceau de code comme décrit ici

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

Je crée le fichier .apk, je l'installe sur mon appareil et il fonctionne correctement. Si j'essaie d'utiliser l'obfuscation avec proguard le projet échoue, la méthode showHTML(String html) de MyJavaScriptInterface n'est pas atteinte.

Ma configuration proguard concernant cela

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

d'après cette réponse Proguard Android problème d'interface Javascript .

SOLVÉ.

Comme Eric l'a suggéré, j'ai modifié le fichier de configuration de Proguard comme suit :

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

Maintenant, mon projet fonctionne parfaitement.

Pour l'API 17+, vous devez également préserver les annotations @JavavascriptInterface :

-keepattributes JavascriptInterface

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

32voto

Eric Lafortune Points 17656

Si MyJavaScriptInterface est une classe interne de MyClass, ProGuard s'attend à un nom entièrement qualifié. com.mypackage.MyClass$MyJavaScriptInterface . La convention de dénomination avec $ est utilisé dans les fichiers de classe compilés sur lesquels ProGuard fonctionne. Notez que ProGuard mentionne des noms de classes dans la configuration qu'il ne peut pas trouver dans le jar d'entrée, suggérant que ces noms peuvent avoir été mal orthographiés.

4voto

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

N'utilisez que ça. Ça marche pour moi.

2voto

Nantha kumar Points 9

Ceux qui sont paresseux pour fournir le chemin complet du paquet.

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

1voto

Darpan Points 709

Comme suggéré par l'éditeur en question, parmi ces suggestions, seule l'utilisation

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

avec Important -

Pour l'API 17+ afin de préserver les annotations @JavascriptInterface :

-keepattributes JavascriptInterface

(Ce qui empêchait mon application de fonctionner sur Marshmallow)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X