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