关于android:如何为Java界面配置proguard?

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