注释对proguard没有影响

时间:2013-07-02 04:19:29

标签: java android proguard

我在根据他们的注释(在Android下)保存内容时遇到了麻烦。

我有一个注释,com.example.Keep:

@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR })
public @interface Keep {
}

我有一个类,它只能通过反射构建:

public class Bar extends Foo {
    @com.example.Keep
    Bar(String a, String b) { super(a, b); }

    //...
}

它按预期工作(类保留其构造函数,尽管有一个模糊的类名)当我的proguard配置包含以下内容时:

-keepattributes Signature,*Annotation*,SourceFile,LineNumberTable
-keepclassmembers class ** extends com.example.Bar {
<init>(...);
}

如果我尝试将其更改为:

,则删除构造函数
-keepattributes Signature,*Annotation*,SourceFile,LineNumberTable
-keepclassmembers class ** extends com.example.Bar {
@com.example.Keep <init>(...);
}

我在自己的注释和proguard的annotation.jar注释中看到了相同的行为。我已经复制并粘贴了Foo导入Keep的注释名称,因此我相信这不是输入错误或导入错误。

有人能想到我可能缺少的东西吗?

1 个答案:

答案 0 :(得分:6)

如果您的注释正在作为程序代码处理,则应明确保留它们:

-keep,allowobfuscation @interface *

原因有点技术性:ProGuard可能会在缩小步骤中移除它们,因此它们在优化步骤和混淆步骤中不再有效。

(CFR)。 ProGuard手册&gt;疑难解答&gt; Classes or class members not being kept