使用 proguard 保留特定注释

Posted

技术标签:

【中文标题】使用 proguard 保留特定注释【英文标题】:Keep specific Annotation with proguard 【发布时间】:2018-05-10 22:29:42 【问题描述】:

我的项目中有两种类型的注解:Annotation1Annotation2。两者都是运行时注释。所以,我的问题是如何只保留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 注释的匹配选择是:RuntimeInvisibleAnnotationsRuntimeInvisibleParameterAnnotationsRuntimeInvisibleTypeAnnotations。 I couldn't find any use case for retaining these.

最后AnnotationDefault 保留注释默认值。

在我看来,-keepattributes?*)的通配符选项弊大于利。它们很容易被误解(就像我最初所做的那样,and others do,您似乎也希望如此)作为指定特定注释的一种方式,但事实并非如此。

常见的-keepattributes *Annotation* 选项只是选择上面列出的所有选项。

【讨论】:

以上是关于使用 proguard 保留特定注释的主要内容,如果未能解决你的问题,请参考以下文章

使用 ProGuard 混淆时暴露内部类

在 Proguard 中保留带注释的类

ProGuard混淆时保留注释(@类内容)

如何告诉 proguard 保留枚举常量和字段

使用 ProGuard 混淆私有字段

为啥 proguard 不混淆方法体?