Proguard keepclassmembers держит класс - PullRequest
2 голосов
/ 17 марта 2012

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

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

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

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

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

-keepclassmembers [, модификатор, ...] спецификация класса

Определяет члены класса, которые должны быть сохранены, если их классы также сохраняются. Например, вы можете оставить все поля сериализации и методы классов, которые реализуют интерфейс 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 уже хранит по другим правилам?

1 Ответ

3 голосов
/ 18 марта 2012

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

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

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

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

...