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。请注意,可能有更多此类错误混淆的实例。

  • 如何阻止 proguard 重命名此类接口实现?
  • 为什么首先要重命名该方法?

编辑:
这就是我指定我的库 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
  }
}

这就是proguard重命名该方法的原因。

于 2013-08-11T15:26:04.873 回答
1

ProGuard 不会重命名实现或覆盖库方法的程序方法——否则几乎没有任何已处理的应用程序可以工作。您应该仔细检查您的配置是否确实指定了正确的输入 jar 和库 jar。如果某些事情看起来不一致,ProGuard 可能已经打印出警告。

于 2013-08-11T23:01:23.477 回答