6

proguardで難読化した後の私のプロジェクトは、javascriptinterfaceで失敗します

これがプロガード構成のいくつかの提案へのリンクですが、私の場合は機能しません

http://groups.google.com/group/android-developers/browse_thread/thread/f889e846fbf7ec3f?pli=1

したがって、Javascriptからの呼び出しは、関連するJavaメソッドへのバインドを緩めます

それに関する私のプロガード構成

-keep public class com.trans_code.android.JavascriptCallback 
-keep public class * implements com.trans_code.android.JavascriptCallback 
-keepclassmembers class * implements com.trans_code.android.JavascriptCallback { 
    <methods>; 
} 
-keepclassmembers class * implements JavascriptCallback { 
    void on*(***);
} 
-keep public class com.trans_code.** {
  public protected *;
}

-keepclasseswithmembernames class com.MyActivity$JavascriptInterface

-keepclasseswithmembernames class com.MyActivity$JavascriptInterface {
    public protected *;
}

誰かがproguardを構成して、私に大いに役立つ関連するメソッドとクラスを除外する方法を知っている場合

4

4 に答える 4

8

元のスレッドのクラス名は、そのユーザーの Java クラスに固有のものであり、すべての JavaScript インターフェースに共通するものではありません。実装する JavaScript インターフェースは単純な基本クラスです。

インターフェイス クラスの名前と一致するように変更する必要があります。

たとえば、元のスレッドの例に基づく、サンプル コード WebViewDemo の正しい構成は次のようになります。

-keep public class com.google.android.webviewdemo.WebViewDemo.DemoJavaScriptInterface
-keep public class * implements com.google.android.webviewdemo.WebViewDemo.DemoJavaScriptInterface 
-keepclassmembers class * implements com.google.android.webviewdemo.WebViewDemo.DemoJavaScriptInterface { 
    <methods>; 
} 

バインディングが機能する方法により、実際に行う必要があるのは、javascript から呼び出される内部メソッドの名前が難読化されないようにすることですが、クラス名が難読化されないようにすることは問題ありません。

于 2011-03-18T20:31:02.207 に答える
2

私のプロジェクトでは、javascript インターフェイスは内部クラスです。したがって、現在の答えは私にはうまくいきません。$クラス間で使用する必要があります。インターフェースが内部クラスの場合は、このコードを使用してください

-keep public class com.myapp.MyActivity$MyJavaScriptInterface
-keepclassmembers class com.myapp.MyActivity$MyJavaScriptInterface {
   public *;
}
-keep public class * implements com.myapp.MyActivity$MyJavaScriptInterface

API17+ の場合、次の行を追加します。そうしないと、コードは Android 4.2 以降では機能しません

-keepattributes JavascriptInterface

同様の質問:
Android Proguard Javascript Interface Fail
Javascript interface not working with android 4.2

于 2013-12-07T20:16:27.923 に答える
1

私はこの問題を解決しました:

-keep public class com.myapp.JavaScriptInterface 
-keepclassmembers class com.myapp.JavaScriptInterface { 
    <fields>;
    <methods>;
}

JavaScriptInterface は私のアプリのクラス (インターフェースではない) です。そのため、この部分は使用しませんでした:

* implements.

于 2012-08-23T17:48:21.507 に答える