【问题标题】:ProGuard: keep implementations for interface annotated with @KeepProGuard:保留使用 @Keep 注释的接口的实现
【发布时间】:2014-03-18 08:40:12
【问题描述】:

我想在我的应用程序中使用自定义@Keep 注释来注释一些接口并配置 ProGuard 以便

  • 不要混淆带注释的接口及其方法,
  • 在实现类时不会混淆这些接口方法的实现。

我尝试了类似的东西

# Kept interfaces and all their methods
-keep interface @com.foo.bar.annotation.Keep * {
    <methods>;
}

# Classes implementing kept interfaces
-keep class * implements @com.foo.bar.annotation.Keep *

但显然语法是无效的。我尝试了其他方法,但 ProGuard 文档及其示例并不清楚确切的语法以及在哪些情况下可能发生的情况。

【问题讨论】:

    标签: java interface annotations proguard


    【解决方案1】:

    很抱歉回答我自己的问题,但我只是在玩游戏时碰巧碰到了解决方案。实际上它比我想象的要简单得多:

    # Annotated interfaces (including methods which are also kept in implementing classes)
    -keep @com.foo.bar.annotation.Keep interface * {
        *;
    }
    

    显然在接口的keep 子句上指定&lt;methods&gt; 是错误的,可能是因为ProGuard 只过滤实际的方法实现,而不仅仅是接口声明中的方法声明。

    上面的语法似乎保留了完整的接口(类名、方法名)加上所有实现方法名,如果我考虑一下这是合乎逻辑的,因为如果我确实实现了一个接口,我就无法更改(混淆)方法名无论如何。

    【讨论】:

    • 您可以在 ProGuard 发行版的 examples/annotations/lib/annotations.pro 中找到一系列示例。这些规范旨在看起来像 Java,但带有通配符。请注意,通配符 也适用于接口。
    • 谢谢Eric,之前也有人这么说,但是因为没有直接解决问题,所以删除了他的回答。我已经看过那个资源了,尽管它并没有真正回答这个问题,但它给了我很多想法。我还注意到,真正的问题可能是我的语法错误interface @Keep 而不是@Keep interface,而不是&lt;method&gt; 的使用。
    【解决方案2】:

    这有助于我遇到类似的情况:

    Proguard stops Javascript in WebView from working

    我想原理是一样的……

    【讨论】:

    • 谢谢,但答案不适用于我的问题。我的问题不是带注释的方法,而是带注释的接口。
    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多