如何保持 class 实现带注解的接口

How to keep class which implement an interface with annotation

我定义了一个名为 @KeepAll 的注解。

我有这样的界面

@KeepAll
public interface MainEntity {
    //some methods
}

我想避免混淆所有实现此接口的 类。这在 ProGuard 上可行吗?

注意 我知道我可以将其定义为

-keep public class * implements **.MainEntity 

但我不想指定接口名称,而是指定注解名称。

您可以告诉 ProGuard 使用如下注释保留所有内容:

-keep @com.google.inject.Singleton public interface *

以上将防止界面本身混淆。

要获取接口的实现,您可以这样做:

-keep public class * implements **.MainEntity 

所以现在我很困惑你想要实现什么。如果你只注释界面,它不会对 ProGuard 有帮助。 类 需要这个注解。

经过长时间的反复试验,我得到了我想要的。这是解决方案

保留 class 个带有注释 KeepAll 的名称;

-keep @com.package.name.KeepAll public class **

保留 class 的 class 成员并与注解 KeepAll 交互;

-keepclassmembers @com.package.name.KeepAll class ** { public <methods>; <fields>;}

保留 class 的 class 成员,它实现了具有 KeepAll 注释的 class。 (这就是我想要的)

-keepclassmembers public class * implements @com.package.name.KeepAll ** { public <methods>; <fields>;}