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