JavaScript インターフェース用に Proguard を設定するにはどうすればいいですか? 質問する

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

何が問題なのか分かる人はいますか?よろしくお願いします

ベストアンサー1

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

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

    NonObfuscateable->com.project.NonObfuscateable

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

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

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

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

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

おすすめ記事