web-dev-qa-db-ja.com

javascriptインターフェースのproguardを構成する方法は?

JavascriptInterfaceを利用するWebviewを実装しました。難読化していないときは正常に機能していますが、Proguardがアクティブになると、機能しません。私はここで他の答えを見てきましたが、それでもうまくいきません。

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);
    }
}

Proguardで試したこと

-keep public class * implements com.project.NonObfuscateable
-keepclassmembers class * implements NonObfuscateable {
    public void processHTML(Java.lang.String);
}

私もこれを試しました(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>;
}

誰かが何が間違っている可能性があるかについての考えを持っていますか?前もって感謝します

24
Ikky

タイプミスが含まれていなければ、両方の構成が機能していた可能性があります。

  • ProGuardには完全修飾名が必要です:

    NonObfuscateable-> com.project.NonObfuscateable

  • コンパイルされたクラスは、内部クラスの区切り文字として「$」を使用します。

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

ProGuardは、コンソールログに、そのような疑わしいタイプミスに関するメモを出力します。

注釈付きのJavascriptインターフェースメソッドを保持するためのより一般的なソリューション:

-keepclassmembers class * {
    @Android.webkit.JavascriptInterface <methods>;
}
40
Eric Lafortune

私の場合、コードのみを実行します。

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

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() {
            ...
        }

    }
    ...
}
4
Tapa Save

難読化を使用している場合は、 Eric Lafortuneの回答 に加えて、次のものも必要です。

-keepattributes JavascriptInterface

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

1
Heath Borders