ProGuard避免混淆接口实现

时间:2013-08-11 13:49:18

标签: java obfuscation proguard

我有一个匿名类,它实现了另一个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()中重命名为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。它只读取明确命名的那些。

2 个答案:

答案 0 :(得分: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重命名了这个方法。

答案 1 :(得分:1)

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