2013-07-02 3 views
0

У меня проблемы с получением proguard для сохранения вещей на основе их аннотаций (под Android).аннотации, не имеющие эффекта в proguard

У меня есть аннотацию, 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>(...); 
} 

я вижу такое же поведение с обеих моих аннотаций и annotation.jar аннотации Proguard в. Я скопировал и вставил имя аннотации из импорта Foo Keep, так что уверен, что это не опечатка или неправильный импорт.

Может ли кто-нибудь подумать о том, что мне может не хватать?

ответ

4

Если ваши аннотации обрабатываются в программном коде, вы должны явно сохранить их:

-keep,allowobfuscation @interface * 

Причиной, побуждающей не несколько технический: ProGuard может удалить их на стадии усадки, поэтому они больше не эффективны в шаг оптимизации и этап обфускации.

Cfr. Руководство ProGuard> Поиск и устранение неисправностей>Classes or class members not being kept.

Смежные вопросы