1

別のjarファイル(ライブラリjarとして渡される)からのインターフェースを実装する匿名クラスがあります。

//Some jar file
public interface B
{
  void methodA();
}

//My App
public class A implements B
{
  public void methodA()
  {
    //implementation here
  }
}

アプリでは次のように使用されます。

B var = new A();
var.methodA();

バグ (抽象メソッドの呼び出し) に遭遇した後、ProGuardの名前methodA()が classに変更されていることに気付きましたA。このような誤った難読化のインスタンスがさらにある可能性があることに注意してください。

  • プロガードがそのようなインターフェース実装の名前を変更しないようにするにはどうすればよいですか?
  • そもそもなぜメソッドの名前を変更しているのでしょうか?

編集:
これは、ライブラリ jar を指定する方法です。

<libraryjar filter="!**\some.specific.jar,${base.dir}\dist\lib\*.jar" />

も試しました:

<libraryjar jarfilter="!**\some.specific.jar" />
<libraryjar jarfilter="${base.dir}\dist\lib\*.jar" />

どちらも機能しませんでした。ProGuard は、フィルターで指定されたライブラリ jar を読み取りません。明示的に指定されたものだけを読み取ります。

4

2 に答える 2

1

クラスがインターフェイス B を実装し続けるには、proguard 構成ファイルに次のようなものを追加するだけです。

-keep class ** implements B {
    *;
}

ただし、クラス A が B を正しく実装していないことに気付きました。B を実装するための正しいコードは次のとおりです。

public class A implements B
{
  // note the public modifier
  public void methodA()
  {
    //implementation here
  }
}

そのため、プロガードはメソッドの名前を変更しました。

于 2013-08-11T15:26:04.873 に答える
1

ProGuard は、ライブラリ メソッドを実装またはオーバーライドするプログラム メソッドの名前を変更しません。それ以外の場合、処理されたアプリケーションはほとんど機能しません。構成で適切な入力 jar とライブラリ jar が実際に指定されていることを再確認する必要があります。何かが一貫していないように見える場合、ProGuard はすでに警告を出力している可能性があります。

于 2013-08-11T23:01:23.477 に答える