¿Cómo configurar proguard para la interfaz javascript?
Tengo implementado una Webview que toma el uso de JavascriptInterface. Está funcionando bien cuando no está ofuscando, pero a la vez Proguard está activo, no funciona. He mirado aquí en otras respuestas, pero todavía no puedo conseguirlo el trabajar.
Algunos de la clase WebView:
- ¿Cómo puedo obfuscate una aplicación de Android fácilmente cuando se utiliza IntelliJ IDEA?
- Android Proguard ExceptionInInitializerError y RuntimeException
- Caída de aplicación con Proguard habilitado
- Ofuscación de Proguard y métodos genéricos
- ¿Cómo puedo comprobar / actualizar la versión Proguard cuando lo utilizo en Eclipse para el desarrollo de Android?
public class Activity_Webview { private WebView webView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); webView = (WebView) findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new JavaScriptInterface (), "HTMLOUT"); webView.setWebViewClient(mWebViewClient); } public class JavaScriptInterface implements NonObfuscateable{ @JavascriptInterface public void processHTML(String html) { handleFinishFromWebView(html); } }
Lo que he probado en Proguard :
-keep public class * implements com.project.NonObfuscateable -keepclassmembers class * implements NonObfuscateable { public void processHTML(java.lang.String); }
También he intentado esto (cuando no se implementa la interfaz NonObfuscateable :
-keep public class com.project.Activity_Webview.JavaScriptInterface -keep public class * implements com.project.Activity_Webview.JavaScriptInterface -keepclassmembers class * implements com.project.Activity_Webview.JavaScriptInterface { <fields>; <methods>; }
¿Alguien tiene una idea de lo que podría estar mal? Gracias por adelantado
- Cómo ofuscar una biblioteca de Android (archivo .jar) usando Proguard en Eclipse
- ¿Proguard mantiene nombres de clase?
- Código ofuscado
- La aplicación de Android se bloquea después de la ofuscación de proguard
- conflicto entre ksoap2 y actionbarscherlock usando Proguard
- Cómo ofuscar mi proyecto android en IDE eclipse?
- ¿Cómo desactivar todas las funciones de Android ProGuard, excepto la ofuscación?
- Opciones de Android Proguard: Reglas más estrictas y eliminar instrucciones de registro
Ambas configuraciones podrían haber funcionado si no hubieran contenido errores tipográficos:
-
ProGuard requiere nombres totalmente calificados:
NonObfuscateable
->com.project.NonObfuscateable
-
Las clases compiladas usan '$' como separador para las clases internas:
com.project.Activity_Webview.JavaScriptInterface
->com.project.Activity_Webview$JavaScriptInterface
En el registro de consola, ProGuard imprime notas sobre dichos errores sospechosos.
Una solución más general para mantener anotados los métodos de interfaz Javascript:
-keepclassmembers class * { @android.webkit.JavascriptInterface <methods>; }
Si estás usando obfuscation, además de la respuesta de Eric Lafortune también necesitas:
-keepattributes JavascriptInterface
http://proguard.sourceforge.net/manual/usage.html#obfuscationoptions
En mi caso sólo trabajo código:
Proguard.cfg:
-dontwarn -keepattributes Signature -keepattributes SetJavaScriptEnabled -keepattributes JavascriptInterface -keepattributes InlinedApi -keepattributes SourceFile,LineNumberTable -keepattributes *Annotation* -keepclassmembers class * { @android.webkit.JavascriptInterface <methods>; } -keepclassmembers class * { @android.webkit.JavascriptInterface <methods>; } -keepclassmembers class **.*$MyJavascriptInterface { *; } -keepclassmembers class **.*$JavaScriptInterface { *; } -keep public class **.*$MyJavascriptInteface -keep public class **.*$JavaScriptInterface
Código Java:
@SuppressLint("SetJavaScriptEnabled") public class ActivityWebView extends Activity { ... webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new MyJavascriptInterface(MyActivity.this), "MyJSI"); .... public class MyJavaScriptInterface { Context context; MyJavascriptInterface(Context context) { this.context = context; } @JavascriptInterface @SuppressWarnings("unused") public void myjavascriptfunction() { ... } } ... }
- Android – ¿Cómo instalar firmado APK en el dispositivo?
- Cómo obtener el archivo de leer línea por línea