首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何配置javascript界面的proguard?

如何配置javascript界面的proguard?
EN

Stack Overflow用户
提问于 2013-07-13 18:55:31
回答 3查看 14.4K关注 0票数 28

我已经实现了一个Webview,它使用了JavascriptInterface。它在没有混淆的时候工作得很好,但是一旦Proguard被激活,它就不能工作了。我看了这里的其他答案,但我仍然不能让它工作。

一些WebView类:

代码语言:javascript
复制
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);
    }
}

我在中尝试过的东西

代码语言:javascript
复制
-keep public class * implements com.project.NonObfuscateable
-keepclassmembers class * implements NonObfuscateable {
    public void processHTML(java.lang.String);
}

我也尝试过这个(当不实现NonObfuscateable接口

代码语言:javascript
复制
-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>;
}

有没有人知道可能出了什么问题?提前感谢

EN

回答 3

Stack Overflow用户

发布于 2013-07-14 15:52:38

如果不包含拼写错误,您的两种配置都可以正常工作:

  • ProGuard需要完全限定的名称:

NonObfuscateable -> com.project.NonObfuscateable

  • Compiled类使用'$‘作为内部类的分隔符:

com.project.Activity_Webview.JavaScriptInterface -> com.project.Activity_Webview$JavaScriptInterface

在控制台日志中,ProGuard会打印出有关此类疑似打字错误的说明。

保留带注释的Javascript接口方法的更一般的解决方案:

代码语言:javascript
复制
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}
票数 47
EN

Stack Overflow用户

发布于 2015-12-26 23:00:48

在我的例子中,只工作代码:

proguard.cfg:

代码语言:javascript
复制
-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代码:

代码语言:javascript
复制
@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() {
            ...
        }

    }
    ...
}
票数 4
EN

Stack Overflow用户

发布于 2015-01-20 05:57:27

如果您正在使用模糊处理,除了Eric Lafortune's answer之外,您还需要:

代码语言:javascript
复制
-keepattributes JavascriptInterface

http://proguard.sourceforge.net/manual/usage.html#obfuscationoptions

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17629507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档