How to configure proguard for javascript interface?
我已经实现了一个使用JavascriptInterface的Webview。不进行混淆时,它可以正常工作,但是Proguard一次激活后,将无法工作。我在这里查看了其他答案,但仍然无法正常工作。
某些WebView类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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); } } |
我在Proguard中尝试过的操作:
1 2 3 4 | -keep public class * implements com.project.NonObfuscateable -keepclassmembers class * implements NonObfuscateable { public void processHTML(java.lang.String); } |
我也尝试过此方法(当未实现NonObfuscateable接口时:
1 2 3 4 5 6 | -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>; } |
有人有什么错的想法吗?
在此先感谢
如果您的配置都没有错别字,那么这两种配置都可以使用:
-
ProGuard需要完全限定的名称:
NonObfuscateable ->com.project.NonObfuscateable -
已编译的类使用\\'$ \\'作为内部类的分隔符:
com.project.Activity_Webview.JavaScriptInterface ->com.project.Activity_Webview$JavaScriptInterface
在控制台日志中,ProGuard打印出有关此类可疑打字错误的注释。
用于保留带注释的Javascript接口方法的更通用的解决方案:
1 2 3 | -keepclassmembers class * { @android.webkit.JavascriptInterface <methods>; } |
在我的情况下,仅工作代码:
proguard.cfg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | -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 |
Java代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | @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() { ... } } ... } |
如果您使用混淆处理,除了Eric Lafortune的答案外,您还需要:
1 | -keepattributes JavascriptInterface |
http://proguard.sourceforge.net/manual/usage.html#obfuscationoptions