2012-03-17 1 views
2

Извините, если я пропустил ответ, который бы покрыл это, но я старался найти что-то подобное.Proguard keepclassmembers сохраняет класс

Я действительно смущен поведением Проврага, и мне интересно, не читаю ли я документы или неправильно.

Я хочу сохранить аннотированные поля и элементы в классе, если этот класс сохранен. Поэтому я использовал keepclassmembers как так:

-keepclassmembers class com.mycompany.** { 
    @com.mycompany.** 
    public com.mycompany.** *; 
    @com.mycompany.** 
    public void *(com.mycompany.**); 
} 

(. Эта конфигурация была построена GUI, но я думаю, что я вижу, что он делает) В Proguard документы говорят

-keepclassmembers [модификатор, ...] class_specification

Определяет класс, который необходимо сохранить, если их классы также сохранены. Например, вы можете сохранить все поля сериализации и методы классов, реализующих интерфейс Serializable.

Звучит хорошо. Но я получаю классы, которых я не ожидаю в выходе, просто потому, что у них есть @annotated прослушиватели. -whyareyoukeeping class com.company.MyServiceImpl?

com.mycompany.MyServiceImpl 
    is invoked by com.mycompany.MyServiceImpl: void handleEvent(com.mycompany.MyEvent) (34:35) 
    is kept by a directive in the configuration. 

handleEvent просто вызывает другой метод в MyServiceImpl, так это, кажется, не является достаточным основанием, чтобы держать весь класс, но это только кажется, что я могу думать.

Почему keepclassmembers, кажется, вынуждают keep на любой класс, содержащий указанный член, а не только «если их классы также сохранены»? Но более непосредственно, как я могу публиковать слушателей аннотированных событий в классах, которые Proguard уже поддерживает с помощью других правил?

+0

Я закончил с чем-то работоспособным следующим образом. -keepclassmembers, allowobfuscation class com.ycompany. ** {@ com.mycompany. ** ; } -keepclassmembers, позволяет использовать, разрешать, разрешать класс класса com.yompany. ** {@ com.mycompany. ** ; } Я думаю, что модификаторы «разрешить» были волшебным соусом, но эта комбинация озадачивает - кажется, что она отменяет всю директиву. Надеюсь, это даст кому-то некоторые идеи в будущем, которые могут спасти их пару часов. – Justin

ответ

3

Ваша первоначальная конфигурация и интерпретация его выглядят правильно. Он также работает, если я попробую это на простом примере: аннотированные поля и методы сохраняются, если их классы уже сохранены. Конечно, эти аннотированные методы могут содержать код, который тянет больше классов.

Выход из -whyareyoukeeping только рассказывает половину истории и не очень полезен в этом случае. Вы можете проверить, содержит ли какие-либо подсказки -printseeds.

Работоспособная конфигурация с модификаторами 'allow', похоже, не имеет особого смысла; Я бы не слишком доверял ему.

Если вы все еще думаете, что есть ошибка, вы можете сообщить об этом в ProGuard bug tracker, предпочтительно с примером, который позволяет мне воспроизвести проблему.

+0

«Рабочая» конфигурация, которую я опубликовал как комментарий, в итоге привела к другим проблемам. Я ценю проверку здравомыслия. В конце концов я просто отступил на этапе оптимизации. У меня будет возможность вернуться к этому позже, и я обязательно сообщу все, где есть здравый рецепт репродукции. – Justin