android - temas - ¿Cómo configurar el programa para la interfaz javascript?
netbeans themes (3)
Ambas configuraciones podrían haber funcionado si no hubieran contenido errores tipográficos:
ProGuard requiere nombres completos:
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 la consola, ProGuard imprime notas sobre dichos errores tipográficos sospechosos.
Una solución más general para mantener los métodos de interfaz de Javascript anotados:
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
He implementado una vista web que usa JavascriptInterface. Funciona bien cuando no es confuso, pero al mismo tiempo Proguard está activo, no funciona. He mirado aquí otras respuestas, pero todavía no puedo hacer que funcione.
Algunas de las clases de WebView:
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 implemento 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
En mi caso solo 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 de 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() {
...
}
}
...
}
Si está utilizando ofuscación, además de la respuesta de Eric Lafortune, también necesita:
-keepattributes JavascriptInterface
http://proguard.sourceforge.net/manual/usage.html#obfuscationoptions