使用 proguard 保留特定注释
Posted
技术标签:
【中文标题】使用 proguard 保留特定注释【英文标题】:Keep specific Annotation with proguard 【发布时间】:2018-05-10 22:29:42 【问题描述】:我的项目中有两种类型的注解:Annotation1
和 Annotation2
。两者都是运行时注释。所以,我的问题是如何只保留Annotation1
并剥离Annotation2
?
例子:
class Test
@Annotation1
@Annotation2
String name;
我希望将Annotation2
从所有字段中删除,并将Annotation1
保留在任何地方。
我找不到这是否可能。我只知道如何使用以下方法保留所有注释:
-keepattributes *Annotation*
这可能吗?如果不是,为什么?
【问题讨论】:
【参考方案1】:如果相应的注解类没有在其他地方使用(检索、转换、调用...),ProGuard 会自动从类/字段/方法中删除注解。您不能强制 ProGuard 删除注释,但可以告诉它保留看似未使用的注释:
-keep @interface com.example.MyAnnotation
【讨论】:
这个问题不是关于保留注释类,而是关于将它们应用放在使用它们的地方。【参考方案2】:我一直在寻找相同的东西,但是在详细考虑了文档以及有关 Stack Overflow 的相关问题之后,我的结论是不支持。
在撰写本文时,only the following options related to annotations 可以传递给 -keepattributes
。对于运行时可见注解:
RuntimeVisibleAnnotations
:在类、字段和方法上保留所有注释
RuntimeVisibleParameterAnnotations
:在方法参数上保留所有注解
RuntimeVisibleTypeAnnotations
:在泛型类型、指令等上保留所有注释(不确定“.etc”在这里应该是什么意思)
runtime invisible 注释的匹配选择是:RuntimeInvisibleAnnotations
、RuntimeInvisibleParameterAnnotations
和 RuntimeInvisibleTypeAnnotations
。 I couldn't find any use case for retaining these.
最后AnnotationDefault
保留注释默认值。
在我看来,-keepattributes
(?
和 *
)的通配符选项弊大于利。它们很容易被误解(就像我最初所做的那样,and others do,您似乎也希望如此)作为指定特定注释的一种方式,但事实并非如此。
常见的-keepattributes *Annotation*
选项只是选择上面列出的所有选项。
【讨论】:
以上是关于使用 proguard 保留特定注释的主要内容,如果未能解决你的问题,请参考以下文章