2013-09-29 2 views
1

я иметь два интерфейсаProguard держать переопределены методы внутри интерфейсов, которые расширяют другой интерфейс

public interface Base { 
    void methA(); 
    void methB(); 
    void methC(); 
} 

и

public interface Sub extends Base { 
    @MyAnnotation("a") 
    void methA(); 
    @MyAnnotation("b") 
    void methB(); 
    @MyAnnotation("c") 
    void methC(); 
    @MyAnnotation("d") 
    void methD(); 
    @MyAnnotation("e") 
    void methE(); 
} 

после того, как ProGuard у меня есть это два интерфейса

public interface a{ 
    void a(); 
    void b(); 
    void c(); 
} 

и

public interface b extends a{ 
    @MyAnnotation("d") 
    void d(); 
    @MyAnnotation("e") 
    void e(); 
} 

, но для второго я должен был бы

public interface b extends a{ 
    @MyAnnotation("a") 
    void a(); 
    @MyAnnotation("b") 
    void b(); 
    @MyAnnotation("c") 
    void c(); 
    @MyAnnotation("d") 
    void d(); 
    @MyAnnotation("e") 
    void e(); 
} 

, что означает, что мне нужно переопределить методы с аннотациями тир. Мне все равно, имена методов мне просто нужны аннотации.

я не могу установить аннотации для a, b и c в интерфейсе базы, как у меня есть 2 (может быть, позже более) Sub интерфейсов, которые устанавливают другие значения для @MyAnnotation

так, есть способ сказать proguard, чтобы сохранить дубликаты имен методов в подинтерфейсе?

ответ

1

Я нашел решение! :)

-keepclassmembers,allowobfuscation,allowoptimization interface * extends path.to.my.interface.Base{*;}

это более или менее отключает усадочные для любого интерфейса, который расширяет интерфейс Base.

0

Proguard имеет специальный флаг для отключения оптимизации. Общее обозначение:

-dontoptimize 

Это, однако, выключить все оптимизации, которые могут быть не желательно в вашем конкретном случае. Actualy вы можете выбрать оптимизации отключить путем явного указания фильтра оптимизации:

-dontoptimize optimization_filter_name 

Я не 100% уверен, которое может помочь, но я подозреваю, что class/merging/vertical фильтр отвечает за интерфейс дубликата удаления метода. Вы можете найти список оптимизации here и попробовать, который помогает.

+0

У меня есть '-оптимизации! Code/simplification/arithmetic,! Field/* ,! class/merging/*', которые уже должны отключить слияние? Оптимизация, которой предшествует восклицательный знак «!» исключается из дальнейших попыток сопоставления с последующими именами оптимизации в фильтре. – Dodge

+0

, даже когда я комментирую свою строку '-optimizations' и добавляю' -dontoptimize' методы были удалены :( – Dodge

+0

hmmm, это означает, что фактическая причина не является оптимизацией. Попробуйте отключить сжатие с помощью '-dontshrink' – Jk1

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