web-dev-qa-db-ja.com

Android ProguardJavascriptインターフェースが失敗する

プロジェクトでは、ここで説明するコードを使用します

http://lexandera.com/2009/01/extracting-html-from-a-webview/

.apkファイルを作成し、デバイスにインストールすると、正しく機能します。プロジェクトが失敗するのを防ぐために難読化を使用しようとすると、MyJavaScriptInterfaceのメソッドshowHTML(String html)に到達しません。

それに関する私のproguard構成

-keep public class com.mypackage.MyClass.MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass.MyJavaScriptInterface
-keepclassmembers class * implements com.mypackage.MyClass.MyJavaScriptInterface { 
    <methods>; 
}

これによると、この答え Android proguard Javascriptインターフェイスの問題

解決済み。

Ericが提案したように、私はProguard構成ファイルを次のように変更しました。

-keep public class com.mypackage.MyClass$MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { 
    <methods>; 
}

今、私のプロジェクトは完璧に機能しています。

API 17以降の場合、@ JavascriptInterfaceアノテーションも保持する必要があります。

-keepattributes JavascriptInterface

http://developer.Android.com/reference/Android/webkit/JavascriptInterface.html

38
Denis

MyJavaScriptInterfaceがMyClassの内部クラスである場合、ProGuardは完全修飾名com.mypackage.MyClass$MyJavaScriptInterfaceを予期します。 $の命名規則は、ProGuardが動作するコンパイル済みクラスファイルで使用されます。 ProGuardは、入力jarで見つからない構成内のクラス名に言及していることに注意してください。これは、これらの名前のつづりが間違っている可能性があることを示しています。

32
Eric Lafortune
    -keepclassmembers class com.mypackage.MyClass$JavaScriptInterface {    
public *;
     }

これだけを使用してください。わたしにはできる。

4
Sangoku

パッケージパス全体を提供するのが面倒な人。

-keepclassmembers class **.*$PaymentJavaScriptInterface{
public *;
}
2
Nantha kumar

問題の編集によって提案されたように、それらの提案のうち、

-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { public *; }

重要-

API 17以降で@JavascriptInterfaceアノテーションを保持する場合:

-keepattributes JavascriptInterface

(マシュマロで動作するように私のアプリを停止していました)

1
Darpan