在 Proguard 中保留带注释的类

Posted

技术标签:

【中文标题】在 Proguard 中保留带注释的类【英文标题】:Keep annotated class in Proguard 【发布时间】:2012-07-22 06:14:49 【问题描述】:

我有一堆使用例如像这样的@Singleton 注释

@Singleton
public class ImageCache

我想保留。如何配置 proguard -keep 语句,使其适用于所有具有该注释的类。

顺便说一句,就上下文而言,我需要在 android 上使用 Roboguice 的应用程序,这就是我添加标签的原因。可能会帮助其他人。

【问题讨论】:

【参考方案1】:

ProGuard 基于带有通配符的类 java 配置。它确实需要完全限定的类名。这应该有效:

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

【讨论】:

这是一块金子。保留 jackson 1、jackson 2 和 gson 注释类非常有用。 ;) Eric,我认为 proguard 手册应该更明确地保留带注释的类、方法、字段等。 我还必须添加 keepclassmembers。但你提出了一个好主意,所以 +1 另外,如果您使用自定义注解,请确保 RetentionPolicy 为 CLASS 或 RUNTIME,否则 proguard 将无法找到它们。【参考方案2】:

先定义一个注解

public @interface DoNotStrip 

然后把这个放到proguard.cfg中:

-keep,allowobfuscation @interface com.something.DoNotStrip

# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.something.DoNotStrip class *
-keepclassmembers class * 
    @com.something.DoNotStrip *;

【讨论】:

嗨,对于那些发现此答案适用于他们的案例的人,有一个预定义的注释@androidx.annotation.Keep @Inliner Keep注解是指在minify过程中,如果未访问该类,则保持该类不被删除 @Didi 谢谢,确实是这样。与proguard规则相同。不同之处在于您使用它们时可用的调整数量。在下面的文章中,描述了何时使用它们中的每一个。 medium.com/androiddevelopers/… 您还可以查看 Android Studio 预定义的 proguard 规则,了解如何创建自己的注解。

以上是关于在 Proguard 中保留带注释的类的主要内容,如果未能解决你的问题,请参考以下文章

使用 proguard 保留特定注释

如果在proguard中包含带有注释的字段,如何保持类的成员不受影响

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

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

Proguard 导致 100 个“找不到引用的类”警告,忽略 springframework 和 jackson 的保留规则

Android之代码混淆