【问题标题】:Keep selected Annotations with proguard使用 proguard 保留选定的注释
【发布时间】:2018-12-04 16:03:24
【问题描述】:

是否可以使用 Proguard 保留选定的注释?

例如,我想从

中删除所有注释
javax.xml.bind.annotation.*

但要远离

org.mycompany.annotations.MyAnnotation

我试图告诉 Proguard 保留如下注释,但根本不起作用。

-keep @interface org.mycompany.annotations.MyAnnotation

或者我应该保留属性注释,然后以某种方式删除其余不需要的注释?

【问题讨论】:

  • 只是好奇你想通过删除注释来实现什么,代码可能在运行时不起作用。我错过了什么吗?
  • 这很简单。例如,您有一个注释 MyModelClass 供实例反射使用。你需要这个,但你不需要来自 jaxb 的一些注释。

标签: proguard


【解决方案1】:

不确定我是否完全理解,一般我们通过使用保留所有注释

-keepattributes *Annotation*,

如果您将其从 -keepAttributes 列表中删除,您也会丢失其他注释,并且代码可能无法正常工作。

理想情况下,我将使用应用注解的类,而不是注解本身,例如,如果您有应用在 MyService 类上的注解 MyModelClass

 @ MyModelClass
    public class MyService {
    }

我不希望 MyService 类发生任何事情,然后我会使用

-keep @MyModelClass class * {
    <methods>;
    <fields>;
}

正如您提到的,您不需要一些 jaxb 注释,我假设它们是编译时注释。

如果您想删除所有编译时注释并保留运行时注释,您应该使用-keepattributes RuntimeVisibleAnnotations

【讨论】:

  • 可能是错误的例子。我的两个注释都是运行时并且注释了相同的类。
  • 那你想要什么?我猜你不希望在 proguard 优化代码时删除注释,或者你希望在应用这些注释的地方保持这些类不变。
  • 看这里stackoverflow.com/questions/47515093/…我要保留类和Annotation1。因此,作为输出,我想让类仅由 Annotation1 注释,即使两者都是运行时。现在清楚了吗?
  • 感谢您的链接,即使我记得我几乎忘记了那里的几个 cmets。很抱歉,但我被困在同一点上,如果您不需要运行时注释,为什么不首先将其从代码中删除,而不是依赖 proguard。还是有什么我想念的东西
猜你喜欢
  • 2018-05-10
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多