tutorial - Error de la interfaz Javascript de Android Proguard
proguard tutorial (4)
Utilizo en mi proyecto un fragmento de código como se describe aquí
http://lexandera.com/2009/01/extracting-html-from-a-webview/
Creo el archivo .apk, lo instalo en mi dispositivo y funciona correctamente. Si trato de usar la ofuscación con proguard el proyecto falla, no se alcanza el método showHTML (String html) de MyJavaScriptInterface.
Mi configuración proguard con respecto a eso
-keep public class com.mypackage.MyClass.MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass.MyJavaScriptInterface
-keepclassmembers class * implements com.mypackage.MyClass.MyJavaScriptInterface {
<methods>;
}
de acuerdo con esto, esta respuesta Android Proguard problema de la interfaz de Javascript .
SOLUCIONADO
Como Eric sugirió, cambié el archivo de configuración de Proguard así:
-keep public class com.mypackage.MyClass$MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface {
<methods>;
}
Ahora mi proyecto funciona a la perfección.
Para API 17+, también necesita conservar las anotaciones @JavascriptInterface:
-keepattributes JavascriptInterface
http://developer.android.com/reference/android/webkit/JavascriptInterface.html
Aquellos que están holgazanes para proporcionar la ruta completa del paquete.
-keepclassmembers class **.*$PaymentJavaScriptInterface{
public *;
}
Según lo sugerido por la edición en cuestión, de esas sugerencias, solo el uso
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { public *; }
con Importante -
Para la API 17+ para conservar las anotaciones de @JavascriptInterface:
-keepattributes JavascriptInterface
(Lo cual impedía que mi aplicación funcionara en Marshmallow)
Si MyJavaScriptInterface es una clase interna de MyClass, ProGuard espera un nombre totalmente calificado com.mypackage.MyClass$MyJavaScriptInterface
. La convención de nomenclatura con $
se usa en los archivos de clase compilados en los que opera ProGuard. Tenga en cuenta que ProGuard menciona nombres de clase en la configuración que no puede encontrar en el contenedor de entrada, lo que sugiere que estos nombres pueden haber sido mal escritos.
-keepclassmembers class com.mypackage.MyClass$JavaScriptInterface {
public *;
}
Usa solo esto Esto funciona para mi.