1

我有两个接口

public interface Base {
   void methA();
   void methB();
   void methC();
}

public interface Sub extends Base {
   @MyAnnotation("a")
   void methA();
   @MyAnnotation("b")
   void methB();
   @MyAnnotation("c")
   void methC();
   @MyAnnotation("d")
   void methD();
   @MyAnnotation("e")
   void methE();
}

在proguard之后我有这两个接口

public interface a{
   void a();
   void b();
   void c();
}

public interface b extends a{
   @MyAnnotation("d")
   void d();
   @MyAnnotation("e")
   void e();
}

但对于第二个我需要

public interface b extends a{
   @MyAnnotation("a")
   void a();
   @MyAnnotation("b")
   void b();
   @MyAnnotation("c")
   void c();
   @MyAnnotation("d")
   void d();
   @MyAnnotation("e")
   void e();
}

这意味着,我需要带有注释的覆盖方法。我不在乎方法名称,我只需要注释。

我不能在 Base 接口中为和设置注释a,因为我有 2 个(可能稍后更多)设置其他值的子接口bc@MyAnnotation

那么,有没有办法告诉 proguard 在子接口中保留重复的方法名称?

4

2 回答 2

1

我找到了解决方案!:)

-keepclassmembers,allowobfuscation,allowoptimization interface * extends path.to.my.interface.Base{*;}

这或多或少会禁用扩展Base接口的任何接口的收缩。

于 2013-09-29T12:37:51.887 回答
0

Proguard 有一个专用标志来禁用优化。一般记号为:

-dontoptimize

但是,它将关闭所有优化,这在您的特定情况下可能是不可取的。实际上,您可以通过显式声明优化过滤器来选择要禁用的优化:

-dontoptimize optimization_filter_name

我不是 100% 确定哪一个可以在这里提供帮助,但我怀疑class/merging/vertical过滤器负责接口重复方法的删除。您可以在此处找到优化列表并尝试哪一个有帮助。

于 2013-09-29T11:16:46.683 回答