Proguard 将重写的方法保留在扩展另一个接口的接口内



>我有两个接口

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 接口中为 abc 设置注释,因为我有 2 个(以后可能更多)子接口为@MyAnnotation设置其他值

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

我找到了解决方案! :)

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

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

Proguard 有一个专用标志来禁用优化。一般表示法是:

-dontoptimize

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

-dontoptimize optimization_filter_name

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

最新更新