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

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

@Singleton
public class ImageCache

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

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

【问题讨论】:

    标签: android proguard 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 规则,了解如何创建自己的注解。
    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多