2

proguardを使用したandroid 4.2以降の問題があります。

基本的に、私は次のような WebView で JavascriptInterface を使用します。

public class MyJavascriptInterface {
    public void doSomething() { ... }
}

今私が理解しているのは、プロガードがコードを難読化すると、クラス名とメソッド名の名前が変更されるため、Javascript から呼び出すことができなくなるということです。そのため、これを proguard 構成に追加する必要があります。

-keepclassmembers class mypackage.MyJavascriptInterface { 
    public void doSomething();
}

ターゲット SDK を 17 (Android 4.2) に設定すると@JavascriptInterface、セキュリティ上の理由から、Javascript インターフェイス メソッドに注釈を追加する必要があります。

@JavascriptInterface
public class MyJavascriptInterface {
    public void doSomething() { ... }
}

問題は、proguard が有効になっている場合、これが機能しなくなることです (難読化ステップでクラスの名前がまだ変更されているかのように、doSomething は呼び出されません)。プロガードを無効にすると、コードは正常に動作します。

これをターゲット SDK 17 で機能させるにはどうすればよいですか?

4

3 に答える 3

9

解決策を見つけました。プロガードに注釈を保持するように指示するだけJavascriptInterfaceです。これをproguard構成に追加して、機能させました:

-keepattributes JavascriptInterface
于 2012-11-30T16:27:48.433 に答える
3

生成された mapping.txt と dump.txt ファイルを見て、多くの試行錯誤 (これを理解するために 34 個の APK ファイルをコンパイルしました) を通じて、次の実用的なソリューションを思いつきました。

-keep public class com.yourfullpackagename.Yourapp$JavaScriptInterface
-keepclassmembers class com.yourfullpackagename.Yourapp$JavaScriptInterface {*;}
-keepattributes com.yourfullpackagename.Yourapp$JavaScriptInterface
-keepattributes *Annotation*

(これは、JavaScriptInterface が com.yourfullpackagename 名前空間の Yourapp というアクティビティの内部クラスであることを前提としています。アプリに応じて調整してください。)

于 2013-12-30T00:03:33.610 に答える
3

注釈を保持するには、ProGuard 構成に以下を追加する必要があります。

-keepattributes *Annotation*

クラス ファイルは、値が「android.webkit.JavascriptInterface」の「RuntimeAnnotation」タイプのクラス属性として JavascriptInterface アノテーションを表します。

于 2012-12-01T22:51:16.293 に答える